zhangqian
2023-09-16 fbae58e8f6e6159325ef41b85917ddb468d1b98a
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
}