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 | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 45 insertions(+), 2 deletions(-) diff --git a/collector/plc4x.go b/collector/plc4x.go index 5e7966d..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" @@ -35,8 +36,16 @@ return connectionResult.GetConnection(), nil } -func ReadHoldingRegister(connection plc4go.PlcConnection, address int) ([]byte, error) { - 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() @@ -63,3 +72,37 @@ 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