zhangqian
2023-10-27 d91a802e7aa2ad4075ed803b8ddc7536a91a0ef0
pkg/plc/modbusx/modbusrtu.go
@@ -1,80 +1,37 @@
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
}