| | |
| | | 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 |
| | | } |
| | | cli := getModbusRTUConnection(c) |
| | | data, err = cli.ReadHoldingRegisters(address, quantity) |
| | | dealRTUErr(err, c.SerialName) |
| | | if err != nil { |
| | | cli, err = getModbusRTUConnection(c) |
| | | if err != nil { |
| | | return nil, err |
| | | } |
| | | cli = getModbusRTUConnection(c) |
| | | data, err = cli.ReadHoldingRegisters(address, quantity) |
| | | } |
| | | if err != nil { |
| | | logx.Errorf("ReadByRTU ReadHoldingRegisters err:%v", err) |
| | | dealRTUErr(err, c.SerialName) |
| | | } |
| | | 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 |
| | | } |
| | | cli := getModbusRTUConnection(c) |
| | | _, err = cli.WriteMultipleRegisters(address, uint16(len(bytesVal)), bytesVal) |
| | | dealRTUErr(err, c.SerialName) |
| | | if err != nil { |
| | | cli, err = getModbusRTUConnection(c) |
| | | if err != nil { |
| | | return err |
| | | } |
| | | cli = getModbusRTUConnection(c) |
| | | _, err = cli.WriteMultipleRegisters(address, uint16(len(bytesVal)), bytesVal) |
| | | } |
| | | if err != nil { |
| | | logx.Errorf("WriteByRTU WriteMultipleRegisters err:%v", err) |
| | | dealRTUErr(err, c.SerialName) |
| | | } |
| | | 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() |
| | | func dealRTUErr(err error, serialName string) { |
| | | if err != nil { |
| | | logx.Errorf("getModbusRTUConnection Connect err:%v, config: %+v", err, c) |
| | | return nil, err |
| | | unsetModbusRTUConnection(serialName) //失败则删除缓存的连接 |
| | | } |
| | | defer h.Close() |
| | | cli = modbus.NewClient(h) |
| | | return |
| | | } |