modbus-serial
A pure JavaScript implemetation of MODBUS-RTU (Serial and TCP) for NodeJS.
Modbus is a serial communications protocol, first used in 1979.
Modbus is simple and robust, openly published, royalty-free and
easy to deploy and maintain.
This package makes Modbus calls and serve fun and easy.
Install
npm install modbus-serial
try these options on npm install to build, if you have problems to install
--unsafe-perm --build-from-source
What can I do with this module ?
This class makes it fun and easy to communicate with electronic
devices such as irrigation controllers, protocol droids and robots.
It talks with devices that use a serial line (e.g. RS485, RS232).
Many industrial electronic devices implement modbus.
Arduino can also talk modbus and you can control your projects and robots
using modbus.
Arduino libraries for modbus slave:
Arduino sketch for irrigation timer with modbus support:
Node Modbus-WebSocket bridge:
Compatibility
Version of NodeJS:
This module has not been tested on every single version of NodeJS. For best results you should stick to LTS versions, which are denoted by even major version numbers e.g. 4.x, 6.x, 8.x.
These classes are implemented:
Class | Function |
---|
FC1 "Read Coil Status" | readCoils(coil, len) |
FC2 "Read Input Status" | readDiscreteInputs(addr, arg) |
FC3 "Read Holding Registers" | readHoldingRegisters(addr, len) |
FC4 "Read Input Registers" | readInputRegisters(addr, len) |
FC5 "Force Single Coil" | writeCoil(coil, binary) //NOT setCoil |
FC6 "Preset Single Register" | |
FC15 "Force Multiple Coil" | writeRegister(addr, value) |
FC16 "Preset Multiple Registers" | writeRegisters(addr, valueAry) |
FC43/14 "Read Device Identification" (supported ports: TCP, RTU) | readDeviceIdentification(id, obj) |
Client Serial:
- modbus-RTU (SerialPort): Over serial line [require node serialport].
- modbus-RTU (RTUBufferedPort): Over buffered serial line [require node serialport].
- modbus-ASCII (AsciiPort): Over serial line [require node serialport].
Client TCP:
- modbus-TCP (TcpPort): Over TCP/IP line.
- modbus-RTU (UdpPort): Over C701 server, commercial UDP to serial bridge.
- modbus-RTU (TcpRTUBufferedPort): Over TCP/IP line, TCP/IP serial RTU buffered device.
- modbus-RTU (TelnetPort): Over Telnet server, TCP/IP serial bridge.
Server
- modbus-TCP (ServerTCP): Over TCP/IP line.
Examples
Read and Write
var ModbusRTU = require("modbus-serial");
var client = new ModbusRTU();
client.connectRTUBuffered("/dev/ttyUSB0", { baudRate: 9600 }, write);
function write() {
client.setID(1);
client.writeRegisters(5, [0 , 0xffff])
.then(read);
}
function read() {
client.readHoldingRegisters(5, 2)
.then(console.log);
}
Read on multiple slaves
const ModbusRTU = require("modbus-serial");
const client = new ModbusRTU();
client.connectRTUBuffered("/dev/ttyS0", { baudRate: 9600 });
client.setTimeout(500);
const metersIdList = [10, 11, 12, 13, 14];
const getMetersValue = async (meters) => {
try{
for(let meter of meters) {
console.log(await getMeterValue(meter));
await sleep(100);
}
} catch(e){
console.log(e)
} finally {
setImmediate(() => {
getMetersValue(metersIdList);
})
}
}
const getMeterValue = async (id) => {
try {
await client.setID(id);
let val = await client.readInputRegisters(0, 1);
return val.data[0];
} catch(e){
return -1
}
}
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
getMetersValue(metersIdList);
Logger Serial
var ModbusRTU = require("modbus-serial");
var client = new ModbusRTU();
client.connectRTUBuffered("/dev/ttyUSB0", { baudRate: 9600 });
client.setID(1);
setInterval(function() {
client.readHoldingRegisters(0, 10, function(err, data) {
console.log(data.data);
});
}, 1000);
Logger TCP
var ModbusRTU = require("modbus-serial");
var client = new ModbusRTU();
client.connectTCP("127.0.0.1", { port: 8502 });
client.setID(1);
setInterval(function() {
client.readHoldingRegisters(0, 10, function(err, data) {
console.log(data.data);
});
}, 1000);
Logger UDP
var ModbusRTU = require("modbus-serial");
var client = new ModbusRTU();
client.connectUDP("127.0.0.1", { port: 8502 });
client.setID(1);
setInterval(function() {
client.readHoldingRegisters(0, 10, function(err, data) {
console.log(data.data);
});
}, 1000);
ModbusTCP Server
var ModbusRTU = require("modbus-serial");
var vector = {
getInputRegister: function(addr, unitID) {
return addr;
},
getHoldingRegister: function(addr, unitID, callback) {
setTimeout(function() {
callback(null, addr + 8000);
}, 10);
},
getCoil: function(addr, unitID) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve((addr % 2) === 0);
}, 10);
});
},
setRegister: function(addr, value, unitID) {
console.log("set register", addr, value, unitID);
return;
},
setCoil: function(addr, value, unitID) {
console.log("set coil", addr, value, unitID);
return;
},
readDeviceIdentification: function(addr) {
return {
0x00: "MyVendorName",
0x01: "MyProductCode",
0x02: "MyMajorMinorRevision",
0x05: "MyModelName",
0x97: "MyExtendedObject1",
0xAB: "MyExtendedObject2"
};
}
};
console.log("ModbusTCP listening on modbus://0.0.0.0:8502");
var serverTCP = new ModbusRTU.ServerTCP(vector, { host: "0.0.0.0", port: 8502, debug: true, unitID: 1 });
serverTCP.on("socketError", function(err){
console.error(err);
});
to get more see Examples
Serial connection
node-modbus-serial use node-serialport for serial communication, for serial port options settings
it passes to serial port the openOptions object,
default serial port settings are 9600,8,n,1.
client.connectRTUBuffered("/dev/ttyUSB0", { baudRate: 9600, parity: 'even' });