zhangqian
2023-12-19 be40c6bbad18cee0444c50069d98967cd26b6c3b
pkg/plc/modbusx/modbus.go
@@ -17,23 +17,43 @@
   return
}
func Write(ipAddr string, address uint16, value int) (err error) {
func Write(ipAddr string, address uint16, value int, endian string, length int) (err error) {
   address--
   var bytesVal []byte
   bytesVal = intToBytes(value)
   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) (data []byte) {
   if value <= 1<<16 {
      data = make([]byte, 2)
      binary.BigEndian.PutUint16(data, uint16(value))
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 {
      data = make([]byte, 4)
      binary.BigEndian.PutUint32(data, uint32(value))
      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
}