From 560985f421189fde3963b8c5af7d7ee1312f125b Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期六, 16 九月 2023 14:32:25 +0800
Subject: [PATCH] 换另外一个modbus库
---
service/plc.go | 54 ++++++++++--------
pkg/plc/plc4x.go | 16 +---
go.sum | 4 +
pkg/plc/modbusx/modbus.go | 35 +++++++++++
conf/apsClient.json | 4
go.mod | 2
pkg/plc/modbusx/connection_manager.go | 55 ++++++++++++++++++
7 files changed, 133 insertions(+), 37 deletions(-)
diff --git a/conf/apsClient.json b/conf/apsClient.json
index b1188f5..35472df 100644
--- a/conf/apsClient.json
+++ b/conf/apsClient.json
@@ -29,8 +29,8 @@
"nsqlookupdAddr":""
},
"plc": {
- "finishNumberTimeInterval": 100,
- "totalNumberTimeInterval": 1000
+ "finishNumberTimeInterval": 0,
+ "totalNumberTimeInterval": 0
}
}
diff --git a/go.mod b/go.mod
index 1cd151b..28e69f0 100644
--- a/go.mod
+++ b/go.mod
@@ -54,6 +54,8 @@
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.14.0 // indirect
github.com/go-sql-driver/mysql v1.7.0 // indirect
+ github.com/goburrow/modbus v0.1.0 // indirect
+ github.com/goburrow/serial v0.1.0 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
diff --git a/go.sum b/go.sum
index e9b182b..9507940 100644
--- a/go.sum
+++ b/go.sum
@@ -170,6 +170,10 @@
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
+github.com/goburrow/modbus v0.1.0 h1:DejRZY73nEM6+bt5JSP6IsFolJ9dVcqxsYbpLbeW/ro=
+github.com/goburrow/modbus v0.1.0/go.mod h1:Kx552D5rLIS8E7TyUwQ/UdHEqvX5T8tyiGBTlzMcZBg=
+github.com/goburrow/serial v0.1.0 h1:v2T1SQa/dlUqQiYIT8+Cu7YolfqAi3K96UmhwYyuSrA=
+github.com/goburrow/serial v0.1.0/go.mod h1:sAiqG0nRVswsm1C97xsttiYCzSLBmUZ/VSlVLZJ8haA=
github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA=
github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
diff --git a/pkg/plc/modbusx/connection_manager.go b/pkg/plc/modbusx/connection_manager.go
new file mode 100644
index 0000000..898968f
--- /dev/null
+++ b/pkg/plc/modbusx/connection_manager.go
@@ -0,0 +1,55 @@
+package modbusx
+
+import (
+ "github.com/goburrow/modbus"
+ "sync"
+ "time"
+)
+
+type ConnectionManager struct {
+ connections map[string]modbus.Client
+ mu sync.Mutex
+}
+
+func newPlcConnectionManager() *ConnectionManager {
+ return &ConnectionManager{
+ connections: make(map[string]modbus.Client),
+ }
+}
+
+func (cm *ConnectionManager) GetConnection(address string) (modbus.Client, bool) {
+ cm.mu.Lock()
+ defer cm.mu.Unlock()
+
+ conn, ok := cm.connections[address]
+ if !ok {
+ return nil, false
+ }
+ return conn, true
+}
+
+var connectionManager = newPlcConnectionManager()
+
+func (cm *ConnectionManager) AddConnection(address string, connection modbus.Client) {
+ cm.mu.Lock()
+ defer cm.mu.Unlock()
+
+ cm.connections[address] = connection
+}
+
+func (cm *ConnectionManager) CheckConnect(conn modbus.Client, timeout time.Duration) (bool, error) {
+ return true, nil
+}
+
+func getModbusConnection(ipAddr string) modbus.Client {
+ if conn, ok := connectionManager.GetConnection(ipAddr); ok {
+ return conn
+ }
+ conn := newGetModbusConnection(ipAddr)
+ connectionManager.AddConnection(ipAddr, conn)
+ return conn
+}
+
+func newGetModbusConnection(ipAddr string) modbus.Client {
+ return modbus.TCPClient(ipAddr)
+}
diff --git a/pkg/plc/modbusx/modbus.go b/pkg/plc/modbusx/modbus.go
new file mode 100644
index 0000000..a2941a6
--- /dev/null
+++ b/pkg/plc/modbusx/modbus.go
@@ -0,0 +1,35 @@
+package modbusx
+
+import (
+ "encoding/json"
+)
+
+func Read(ipAddr string, address uint16, quantity uint16) (data []byte, err error) {
+ cli := getModbusConnection(ipAddr)
+ data, err = cli.ReadHoldingRegisters(address, quantity)
+ return
+}
+
+func Write(ipAddr string, address uint16, value interface{}) (err error) {
+ bytesVal, err := json.Marshal(value)
+ if err != nil {
+ return err
+ }
+ cli := getModbusConnection(ipAddr)
+ _, err = cli.WriteMultipleRegisters(address, uint16(len(bytesVal)), bytesVal)
+ if err != nil {
+ return err
+ }
+ //time.Sleep(time.Second)
+ //// 鏍¢獙鍐欏叆鐨勬暟鎹�
+ //result, err := cli.ReadHoldingRegisters(address, uint16(len(bytesVal)))
+ //if err != nil {
+ // return err
+ //}
+ //resultVal := int(binary.BigEndian.Uint16(result))
+ //valueInt := cast.ToInt(value)
+ //if resultVal != valueInt {
+ // return errors.New("write result not equal read result")
+ //}
+ return nil
+}
diff --git a/pkg/plc/plc4x.go b/pkg/plc/plc4x.go
index 041a172..68562a6 100644
--- a/pkg/plc/plc4x.go
+++ b/pkg/plc/plc4x.go
@@ -33,15 +33,11 @@
if !ok {
return nil, false
}
- connOK, err := cm.CheckConnect(conn, time.Second*1)
- if err != nil {
- logx.Errorf("check plc conn err: %v", err.Error())
- return nil, false
- }
- if connOK {
- return conn, true
- }
- return nil, false
+ //if ok, _ := cm.CheckConnect(conn, time.Second); !ok {
+ // conn.Close()
+ //}
+
+ return conn, true
}
var connectionManager = newPlcConnectionManager()
@@ -70,7 +66,6 @@
func GetModbusConnection(ipAddr string) (plc4go.PlcConnection, error) {
if conn, ok := connectionManager.GetConnection(ipAddr); ok {
- time.Sleep(time.Second * 1)
return conn, nil
}
// 鍒涘缓涓�涓笂涓嬫枃锛屽苟璁剧疆 3 绉掕秴鏃�
@@ -82,7 +77,6 @@
return nil, err
}
connectionManager.AddConnection(ipAddr, conn)
- time.Sleep(time.Second * 1)
return conn, nil
}
diff --git a/service/plc.go b/service/plc.go
index 48292b2..aaa58f2 100644
--- a/service/plc.go
+++ b/service/plc.go
@@ -6,6 +6,7 @@
"apsClient/model"
"apsClient/pkg/logx"
"apsClient/pkg/plc"
+ "apsClient/pkg/plc/modbusx"
"apsClient/pkg/plccom"
"encoding/binary"
"errors"
@@ -85,20 +86,21 @@
if plcConfig.Method == constvar.PlcMethodModbusTCP {
ipAddr = fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port)
- conn, err := plc.GetModbusConnection(ipAddr)
- if err != nil {
- logx.Errorf("plc write failed, 杩炴帴plc澶辫触: %v", err.Error())
- plcConfig.CurrentErr = err
- return PlcWrite(plcConfig, fieldType, position, value)
- }
-
- result, err := plc.WriteHoldingRegister(conn, startAddress, value)
+ //conn, err := plc.GetModbusConnection(ipAddr)
+ //if err != nil {
+ // logx.Errorf("plc write failed, 杩炴帴plc澶辫触: %v", err.Error())
+ // plcConfig.CurrentErr = err
+ // return PlcWrite(plcConfig, fieldType, position, value)
+ //}
+ //
+ //result, err := plc.WriteHoldingRegister(conn, startAddress, value)
+ err = modbusx.Write(ipAddr, uint16(startAddress), value)
if err != nil {
logx.Errorf("plc write failed, address: %v, value: %v, err: %v", startAddress, value, err.Error())
plcConfig.CurrentErr = err
return PlcWrite(plcConfig, fieldType, position, value)
}
- logx.Infof("plc write ok, address: %v, value: %v, result: %v", startAddress, value, result)
+ logx.Infof("plc write ok, address: %v, value: %v", startAddress, value)
} else if plcConfig.Method == constvar.PlcMethodSerial {
ipAddr = conf.Conf.Services.Serial
if ipAddr == "" {
@@ -116,24 +118,27 @@
)
if plcConfig.CurrentTryTimes > plcConfig.MaxTryTimes {
+ logx.Errorf("plc write try time beyond max try times, err: %v", plcConfig.CurrentErr)
return plcConfig.CurrentErr
}
plcConfig.CurrentTryTimes++
if plcConfig.Method == constvar.PlcMethodModbusTCP {
ipAddr = fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port)
- conn, err := plc.GetModbusConnection(ipAddr)
- if err != nil {
- logx.Errorf("plc write failed, 杩炴帴plc澶辫触: %v", err.Error())
- plcConfig.CurrentErr = err
- return PlcWriteDirect(plcConfig, address, value)
- }
- result, err := plc.WriteHoldingRegister(conn, address, value)
+ //conn, err := plc.GetModbusConnection(ipAddr)
+ //if err != nil {
+ // logx.Errorf("plc write failed, 杩炴帴plc澶辫触: %v", err.Error())
+ // plcConfig.CurrentErr = err
+ // return PlcWriteDirect(plcConfig, address, value)
+ //}
+ //result, err := plc.WriteHoldingRegister(conn, address, value)
+
+ err = modbusx.Write(ipAddr, uint16(address), value)
if err != nil {
logx.Errorf("plc write failed, address: %v, value: %v, err: %v", address, value, err.Error())
plcConfig.CurrentErr = err
return PlcWriteDirect(plcConfig, address, value)
}
- logx.Infof("plc write ok, address: %v, value: %v, result: %v", address, value, result)
+ logx.Infof("plc write ok, address: %v, value: %v", address, value)
} else if plcConfig.Method == constvar.PlcMethodSerial {
ipAddr = conf.Conf.Services.Serial
if ipAddr == "" {
@@ -151,18 +156,19 @@
)
if plcConfig.CurrentTryTimes > plcConfig.MaxTryTimes {
- logx.Errorf("plc read try time beyond max try times, err:%v", plcConfig.CurrentErr)
+ logx.Errorf("plc read try time beyond max try times, err: %v", plcConfig.CurrentErr)
return nil, plcConfig.CurrentErr
}
plcConfig.CurrentTryTimes++
if plcConfig.Method == constvar.PlcMethodModbusTCP {
ipAddr = fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port)
- conn, err := plc.GetModbusConnection(ipAddr)
- if err != nil {
- plcConfig.CurrentErr = err
- return PlcReadDirect(plcConfig, address, dataLength, valueType)
- }
- value, err := plc.ReadHoldingRegister(conn, address, dataLength)
+ //conn, err := plc.GetModbusConnection(ipAddr)
+ //if err != nil {
+ // plcConfig.CurrentErr = err
+ // return PlcReadDirect(plcConfig, address, dataLength, valueType)
+ //}
+ //value, err := plc.ReadHoldingRegister(conn, address, dataLength)
+ value, err := modbusx.Read(ipAddr, uint16(address), uint16(dataLength))
if err != nil {
plcConfig.CurrentErr = err
return PlcReadDirect(plcConfig, address, dataLength, valueType)
--
Gitblit v1.8.0