From 2d6875c93b25d0b7336c7fa11e066d213259fe2e Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期四, 25 四月 2024 10:02:01 +0800 Subject: [PATCH] 更改定时任务时区设置 --- pkg/plc/modbusx/modbus.go | 80 +++++++++++++++++++++------------------ 1 files changed, 43 insertions(+), 37 deletions(-) diff --git a/pkg/plc/modbusx/modbus.go b/pkg/plc/modbusx/modbus.go index 796aa17..3040c81 100644 --- a/pkg/plc/modbusx/modbus.go +++ b/pkg/plc/modbusx/modbus.go @@ -1,59 +1,65 @@ package modbusx import ( - "encoding/json" - "sync/atomic" + "encoding/binary" ) 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, endian string, length int) (err error) { + address-- + var bytesVal []byte + bytesVal = intToBytes(value, endian, length) cli := getModbusConnection(ipAddr) _, err = cli.WriteMultipleRegisters(address, uint16(len(bytesVal)), bytesVal) dealErr(err, ipAddr) return err } +func intToBytes(value int, endian string, length int) (data []byte) { + if endian == "mix" { + data = make([]byte, 0, 4) + highVal := value / (1 << 16) + highBts := make([]byte, 2) + binary.BigEndian.PutUint16(highBts, uint16(highVal)) + lowValue := value % (1 << 16) + lowBts := make([]byte, 2) + binary.BigEndian.PutUint16(lowBts, uint16(lowValue)) + data = append(data, lowBts...) + data = append(data, highBts...) + } else { + if length == 1 { + data = make([]byte, 2) + if endian == "big" { + binary.BigEndian.PutUint16(data, uint16(value)) + } else { + binary.LittleEndian.PutUint16(data, uint16(value)) + } + } else { + data = make([]byte, 4) + if endian == "big" { + binary.BigEndian.PutUint32(data, uint32(value)) + } else { + binary.LittleEndian.PutUint32(data, uint32(value)) + } + } + } + return +} + func dealErr(err error, ipAddr string) { if err != nil { - unsetModbusConnection(ipAddr) //澶辫触鍒欏垹闄ょ紦瀛樼殑杩炴帴 - FailureRemainingOpportunitiesDecr() //鍑忓皯澶辫触鍓╀綑鏈轰細 - } else { - FailureRemainingOpportunitiesReset() //閲嶇疆澶辫触鍓╀綑鏈轰細 + unsetModbusConnection(ipAddr) //澶辫触鍒欏垹闄ょ紦瀛樼殑杩炴帴 } -} - -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