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