From 742923a5512707bdfd4c0e2e9adfcb86b453be28 Mon Sep 17 00:00:00 2001 From: zhangzengfei <zhangzengfei@smartai.com> Date: 星期日, 13 八月 2023 17:33:18 +0800 Subject: [PATCH] 修复长度大于1的读取结果 --- collector/plc4x.go | 65 +++++++++++++++++++++++++++----- 1 files changed, 54 insertions(+), 11 deletions(-) diff --git a/collector/plc4x.go b/collector/plc4x.go index e35edfb..8262656 100644 --- a/collector/plc4x.go +++ b/collector/plc4x.go @@ -1,6 +1,7 @@ package collector import ( + "errors" "fmt" plc4go "github.com/apache/plc4x/plc4go/pkg/api" @@ -9,7 +10,7 @@ "github.com/apache/plc4x/plc4go/pkg/api/transports" ) -func NewModbusConnection(ipAddr string) (error, plc4go.PlcConnection) { +func NewModbusConnection(ipAddr string) (plc4go.PlcConnection, error) { // 鍒涘缓椹卞姩绠$悊鍣� driverManager := plc4go.NewPlcDriverManager() @@ -29,37 +30,79 @@ // 鍒ゆ柇鏄惁杩炴帴鎴愬姛 if err := connectionResult.GetErr(); err != nil { - return err, nil + return nil, err } - return nil, connectionResult.GetConnection() + return connectionResult.GetConnection(), nil } -func ReadHoldingRegister(connection plc4go.PlcConnection, address int) (error, []byte) { - tagAddress := fmt.Sprintf("holding-register:%d:DINT", address) +func ReadHoldingRegister(connection plc4go.PlcConnection, address, length int) ([]byte, error) { + if length > 1 { + return ReadHoldingRegisterList(connection, address, length) + } + + return ReadHoldingRegisterSingle(connection, address) +} + +func ReadHoldingRegisterSingle(connection plc4go.PlcConnection, address int) ([]byte, error) { + tagAddress := fmt.Sprintf("holding-register:%d:UINT", address) // 璇绘ā寮� readRequest, err := connection.ReadRequestBuilder().AddTagAddress("tag", tagAddress).Build() if err != nil { - fmt.Printf("Error preparing read-request:%s\n", err.Error()) - return err, nil + fmt.Printf("preparing read-request:%s\n", err.Error()) + return nil, err } // 鎵ц readResult := <-readRequest.Execute() if err := readResult.GetErr(); err != nil { - fmt.Printf("Error execting read-request:%s\n", err.Error()) - return err, nil + fmt.Printf("execting read-request:%s\n", err.Error()) + return nil, err } // 鍒ゆ柇鍝嶅簲鐮佹槸鍚︽纭� if readResult.GetResponse().GetResponseCode("tag") != apiModel.PlcResponseCode_OK { fmt.Printf("error an non-ok return code: %s", readResult.GetResponse().GetResponseCode("tag").GetName()) - return err, nil + return nil, nil } value := readResult.GetResponse().GetValue("tag") - return nil, value.GetRaw() + return value.GetRaw(), err } + +func ReadHoldingRegisterList(connection plc4go.PlcConnection, address, length int) ([]byte, error) { + tagAddress := fmt.Sprintf("holding-register:%d:UINT[%d]", address, length) + + // 璇绘ā寮� + readRequest, err := connection.ReadRequestBuilder().AddTagAddress("tag", tagAddress).Build() + if err != nil { + fmt.Printf("preparing read-request:%s\n", err.Error()) + return nil, err + } + + // 鎵ц + readResult := <-readRequest.Execute() + if err := readResult.GetErr(); err != nil { + fmt.Printf("execting read-request:%s\n", err.Error()) + return nil, err + } + + // 鍒ゆ柇鍝嶅簲鐮佹槸鍚︽纭� + if readResult.GetResponse().GetResponseCode("tag") != apiModel.PlcResponseCode_OK { + fmt.Printf("error an non-ok return code: %s", readResult.GetResponse().GetResponseCode("tag").GetName()) + return nil, errors.New("error code: " + readResult.GetResponse().GetResponseCode("tag").GetName()) + } + + value := readResult.GetResponse().GetValue("tag") + + var result []byte + + for _, val := range value.GetList() { + result = append(result, val.GetRaw()...) + } + + return result, nil +} -- Gitblit v1.8.0