package modbusx
|
|
import (
|
"apsClient/constvar"
|
"apsClient/model/common"
|
"apsClient/pkg/logx"
|
"github.com/goburrow/modbus"
|
"time"
|
)
|
|
func ReadByRTU(c *common.RTUConfig, address uint16, quantity uint16) (data []byte, err error) {
|
address--
|
cli, err := getModbusRTUConnection(c)
|
if err != nil {
|
return nil, err
|
}
|
data, err = cli.ReadHoldingRegisters(address, quantity)
|
if err != nil {
|
cli, err = getModbusRTUConnection(c)
|
if err != nil {
|
return nil, err
|
}
|
data, err = cli.ReadHoldingRegisters(address, quantity)
|
}
|
if err != nil {
|
logx.Errorf("ReadByRTU ReadHoldingRegisters err:%v", err)
|
}
|
return
|
}
|
|
func WriteByRTU(c *common.RTUConfig, address uint16, value int) (err error) {
|
address--
|
var bytesVal []byte
|
bytesVal = intToBytes(value)
|
|
cli, err := getModbusRTUConnection(c)
|
if err != nil {
|
return err
|
}
|
_, err = cli.WriteMultipleRegisters(address, uint16(len(bytesVal)), bytesVal)
|
if err != nil {
|
cli, err = getModbusRTUConnection(c)
|
if err != nil {
|
return err
|
}
|
_, err = cli.WriteMultipleRegisters(address, uint16(len(bytesVal)), bytesVal)
|
}
|
if err != nil {
|
logx.Errorf("WriteByRTU WriteMultipleRegisters err:%v", err)
|
}
|
return err
|
}
|
|
func getModbusRTUConnection(c *common.RTUConfig) (cli modbus.Client, err error) {
|
// Modbus RTU/ASCII
|
h := modbus.NewRTUClientHandler(c.SerialName)
|
h.BaudRate = c.BaudRate
|
h.DataBits = c.DataBit
|
switch c.Parity {
|
case constvar.ParityEven:
|
h.Parity = "E"
|
case constvar.ParityOdd:
|
h.Parity = "O"
|
case constvar.ParityNull:
|
h.Parity = "N"
|
}
|
|
h.StopBits = c.StopBit
|
h.SlaveId = 1
|
h.Timeout = 5 * time.Second
|
|
err = h.Connect()
|
if err != nil {
|
logx.Errorf("getModbusRTUConnection Connect err:%v, config: %+v", err, c)
|
return nil, err
|
}
|
defer h.Close()
|
cli = modbus.NewClient(h)
|
return
|
}
|