From fbae58e8f6e6159325ef41b85917ddb468d1b98a Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期六, 16 九月 2023 18:17:23 +0800
Subject: [PATCH] 读写plc连续失败20次认为失去心跳

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

diff --git a/pkg/plc/modbusx/modbus.go b/pkg/plc/modbusx/modbus.go
index a2941a6..796aa17 100644
--- a/pkg/plc/modbusx/modbus.go
+++ b/pkg/plc/modbusx/modbus.go
@@ -2,11 +2,13 @@
 
 import (
 	"encoding/json"
+	"sync/atomic"
 )
 
 func Read(ipAddr string, address uint16, quantity uint16) (data []byte, err error) {
 	cli := getModbusConnection(ipAddr)
 	data, err = cli.ReadHoldingRegisters(address, quantity)
+	dealErr(err, ipAddr)
 	return
 }
 
@@ -17,19 +19,41 @@
 	}
 	cli := getModbusConnection(ipAddr)
 	_, err = cli.WriteMultipleRegisters(address, uint16(len(bytesVal)), bytesVal)
+	dealErr(err, ipAddr)
+	return err
+}
+
+func dealErr(err error, ipAddr string) {
 	if err != nil {
-		return err
+		unsetModbusConnection(ipAddr)       //澶辫触鍒欏垹闄ょ紦瀛樼殑杩炴帴
+		FailureRemainingOpportunitiesDecr() //鍑忓皯澶辫触鍓╀綑鏈轰細
+	} else {
+		FailureRemainingOpportunitiesReset() //閲嶇疆澶辫触鍓╀綑鏈轰細
 	}
-	//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
+}
+
+var connectionStatus atomic.Bool
+
+var failureRemainingOpportunities atomic.Int64
+
+const (
+	defaultFailureRemainingOpportunities = 20
+)
+
+func IsConnect() bool {
+	return connectionStatus.Load()
+}
+
+func FailureRemainingOpportunitiesDecr() {
+	newValue := failureRemainingOpportunities.Add(-1)
+	if newValue <= 0 {
+		connectionStatus.Store(false)
+	}
+	return
+}
+
+func FailureRemainingOpportunitiesReset() {
+	failureRemainingOpportunities.Store(defaultFailureRemainingOpportunities)
+	connectionStatus.Store(true)
+	return
 }

--
Gitblit v1.8.0