From 583142e22b647955082ea61f8ee6b3641aaa903c Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期二, 19 九月 2023 14:16:55 +0800
Subject: [PATCH] 写plc fix

---
 test/plc_test.go          |   39 +++++++++++++++++++
 pkg/plc/modbusx/modbus.go |   35 +++++------------
 conf/apsClient.json       |    2 
 3 files changed, 51 insertions(+), 25 deletions(-)

diff --git a/conf/apsClient.json b/conf/apsClient.json
index d24e60f..9e45ec5 100644
--- a/conf/apsClient.json
+++ b/conf/apsClient.json
@@ -33,7 +33,7 @@
     "totalNumberTimeInterval": 0,
     "modbusIntType": "DINT",
     "slaveId": 0,
-    "package": "goburrow",
+    "package": "goborrow",
     "keepAlive": "false"
   }
 }
diff --git a/pkg/plc/modbusx/modbus.go b/pkg/plc/modbusx/modbus.go
index e1af28c..2d323ec 100644
--- a/pkg/plc/modbusx/modbus.go
+++ b/pkg/plc/modbusx/modbus.go
@@ -19,37 +19,24 @@
 }
 
 func Write(ipAddr string, address uint16, value int) (err error) {
+	address--
 	var bytesVal []byte
-	if value <= 1<<16 {
-		uint16ToBytes(uint16(value))
-	} else {
-		bytesVal = intToBytes(value)
-	}
+	bytesVal = intToBytes(value)
 	cli := getModbusConnection(ipAddr)
 	_, err = cli.WriteMultipleRegisters(address, uint16(len(bytesVal)), bytesVal)
 	dealErr(err, ipAddr)
 	return err
 }
 
-func uint16ToBytes(value uint16) []byte {
-	// 鍒涘缓涓�涓暱搴︿负2鐨勫瓧鑺傚垏鐗�
-	bytes := make([]byte, 2)
-
-	// 灏� uint16 鐨勫�煎啓鍏ュ瓧鑺傚垏鐗囷紝鍙互閫夋嫨浣跨敤澶х鎴栧皬绔瓧鑺傚簭
-	bytes[0] = byte(value >> 8) // 鑾峰彇楂�8浣�
-	bytes[1] = byte(value)      // 鑾峰彇浣�8浣�
-
-	return bytes
-}
-
-func intToBytes(value int) []byte {
-	// 鍒涘缓涓�涓暱搴︿负4鐨勫瓧鑺傚垏鐗囷紝鐢ㄤ簬瀛樺偍 int 鍊�
-	bytes := make([]byte, 4)
-
-	// 浣跨敤 binary 鍖呭皢 int 鍊艰浆鎹负瀛楄妭鍒囩墖
-	binary.BigEndian.PutUint32(bytes, uint32(value))
-
-	return bytes
+func intToBytes(value int) (data []byte) {
+	if value <= 1<<16 {
+		data = make([]byte, 2)
+		binary.BigEndian.PutUint16(data, uint16(value))
+	} else {
+		data = make([]byte, 4)
+		binary.BigEndian.PutUint32(data, uint32(value))
+	}
+	return
 }
 
 func dealErr(err error, ipAddr string) {
diff --git a/test/plc_test.go b/test/plc_test.go
new file mode 100644
index 0000000..0b5f564
--- /dev/null
+++ b/test/plc_test.go
@@ -0,0 +1,39 @@
+package test
+
+import (
+	"apsClient/service"
+	"encoding/binary"
+	"log"
+	"testing"
+)
+
+func TestWriteHoldingRegister(t *testing.T) {
+	Init()
+	ipPort := "192.168.20.250:502"
+	address := 1104
+	value := 1104
+	err := service.WriteHoldingRegister(ipPort, address, value)
+	if err != nil {
+		log.Fatal(err)
+	}
+	var readValue int
+	raw, err := service.ReadHoldingRegister(ipPort, address, 1)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	if len(raw) == 2 {
+		readValue = int(binary.BigEndian.Uint16(raw))
+	} else if len(raw) == 4 {
+		readValue = int(binary.BigEndian.Uint32(raw))
+	} else {
+		log.Fatal("unknown supported raw value length")
+	}
+
+	if readValue != value {
+		t.Logf("read value:%v not equal write value:%v", readValue, value)
+		t.Fail()
+	} else {
+		t.Logf("write ok, read value:%v equal write value:%v", readValue, value)
+	}
+}

--
Gitblit v1.8.0