From be40c6bbad18cee0444c50069d98967cd26b6c3b Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期二, 19 十二月 2023 20:10:24 +0800
Subject: [PATCH] plc读写参数调整,读写方式调整

---
 pkg/plc/modbusx/modbus.go |   36 ++++++++++++++++++++++++++++--------
 1 files changed, 28 insertions(+), 8 deletions(-)

diff --git a/pkg/plc/modbusx/modbus.go b/pkg/plc/modbusx/modbus.go
index 1a779c3..3040c81 100644
--- a/pkg/plc/modbusx/modbus.go
+++ b/pkg/plc/modbusx/modbus.go
@@ -17,23 +17,43 @@
 	return
 }
 
-func Write(ipAddr string, address uint16, value int) (err error) {
+func Write(ipAddr string, address uint16, value int, endian string, length int) (err error) {
 	address--
 	var bytesVal []byte
-	bytesVal = intToBytes(value)
+	bytesVal = intToBytes(value, endian, length)
 	cli := getModbusConnection(ipAddr)
 	_, err = cli.WriteMultipleRegisters(address, uint16(len(bytesVal)), bytesVal)
 	dealErr(err, ipAddr)
 	return err
 }
 
-func intToBytes(value int) (data []byte) {
-	if value <= 1<<16 {
-		data = make([]byte, 2)
-		binary.BigEndian.PutUint16(data, uint16(value))
+func intToBytes(value int, endian string, length int) (data []byte) {
+	if endian == "mix" {
+		data = make([]byte, 0, 4)
+		highVal := value / (1 << 16)
+		highBts := make([]byte, 2)
+		binary.BigEndian.PutUint16(highBts, uint16(highVal))
+		lowValue := value % (1 << 16)
+		lowBts := make([]byte, 2)
+		binary.BigEndian.PutUint16(lowBts, uint16(lowValue))
+		data = append(data, lowBts...)
+		data = append(data, highBts...)
 	} else {
-		data = make([]byte, 4)
-		binary.BigEndian.PutUint32(data, uint32(value))
+		if length == 1 {
+			data = make([]byte, 2)
+			if endian == "big" {
+				binary.BigEndian.PutUint16(data, uint16(value))
+			} else {
+				binary.LittleEndian.PutUint16(data, uint16(value))
+			}
+		} else {
+			data = make([]byte, 4)
+			if endian == "big" {
+				binary.BigEndian.PutUint32(data, uint32(value))
+			} else {
+				binary.LittleEndian.PutUint32(data, uint32(value))
+			}
+		}
 	}
 	return
 }

--
Gitblit v1.8.0