github.com/simpleiot/simpleiot@v0.18.3/modbus/data.go (about)

     1  package modbus
     2  
     3  import (
     4  	"encoding/binary"
     5  	"math"
     6  )
     7  
     8  // PutUint16Array creates a sequence of uint16 data.
     9  func PutUint16Array(value ...uint16) []byte {
    10  	data := make([]byte, 2*len(value))
    11  	for i, v := range value {
    12  		binary.BigEndian.PutUint16(data[i*2:], v)
    13  	}
    14  	return data
    15  }
    16  
    17  // Uint16Array unpacks 16 bit data values from a buffer
    18  // (in big endian format)
    19  func Uint16Array(data []byte) []uint16 {
    20  	ret := make([]uint16, len(data)/2)
    21  	for i := range ret {
    22  		ret[i] = binary.BigEndian.Uint16(data[i*2 : i*2+2])
    23  	}
    24  	return ret
    25  }
    26  
    27  // RegsToInt16 converts modbus regs to int16 values
    28  func RegsToInt16(in []uint16) []int16 {
    29  	ret := make([]int16, len(in))
    30  	for i := range in {
    31  		ret[i] = int16(in[i])
    32  	}
    33  
    34  	return ret
    35  }
    36  
    37  // RegsToUint32 converts modbus regs to uint32 values
    38  func RegsToUint32(in []uint16) []uint32 {
    39  	count := len(in) / 2
    40  	ret := make([]uint32, count)
    41  	for i := range ret {
    42  		buf := make([]byte, 4)
    43  		binary.BigEndian.PutUint16(buf[0:], in[i*2])
    44  		binary.BigEndian.PutUint16(buf[2:], in[i*2+1])
    45  		ret[i] = binary.BigEndian.Uint32(buf)
    46  	}
    47  
    48  	return ret
    49  }
    50  
    51  // RegsToUint32SwapWords converts modbus regs to uint32 values
    52  func RegsToUint32SwapWords(in []uint16) []uint32 {
    53  	count := len(in) / 2
    54  	ret := make([]uint32, count)
    55  	for i := range ret {
    56  		buf := make([]byte, 4)
    57  		binary.BigEndian.PutUint16(buf[2:], in[i*2])
    58  		binary.BigEndian.PutUint16(buf[0:], in[i*2+1])
    59  		ret[i] = binary.BigEndian.Uint32(buf)
    60  	}
    61  
    62  	return ret
    63  }
    64  
    65  // Uint32ToRegs converts uint32 values to modbus regs
    66  func Uint32ToRegs(in []uint32) []uint16 {
    67  	ret := make([]uint16, len(in)*2)
    68  	for i, v := range in {
    69  		buf := make([]byte, 4)
    70  		binary.BigEndian.PutUint32(buf, v)
    71  		ret[i*2] = binary.BigEndian.Uint16(buf[0:])
    72  		ret[i*2+1] = binary.BigEndian.Uint16(buf[2:])
    73  	}
    74  
    75  	return ret
    76  }
    77  
    78  // Uint32ToRegsSwapRegs converts uint32 values to modbus regs
    79  func Uint32ToRegsSwapRegs(in []uint32) []uint16 {
    80  	ret := make([]uint16, len(in)*2)
    81  	for i, v := range in {
    82  		buf := make([]byte, 4)
    83  		binary.BigEndian.PutUint32(buf, v)
    84  		ret[i*2] = binary.BigEndian.Uint16(buf[2:])
    85  		ret[i*2+1] = binary.BigEndian.Uint16(buf[0:])
    86  	}
    87  
    88  	return ret
    89  }
    90  
    91  // RegsToInt32 converts modbus regs to int32 values
    92  func RegsToInt32(in []uint16) []int32 {
    93  	count := len(in) / 2
    94  	ret := make([]int32, count)
    95  	for i := range ret {
    96  		buf := make([]byte, 4)
    97  		binary.BigEndian.PutUint16(buf[0:], in[i*2])
    98  		binary.BigEndian.PutUint16(buf[2:], in[i*2+1])
    99  		ret[i] = int32(binary.BigEndian.Uint32(buf))
   100  	}
   101  
   102  	return ret
   103  }
   104  
   105  // RegsToInt32SwapWords converts modbus regs to int32 values
   106  func RegsToInt32SwapWords(in []uint16) []int32 {
   107  	count := len(in) / 2
   108  	ret := make([]int32, count)
   109  	for i := range ret {
   110  		buf := make([]byte, 4)
   111  		binary.BigEndian.PutUint16(buf[2:], in[i*2])
   112  		binary.BigEndian.PutUint16(buf[0:], in[i*2+1])
   113  		ret[i] = int32(binary.BigEndian.Uint32(buf))
   114  	}
   115  
   116  	return ret
   117  }
   118  
   119  // Int32ToRegs converts int32 values to modbus regs
   120  func Int32ToRegs(in []int32) []uint16 {
   121  	ret := make([]uint16, len(in)*2)
   122  	for i, v := range in {
   123  		buf := make([]byte, 4)
   124  		binary.BigEndian.PutUint32(buf, uint32(v))
   125  		ret[i*2] = binary.BigEndian.Uint16(buf[0:])
   126  		ret[i*2+1] = binary.BigEndian.Uint16(buf[2:])
   127  	}
   128  
   129  	return ret
   130  }
   131  
   132  // Int32ToRegsSwapWords converts int32 values to modbus regs
   133  func Int32ToRegsSwapWords(in []int32) []uint16 {
   134  	ret := make([]uint16, len(in)*2)
   135  	for i, v := range in {
   136  		buf := make([]byte, 4)
   137  		binary.BigEndian.PutUint32(buf, uint32(v))
   138  		ret[i*2] = binary.BigEndian.Uint16(buf[2:])
   139  		ret[i*2+1] = binary.BigEndian.Uint16(buf[0:])
   140  	}
   141  
   142  	return ret
   143  }
   144  
   145  // RegsToFloat32 converts modbus regs to float32 values
   146  func RegsToFloat32(in []uint16) []float32 {
   147  	count := len(in) / 2
   148  	ret := make([]float32, count)
   149  	for i := range ret {
   150  		buf := make([]byte, 4)
   151  		binary.BigEndian.PutUint16(buf[0:], in[i*2])
   152  		binary.BigEndian.PutUint16(buf[2:], in[i*2+1])
   153  		ret[i] = math.Float32frombits(binary.BigEndian.Uint32(buf))
   154  	}
   155  
   156  	return ret
   157  }
   158  
   159  // RegsToFloat32SwapWords converts modbus regs to float32 values
   160  func RegsToFloat32SwapWords(in []uint16) []float32 {
   161  	count := len(in) / 2
   162  	ret := make([]float32, count)
   163  	for i := range ret {
   164  		buf := make([]byte, 4)
   165  		binary.BigEndian.PutUint16(buf[2:], in[i*2])
   166  		binary.BigEndian.PutUint16(buf[0:], in[i*2+1])
   167  		ret[i] = math.Float32frombits(binary.BigEndian.Uint32(buf))
   168  	}
   169  
   170  	return ret
   171  }
   172  
   173  // Float32ToRegs converts float32 values to modbus regs
   174  func Float32ToRegs(in []float32) []uint16 {
   175  	ret := make([]uint16, len(in)*2)
   176  	for i, v := range in {
   177  		buf := make([]byte, 4)
   178  		binary.BigEndian.PutUint32(buf, math.Float32bits(v))
   179  		ret[i*2] = binary.BigEndian.Uint16(buf[0:])
   180  		ret[i*2+1] = binary.BigEndian.Uint16(buf[2:])
   181  	}
   182  
   183  	return ret
   184  }
   185  
   186  // Float32ToRegsSwapWords converts float32 values to modbus regs and swaps the words
   187  func Float32ToRegsSwapWords(in []float32) []uint16 {
   188  	ret := make([]uint16, len(in)*2)
   189  	for i, v := range in {
   190  		buf := make([]byte, 4)
   191  		binary.BigEndian.PutUint32(buf, math.Float32bits(v))
   192  		ret[i*2] = binary.BigEndian.Uint16(buf[2:])
   193  		ret[i*2+1] = binary.BigEndian.Uint16(buf[0:])
   194  	}
   195  
   196  	return ret
   197  }