package modbusx
|
|
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
|
}
|
|
func Write(ipAddr string, address uint16, value interface{}) (err error) {
|
bytesVal, err := json.Marshal(value)
|
if err != nil {
|
return err
|
}
|
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 {
|
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
|
}
|