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秒 --- pkg/plc/plc4x.go | 46 ++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 42 insertions(+), 4 deletions(-) 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) -- Gitblit v1.8.0