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