From cab6eea89a0d82710369604ecb51f1cdb122e433 Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期四, 19 十月 2023 17:26:34 +0800 Subject: [PATCH] fix --- pkg/plc/plc4x.go | 48 +++++++++++++++++++++++++++++++++++------------- 1 files changed, 35 insertions(+), 13 deletions(-) diff --git a/pkg/plc/plc4x.go b/pkg/plc/plc4x.go index 7e386e6..68562a6 100644 --- a/pkg/plc/plc4x.go +++ b/pkg/plc/plc4x.go @@ -19,7 +19,7 @@ mu sync.Mutex } -func NewPlcConnectionManager() *ConnectionManager { +func newPlcConnectionManager() *ConnectionManager { return &ConnectionManager{ connections: make(map[string]plc4go.PlcConnection), } @@ -30,10 +30,17 @@ defer cm.mu.Unlock() conn, ok := cm.connections[address] - return conn, ok + if !ok { + return nil, false + } + //if ok, _ := cm.CheckConnect(conn, time.Second); !ok { + // conn.Close() + //} + + return conn, true } -var connectionManager = NewPlcConnectionManager() +var connectionManager = newPlcConnectionManager() func (cm *ConnectionManager) AddConnection(address string, connection plc4go.PlcConnection) { cm.mu.Lock() @@ -41,24 +48,39 @@ cm.connections[address] = connection } + +func (cm *ConnectionManager) CheckConnect(conn plc4go.PlcConnection, timeout time.Duration) (bool, error) { + pingCh := conn.Ping() + timer := time.NewTimer(timeout) + + select { + case err := <-pingCh: + if err == nil { + return true, nil + } + return false, err.GetErr() + case <-timer.C: + return false, fmt.Errorf("connection timed out after %s", timeout) + } +} + func GetModbusConnection(ipAddr string) (plc4go.PlcConnection, error) { if conn, ok := connectionManager.GetConnection(ipAddr); ok { - if conn.IsConnected() { - return conn, nil - } + return conn, nil } // 鍒涘缓涓�涓笂涓嬫枃锛屽苟璁剧疆 3 绉掕秴鏃� - ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() - conn, err := NewGetModbusConnection(ctx, ipAddr) + conn, err := newGetModbusConnection(ctx, ipAddr) if err != nil { + logx.Errorf("new modbus connection err: %v", err.Error()) return nil, err } connectionManager.AddConnection(ipAddr, conn) return conn, nil } -func NewGetModbusConnection(ctx context.Context, ipAddr string) (plc4go.PlcConnection, error) { +func newGetModbusConnection(ctx context.Context, ipAddr string) (plc4go.PlcConnection, error) { // 鍒涘缓椹卞姩绠$悊鍣� driverManager := plc4go.NewPlcDriverManager() // 娉ㄥ唽TCP浼犺緭 @@ -83,7 +105,7 @@ } } -func ReadHoldingRegisterSingle(connection plc4go.PlcConnection, address int) ([]byte, error) { +func readHoldingRegisterSingle(connection plc4go.PlcConnection, address int) ([]byte, error) { tag := fmt.Sprintf("tag:%v", address) tagAddress := fmt.Sprintf("holding-register:%d:UINT", address) @@ -113,7 +135,7 @@ } -func ReadHoldingRegisterList(connection plc4go.PlcConnection, address, length int) ([]byte, error) { +func readHoldingRegisterList(connection plc4go.PlcConnection, address, length int) ([]byte, error) { tag := fmt.Sprintf("tag:%v:%v", address, length) tagAddress := fmt.Sprintf("holding-register:%d:UINT[%d]", address, length) @@ -150,10 +172,10 @@ func ReadHoldingRegister(connection plc4go.PlcConnection, address, length int) ([]byte, error) { if length > 1 { - return ReadHoldingRegisterList(connection, address, length) + return readHoldingRegisterList(connection, address, length) } - return ReadHoldingRegisterSingle(connection, address) + return readHoldingRegisterSingle(connection, address) } func WriteHoldingRegister(connection plc4go.PlcConnection, address int, value any) (string, error) { -- Gitblit v1.8.0