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