Modbus TCP Multiple Registers READ / WRITE
Connects to a Modbus TCP slave, reads 30 registers from a weather station
(parsing mixed U32/S32 values with scaling), and writes multiple registers
packed with bin.fromArray().
// Please Note, Function Codes 1,2 and 15 expect a bit array
// === TRY CONNECT ===
let ret = modbus.connect("172.16.220.111",502,1); // Connect to the modbus master
if(ret === 0){
// === READ TEST ===
let ret = modbus.read(0, // port: 0=tcp, 1=ttl serial, 2=rs485
1, // slave unitID
4, // function, 3 = read multiple registers
0x88B9, // start register
30 //register / coil count
);
if(ret.status === 0){
ret.data.seek(0);
let data = {
meanWindSpeed: ret.data.read("U32DCBA")/10, // m/s
meanWindDirection: ret.data.read("U32")/10, // degress
airTemp: ret.data.read("S32")/10, // °C
internalTemp: ret.data.read("S32")/10, // °C
acousticTemp: ret.data.read("S32")/10, // °C
rawTemp: ret.data.read("S32")/10, // °C
relativeHumidity: ret.data.read("U32")/10, // %rh
dewpoint: ret.data.read("S32")/10, // °C
absAirPressure: ret.data.read("U32")/100, // hPa
relAirPressure: ret.data.read("U32")/100, // hPa
};
print(string(data));
} else {
print("Read Failed, err=",string(ret));
}
// === WRITE TEST ===
let arrayData = [1,2,3,4,5,6,7,8];
let data = bin.fromArray(arrayData,"U16","AB"); // Convert array into packed binary structure
ret = modbus.write(0, // port: 0=tcp, 1=serial,
1, // slave unitID
16, // function, 16 = write multiple registers
0, // start register
arrayData.length, // register / coil count
data // data to write
);
if(ret === 0){
print("Write Successful");
} else {
print("Modbus Write Failed, err=",ret);
}
modbus.disconnect();
} else {
print("Modbus Connect Failed, err=",ret);
}