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