Ai
1 Star 0 Fork 0

sevpinna/ModbusTCP

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
ModbusTCP.go 2.14 KB
一键复制 编辑 原始数据 按行查看 历史
package ModbusTCP
import (
"encoding/json"
"log"
"net"
"time"
)
type protocol struct {
IP string `json:"IP"`
ID int `json:"ID"`
Register string `json:"Register"`
Addr int `json:"Addr"`
Swap bool `json:"Swap"`
Bit int `json:"Bit"`
}
type writedata struct {
id int
value interface{}
}
type tag struct {
TagID int
Type string
Swap bool
Bit int
Read []byte
Write []byte
Value interface{}
}
var tagslist map[string][]tag
var chanlist map[string]chan writedata
var callback func(ID int, Data interface{}, Time int64)
func AddTag(ID int, Type string, Protocol string) (err error) {
var p protocol
var t tag
err = json.Unmarshal([]byte(Protocol), &p)
if err != nil {
return err
}
t.TagID = ID
t.Type = Type
t.Swap = p.Swap
t.Bit = p.Bit
t.Read = p.getRead(Type)
t.Write = p.getWrite(Type)
v, ok := tagslist[p.IP]
if !ok {
tagslist[p.IP] = []tag{t}
chanlist[p.IP] = make(chan writedata)
} else {
v = append(v, t)
tagslist[p.IP] = v
}
return
}
func Write(ID int, Value interface{}) {
for i, v := range tagslist {
for _, v2 := range v {
if v2.TagID == ID {
chanlist[i] <- writedata{
id: ID,
value: Value,
}
goto End
}
}
}
End:
}
func Start(f func(ID int, Data interface{}, Time int64)) {
callback = f
for i, v := range tagslist {
go link(i, v, chanlist[i])
}
}
func link(ip string, tags []tag, w chan writedata) {
C := time.Tick(1000 * time.Millisecond)
for {
conn, err := net.Dial("tcp", ip)
if err == nil {
log.Print("Conn success")
defer func() {
_ = conn.Close()
conn = nil
}()
run(conn, tags, w)
}
<-C
}
}
func run(conn net.Conn, tags []tag, w chan writedata) {
var err error
C := time.Tick(1000 * time.Millisecond)
for {
select {
case t := <-w:
for i, v := range tags {
if v.TagID == t.id {
err := tags[i].write(conn, t.value)
if err != nil {
goto End
}
break
}
}
case <-C:
for i := range tags {
err = tags[i].read(conn)
if err != nil {
goto End
}
}
}
}
End:
}
func init() {
tagslist = make(map[string][]tag)
chanlist = make(map[string]chan writedata)
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/sevpinna/ModbusTCP.git
git@gitee.com:sevpinna/ModbusTCP.git
sevpinna
ModbusTCP
ModbusTCP
4f27695a97cd

搜索帮助