From a769578e846206da641b6ff301b26f4cde4374ac Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期六, 07 十月 2023 15:00:35 +0800
Subject: [PATCH] 注释掉暂时没用到的
---
pkg/plc/modbusx/modbus.go | 84 ++++++++++++++++++++++++++++++++----------
1 files changed, 64 insertions(+), 20 deletions(-)
diff --git a/pkg/plc/modbusx/modbus.go b/pkg/plc/modbusx/modbus.go
index a2941a6..2d323ec 100644
--- a/pkg/plc/modbusx/modbus.go
+++ b/pkg/plc/modbusx/modbus.go
@@ -1,35 +1,79 @@
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) {
+ 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) //澶辫触鍒欏垹闄ょ紦瀛樼殑杩炴帴
+ FailureRemainingOpportunitiesDecr() //鍑忓皯澶辫触鍓╀綑鏈轰細
+ } else {
+ FailureRemainingOpportunitiesReset() //閲嶇疆澶辫触鍓╀綑鏈轰細
+ }
+}
+
+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