From ef7d02ce56e98e8cbc5ed6ec746ea39bf0b8c9e2 Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期六, 16 九月 2023 22:44:58 +0800
Subject: [PATCH] 增加实时获取生产进度接口
---
pkg/plc/modbusx/modbus.go | 54 +++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 41 insertions(+), 13 deletions(-)
diff --git a/pkg/plc/modbusx/modbus.go b/pkg/plc/modbusx/modbus.go
index a2941a6..4bb3b64 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,45 @@
}
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() {
+ if failureRemainingOpportunities.Load() < defaultFailureRemainingOpportunities {
+ failureRemainingOpportunities.Store(defaultFailureRemainingOpportunities)
+ }
+ if connectionStatus.Load() == false {
+ connectionStatus.Store(true)
+ }
+ return
}
--
Gitblit v1.8.0