From 8dfb8feb32bb5e4e460e23dcde42612a26fa2bcb Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期日, 27 八月 2023 01:11:28 +0800 Subject: [PATCH] fix --- pkg/plc/plc4x.go | 78 ++++++++++++++++++++++++++++++++------- 1 files changed, 64 insertions(+), 14 deletions(-) diff --git a/pkg/plc/plc4x.go b/pkg/plc/plc4x.go index 3e6c4a6..d38ac67 100644 --- a/pkg/plc/plc4x.go +++ b/pkg/plc/plc4x.go @@ -1,22 +1,67 @@ package plc import ( + "context" "errors" "fmt" apiModel "github.com/apache/plc4x/plc4go/pkg/api/model" + "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) { +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 + } + } + // 鍒涘缓涓�涓笂涓嬫枃锛屽苟璁剧疆 5 绉掕秴鏃� + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + conn, err := NewGetModbusConnection(ctx, ipAddr) + if err != nil { + return nil, err + } + connectionManager.AddConnection(ipAddr, conn) + return conn, nil +} + +func NewGetModbusConnection(ctx context.Context, ipAddr string) (plc4go.PlcConnection, error) { // 鍒涘缓椹卞姩绠$悊鍣� driverManager := plc4go.NewPlcDriverManager() - // 娉ㄥ唽TCP浼犺緭 transports.RegisterTcpTransport(driverManager) - // 娉ㄥ唽椹卞姩 //drivers.RegisterKnxDriver(driverManager) drivers.RegisterModbusTcpDriver(driverManager) @@ -25,21 +70,24 @@ connectionString := fmt.Sprintf("modbus-tcp://%s", ipAddr) connectionRequestChanel := driverManager.GetConnection(connectionString) - // 绛夊緟杩炴帴鍝嶅簲 - connectionResult := <-connectionRequestChanel - - // 鍒ゆ柇鏄惁杩炴帴鎴愬姛 - if err := connectionResult.GetErr(); err != nil { - return nil, err + // 绛夊緟杩炴帴鍝嶅簲锛屽悓鏃惰�冭檻涓婁笅鏂囩殑瓒呮椂 + select { + case connectionResult := <-connectionRequestChanel: + if err := connectionResult.GetErr(); err != nil { + return nil, err + } + return connectionResult.GetConnection(), nil + case <-ctx.Done(): + return nil, ctx.Err() } - - return connectionResult.GetConnection(), nil } + func ReadHoldingRegisterSingle(connection plc4go.PlcConnection, address int) ([]byte, error) { + tag := fmt.Sprintf("tag:%v", address) tagAddress := fmt.Sprintf("holding-register:%d:UINT", address) // 璇绘ā寮� - readRequest, err := connection.ReadRequestBuilder().AddTagAddress("tag", tagAddress).Build() + readRequest, err := connection.ReadRequestBuilder().AddTagAddress(tag, tagAddress).Build() if err != nil { fmt.Printf("preparing read-request:%s\n", err.Error()) return nil, err @@ -65,10 +113,11 @@ } 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) // 璇绘ā寮� - readRequest, err := connection.ReadRequestBuilder().AddTagAddress("tag", tagAddress).Build() + readRequest, err := connection.ReadRequestBuilder().AddTagAddress(tag, tagAddress).Build() if err != nil { fmt.Printf("preparing read-request:%s\n", err.Error()) return nil, err @@ -107,10 +156,11 @@ } func WriteHoldingRegister(connection plc4go.PlcConnection, address int, value any) (string, error) { + tag := fmt.Sprintf("tag:%v:w", address) tagAddress := fmt.Sprintf("holding-register:%d:UINT", address) // 鍐欐ā寮� - writeRequest, err := connection.WriteRequestBuilder().AddTagAddress("tag", tagAddress, value).Build() + writeRequest, err := connection.WriteRequestBuilder().AddTagAddress(tag, tagAddress, value).Build() if err != nil { fmt.Printf("preparing read-request:%s\n", err.Error()) return "", err -- Gitblit v1.8.0