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