From 48ef530180aeec4f91517e2b86ef75745c28241c Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期五, 25 八月 2023 18:00:31 +0800 Subject: [PATCH] plc连接加入连接池并设置连接超时为5秒 --- service/plc.go | 6 +-- pkg/plc/plc4x.go | 46 +++++++++++++++++++++-- datafile/plc_address_value | 3 - api/v1/task.go | 6 +-- datafile/plc_address_key | 3 - 5 files changed, 46 insertions(+), 18 deletions(-) diff --git a/api/v1/task.go b/api/v1/task.go index 23ae0a2..d545b26 100644 --- a/api/v1/task.go +++ b/api/v1/task.go @@ -265,11 +265,10 @@ if code != ecode.OK { return errors.New("璇峰厛閰嶇疆PLC") } - conn, err := plc.NewModbusConnection(fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port)) + conn, err := plc.GetModbusConnection(fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port)) if err != nil { return errors.New(fmt.Sprintf("杩炴帴plc澶辫触: %v", err.Error())) } - defer conn.Close() logx.Info("----------------寮�濮嬩笅鍙戝伐鑹哄弬鏁�-----------------") for k, v := range paramsMap { @@ -297,11 +296,10 @@ if code != ecode.OK { return errors.New("璇峰厛閰嶇疆PLC") } - conn, err := plc.NewModbusConnection(fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port)) + conn, err := plc.GetModbusConnection(fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port)) if err != nil { return errors.New(fmt.Sprintf("杩炴帴plc澶辫触: %v", err.Error())) } - defer conn.Close() logx.Info("----------------寮�濮嬩笅鍙戝伐鑹哄弬鏁�-----------------") var missNumbers int diff --git a/datafile/plc_address_key b/datafile/plc_address_key index 83130ac..e69de29 100644 --- a/datafile/plc_address_key +++ b/datafile/plc_address_key @@ -1,3 +0,0 @@ -鍘嬪己 -鏃堕棿 -娓╁害 \ No newline at end of file diff --git a/datafile/plc_address_value b/datafile/plc_address_value index 3a9e4ec..e69de29 100644 --- a/datafile/plc_address_value +++ b/datafile/plc_address_value @@ -1,3 +0,0 @@ -1000 -1001 -1002 \ No newline at end of file diff --git a/pkg/plc/plc4x.go b/pkg/plc/plc4x.go index 3e6c4a6..e269e58 100644 --- a/pkg/plc/plc4x.go +++ b/pkg/plc/plc4x.go @@ -4,16 +4,52 @@ "errors" "fmt" apiModel "github.com/apache/plc4x/plc4go/pkg/api/model" + "github.com/apache/plc4x/plc4go/spi/options" + "sync" + "time" plc4go "github.com/apache/plc4x/plc4go/pkg/api" "github.com/apache/plc4x/plc4go/pkg/api/drivers" "github.com/apache/plc4x/plc4go/pkg/api/transports" ) -func NewModbusConnection(ipAddr string) (plc4go.PlcConnection, error) { - // 鍒涘缓椹卞姩绠$悊鍣� - driverManager := plc4go.NewPlcDriverManager() +type ConnectionManager struct { + connections map[string]plc4go.PlcConnection + mu sync.Mutex +} +func NewPlcConnectionManager() *ConnectionManager { + return &ConnectionManager{ + connections: make(map[string]plc4go.PlcConnection), + } +} + +func (cm *ConnectionManager) GetConnection(address string) (plc4go.PlcConnection, bool) { + cm.mu.Lock() + defer cm.mu.Unlock() + + conn, ok := cm.connections[address] + return conn, ok +} + +var connectionManager = NewPlcConnectionManager() + +func (cm *ConnectionManager) AddConnection(address string, connection plc4go.PlcConnection) { + cm.mu.Lock() + defer cm.mu.Unlock() + + cm.connections[address] = connection +} +func GetModbusConnection(ipAddr string) (plc4go.PlcConnection, error) { + if conn, ok := connectionManager.GetConnection(ipAddr); ok { + if conn.IsConnected() { + return conn, nil + } + } + + // 鍒涘缓椹卞姩绠$悊鍣� + option := options.WithReceiveTimeout(time.Second * 5) //浜旂瓒呮椂 + driverManager := plc4go.NewPlcDriverManager(option) // 娉ㄥ唽TCP浼犺緭 transports.RegisterTcpTransport(driverManager) @@ -33,7 +69,9 @@ return nil, err } - return connectionResult.GetConnection(), nil + conn := connectionResult.GetConnection() + connectionManager.AddConnection(ipAddr, conn) + return conn, nil } func ReadHoldingRegisterSingle(connection plc4go.PlcConnection, address int) ([]byte, error) { tagAddress := fmt.Sprintf("holding-register:%d:UINT", address) diff --git a/service/plc.go b/service/plc.go index 1cef995..582f0f3 100644 --- a/service/plc.go +++ b/service/plc.go @@ -27,12 +27,11 @@ } ipAddr = fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port) - conn, err := plc.NewModbusConnection(ipAddr) + conn, err := plc.GetModbusConnection(ipAddr) if err != nil { logx.Errorf("GetProductProgress 杩炴帴plc澶辫触: %v", err.Error()) return } - defer conn.Close() rawData, err := plc.ReadHoldingRegister(conn, startAddress, dataLength) if err != nil { @@ -61,12 +60,11 @@ } ipAddr = fmt.Sprintf("%s:%v", plcConfig.Address, plcConfig.Port) - conn, err := plc.NewModbusConnection(ipAddr) + conn, err := plc.GetModbusConnection(ipAddr) if err != nil { logx.Errorf("GetProductProgress 杩炴帴plc澶辫触: %v", err.Error()) return } - defer conn.Close() result, err := plc.WriteHoldingRegister(conn, startAddress, value) if err != nil { -- Gitblit v1.8.0