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