From 53d80c839ad2aad0a0482ca43fca1fc3a95b9d1c Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期五, 03 十一月 2023 17:30:54 +0800
Subject: [PATCH] 更改路由

---
 pkg/plc/modbusx/modbus.go |   50 ++++++++++++++++++++++++++++++--------------------
 1 files changed, 30 insertions(+), 20 deletions(-)

diff --git a/pkg/plc/modbusx/modbus.go b/pkg/plc/modbusx/modbus.go
index a2941a6..1a779c3 100644
--- a/pkg/plc/modbusx/modbus.go
+++ b/pkg/plc/modbusx/modbus.go
@@ -1,35 +1,45 @@
 package modbusx
 
 import (
-	"encoding/json"
+	"encoding/binary"
 )
 
 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) {
+	address--
+	var bytesVal []byte
+	bytesVal = intToBytes(value)
 	cli := getModbusConnection(ipAddr)
 	_, err = cli.WriteMultipleRegisters(address, uint16(len(bytesVal)), bytesVal)
-	if err != nil {
-		return err
+	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))
+	} else {
+		data = make([]byte, 4)
+		binary.BigEndian.PutUint32(data, uint32(value))
 	}
-	//time.Sleep(time.Second)
-	//// 鏍¢獙鍐欏叆鐨勬暟鎹�
-	//result, err := cli.ReadHoldingRegisters(address, uint16(len(bytesVal)))
-	//if err != nil {
-	//	return err
-	//}
-	//resultVal := int(binary.BigEndian.Uint16(result))
-	//valueInt := cast.ToInt(value)
-	//if resultVal != valueInt {
-	//	return errors.New("write result not equal read result")
-	//}
-	return nil
+	return
+}
+
+func dealErr(err error, ipAddr string) {
+	if err != nil {
+		unsetModbusConnection(ipAddr) //澶辫触鍒欏垹闄ょ紦瀛樼殑杩炴帴
+	}
 }

--
Gitblit v1.8.0