From 30c549c7e4d63ab3ea5bd0a7cfd69fa89339df33 Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期一, 18 九月 2023 19:46:27 +0800 Subject: [PATCH] 增加重试,地址-1 --- pkg/plc/modbusx/modbus.go | 39 ++++++++++++++++++++++++++++++++++----- 1 files changed, 34 insertions(+), 5 deletions(-) diff --git a/pkg/plc/modbusx/modbus.go b/pkg/plc/modbusx/modbus.go index 4bb3b64..e1af28c 100644 --- a/pkg/plc/modbusx/modbus.go +++ b/pkg/plc/modbusx/modbus.go @@ -1,21 +1,29 @@ package modbusx import ( - "encoding/json" + "encoding/binary" "sync/atomic" ) func Read(ipAddr string, address uint16, quantity uint16) (data []byte, err error) { + address-- cli := getModbusConnection(ipAddr) data, err = cli.ReadHoldingRegisters(address, quantity) dealErr(err, ipAddr) + if err != nil { + cli = getModbusConnection(ipAddr) + data, err = cli.ReadHoldingRegisters(address, quantity) + dealErr(err, ipAddr) + } return } -func Write(ipAddr string, address uint16, value interface{}) (err error) { - bytesVal, err := json.Marshal(value) - if err != nil { - return err +func Write(ipAddr string, address uint16, value int) (err error) { + var bytesVal []byte + if value <= 1<<16 { + uint16ToBytes(uint16(value)) + } else { + bytesVal = intToBytes(value) } cli := getModbusConnection(ipAddr) _, err = cli.WriteMultipleRegisters(address, uint16(len(bytesVal)), bytesVal) @@ -23,6 +31,27 @@ 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 dealErr(err error, ipAddr string) { if err != nil { unsetModbusConnection(ipAddr) //澶辫触鍒欏垹闄ょ紦瀛樼殑杩炴帴 -- Gitblit v1.8.0