From 2d6875c93b25d0b7336c7fa11e066d213259fe2e Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期四, 25 四月 2024 10:02:01 +0800 Subject: [PATCH] 更改定时任务时区设置 --- pkg/plc/apacheplc4x/modbus.go | 67 ++++++++++++++++++--------------- 1 files changed, 37 insertions(+), 30 deletions(-) diff --git a/pkg/plc/apacheplc4x/modbus.go b/pkg/plc/apacheplc4x/modbus.go index 7555866..a6138eb 100644 --- a/pkg/plc/apacheplc4x/modbus.go +++ b/pkg/plc/apacheplc4x/modbus.go @@ -1,7 +1,6 @@ package apacheplc4x import ( - "apsClient/conf" "apsClient/pkg/logx" "context" "errors" @@ -14,31 +13,35 @@ "time" ) +var driverManager plc4go.PlcDriverManager + +func init() { + // 鍒涘缓椹卞姩绠$悊鍣� + driverManager = plc4go.NewPlcDriverManager() + // 娉ㄥ唽TCP浼犺緭 + transports.RegisterTcpTransport(driverManager) + // 娉ㄥ唽涓插彛浼犺緭 + transports.RegisterSerialTransport(driverManager) + // 娉ㄥ唽椹卞姩 + drivers.RegisterModbusTcpDriver(driverManager) + drivers.RegisterModbusRtuDriver(driverManager) +} + func GetModbusConnection(ipAddr string) (plc4go.PlcConnection, error) { // 鍒涘缓涓�涓笂涓嬫枃锛屽苟璁剧疆 3 绉掕秴鏃� ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() - conn, err := newGetModbusConnection(ctx, ipAddr) + conn, err := newModbusTCPConnection(ctx, ipAddr) if err != nil { logx.Errorf("new modbus connection err: %v", err.Error()) return nil, err } 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) - +func newModbusTCPConnection(ctx context.Context, ipAddr string) (plc4go.PlcConnection, error) { // 閫氳繃TCP杩炴帴PLC璁惧 connectionString := fmt.Sprintf("modbus-tcp://%s", ipAddr) connectionRequestChanel := driverManager.GetConnection(connectionString) - // 绛夊緟杩炴帴鍝嶅簲锛屽悓鏃惰�冭檻涓婁笅鏂囩殑瓒呮椂 select { case connectionResult := <-connectionRequestChanel: @@ -51,9 +54,9 @@ } } -func readHoldingRegisterSingle(connection plc4go.PlcConnection, address int) ([]byte, error) { +func readHoldingRegisterSingle(connection plc4go.PlcConnection, address int, intType string) ([]byte, error) { tag := fmt.Sprintf("tag:%v", address) - tagAddress := getTagAddress(address) + tagAddress := getTagAddress(address, 1, intType) // 璇绘ā寮� readRequest, err := connection.ReadRequestBuilder().AddTagAddress(tag, tagAddress).Build() @@ -81,9 +84,9 @@ } -func readHoldingRegisterList(connection plc4go.PlcConnection, address, length int) ([]byte, error) { +func readHoldingRegisterList(connection plc4go.PlcConnection, address, length int, intType string) ([]byte, error) { tag := fmt.Sprintf("tag:%v:%v", address, length) - tagAddress := getTagAddress(address) + tagAddress := getTagAddress(address, length, intType) // 璇绘ā寮� readRequest, err := connection.ReadRequestBuilder().AddTagAddress(tag, tagAddress).Build() @@ -95,13 +98,13 @@ // 鎵ц readResult := <-readRequest.Execute() if err := readResult.GetErr(); err != nil { - logx.Errorf("execting read-request:%s\n", err.Error()) + logx.Errorf("plc4x execute read-request:%s\n", err.Error()) return nil, err } // 鍒ゆ柇鍝嶅簲鐮佹槸鍚︽纭� if readResult.GetResponse().GetResponseCode(tag) != apiModel.PlcResponseCode_OK { - logx.Errorf("error an non-ok return code: %s", readResult.GetResponse().GetResponseCode(tag).GetName()) + logx.Errorf("plc4x response error code: %s", readResult.GetResponse().GetResponseCode(tag).GetName()) return nil, errors.New("error code: " + readResult.GetResponse().GetResponseCode(tag).GetName()) } @@ -116,7 +119,7 @@ return result, nil } -func ReadHoldingRegister(ipAddr string, address, length int) ([]byte, error) { +func ReadHoldingRegister(ipAddr string, address, length int, intType string) ([]byte, error) { connection, err := GetModbusConnection(ipAddr) dealErr(err, ipAddr) if err != nil { @@ -124,21 +127,24 @@ } defer connection.Close() if length > 1 { - return readHoldingRegisterList(connection, address, length) + return readHoldingRegisterList(connection, address, length, intType) } - return readHoldingRegisterSingle(connection, address) + return readHoldingRegisterSingle(connection, address, intType) } -func getTagAddress(address int) string { - intType := conf.Conf.PLC.ModbusIntType +func getTagAddress(address int, length int, intType string) string { if intType == "" { intType = "DINT" } - return fmt.Sprintf("holding-register:%d:%v", address, intType) + if length == 1 { + return fmt.Sprintf("holding-register:%d:%v", address, intType) + } else { + return fmt.Sprintf("holding-register:%d:%v[%d]", address, intType, length) + } } -func WriteHoldingRegister(ipAddr string, address int, value any) (string, error) { +func WriteHoldingRegister(ipAddr string, address int, value any, intType string) (string, error) { connection, err := GetModbusConnection(ipAddr) dealErr(err, ipAddr) if err != nil { @@ -146,25 +152,26 @@ } defer connection.Close() tag := fmt.Sprintf("tag:%v:w", address) - tagAddress := getTagAddress(address) + var tagAddress string + tagAddress = getTagAddress(address, 1, intType) // 鍐欐ā寮� writeRequest, err := connection.WriteRequestBuilder().AddTagAddress(tag, tagAddress, value).Build() if err != nil { - logx.Errorf("preparing read-request:%s\n", err.Error()) + logx.Errorf("plc4x preparing read-request:%s\n", err.Error()) return "", err } // 鎵ц writeResult := <-writeRequest.Execute() if err := writeResult.GetErr(); err != nil { - logx.Errorf("execting read-request:%s\n", err.Error()) + logx.Errorf("plc4x execute write-request:%s\n", err.Error()) return "", err } // 鍒ゆ柇鍝嶅簲鐮佹槸鍚︽纭� if writeResult.GetResponse().GetResponseCode(tag) != apiModel.PlcResponseCode_OK { - logx.Errorf("error an non-ok return code: %s", writeResult.GetResponse().GetResponseCode(tag).GetName()) + logx.Errorf("plc4x response error code: %s", writeResult.GetResponse().GetResponseCode(tag).GetName()) return "", errors.New("error code: " + writeResult.GetResponse().GetResponseCode(tag).GetName()) } -- Gitblit v1.8.0