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 }