本文介绍如何利用ModbusJs库快速开发Modbus TCP Master。相关源码请登录网信数智 (wangxinzhihui.com)下载。
ModbusJs是一个基于Nodejs的Modbus TCP的开发库,目前支持的功能函数有:
- readCoils
- readDiscreteInputs
- readHoldingRegisters
- readInputRegisters
- writeSingleCoil
- writeSingleRegister
- writeMultipleCoils
- writeMultipleCoilsSameValue
- writeMultipleRegisters
- writeMultipleRegistersSameValue
- 安装modbusjs
npm install modbusjs
2. 引入ModbusJS
var ModbusTcpClient = require('modbusjs').ModbusTcpClient;
3. 创建Modbus TCP客户端
var mtcp = new ModbusTcpClient('localhost', 502, {debug: true});
4. 创建相关事件处理
//连接事件处理
modbusTcpClient.connect().then(function(){
// Success
}).catch(function(err){
// Error
});
//断开连接事件处理
modbusTcpClient.disconnect().then(function(){
// Success
}).catch(function(err){
// Error (ie. no active connection)
});
//重连事件处理
modbusTcpClient.reconnect().then(function(){
// Success
}).catch(function(err){
// Error
});
//错误事件处理
modbusTcpClient.on('error', function(err){
console.log('ERROR - ' + err);
});
5. 读操作
a) 读多个线圈:function readCoils(address, length[,options])
如:读取地址0开始10个线圈值。
modbusTcpClient.readCoils(0, 10).then(function(result){
// Success
}).catch(function(err){
// Error
});
b) 读多个离散输入:function readDiscreteInputs(address, length[,options])
如:读取地址1开始8个离散输入值。
modbusTcpClient. readDiscreteInputs (1, 8).then(function(result){
// Success
}).catch(function(err){
// Error
});
c) 读多个保持寄存器:function readHoldingRegisters(address, length[,options])
如:读取保持寄存器地址10开始20个寄存器。
modbusTcpClient. readHoldingRegisters (10, 20).then(function(result){
// Success
}).catch(function(err){
// Error
});
d) 读多个输入寄存器:function readInputgRegisters(address, length[,options])
如:读取输入寄存器地址5开始10个寄存器。
modbusTcpClient. readInputgRegisters (5, 10).then(function(result){
// Success
}).catch(function(err){
// Error
});
6) 写操作
a) 写单个线圈值:function writeSingleCoil(address, value[,options])
如:写地址6的线圈值为0。
modbusTcpClient.writeSingleCoil(6, 0).then(function(res){
// Success
}).catch(function(err){
// Error
})
b) 写单个保持寄存器:function writeSingleRegister (address, value[,options])
如:写地址10的保持寄存器值为1234。
modbusTcpClient. writeSingleRegister (10, 1234).then(function(res){
// Success
}).catch(function(err){
// Error
})
c) 写多个线圈不同值:function writeMultipleCoils (address, value[,options])
如:往地址6开始的线圈依次写入true, false, false, true, 0, 0, 1。
modbusTcpClient. writeMultipleCoils (6, [true, false, false, true, 0, 0, 1]).then(function(res){
// Success
}).catch(function(err){
// Error
})
d) 写多个线圈相同值:function writeMultipleCoilsSameValue(address, length, value[,options])
如:往地址为1开始20个线圈写入值1。
modbusTcpClient.writeMultipleCoilsSameValue(1, 20, true).then(function(res){
// Success
}).catch(function(err){
// Error
})
e) 写多个保持寄存器不同值:function writeMultipleRegisters (address, value[,options])
如:往地址6开始的保持寄存器依次写入1,2,3,4,5,6,7,8。
modbusTcpClient. writeMultipleRegisters (6, [1,2,3,4,5,6,7,8
]).then(function(res){
// Success
}).catch(function(err){
// Error
})
f) 写多个保持寄存器相同值:function writeMultipleRegistersSameValue (address, length, value[,options])
如:往地址为1开始20个保持寄存器写入值345。
modbusTcpClient. writeMultipleRegistersSameValue (1, 20, 345).then(function(res){
// Success
}).catch(function(err){
// Error
})
7. 示例:
//引入modbusjs
var ModbusTcpClient = require('modbusjs').ModbusTcpClient;
//创建ModbusTcpClient对象
var mtcp = new ModbusTcpClient('localhost', 502, {debug: true});
//创建连接事件处理
mtcp.on('connect', function(err){
console.log('连接成功');
}).on('error', function(err){
console.log('错误 - ' + err);
});
//创建连接断开事件处理
mtcp.on('disconnect', function(){
console.log('连接断开');
});
//顺序执行
mtcp.connect().then(function(){
//连接成功后读取线圈
mtcp.readCoils(0, 20).then(function(res){
console.log(res.result);
//读取保持寄存器
mtcp.readHoldingRegisters(11, 10).then(function(res){
console.log(res.result);
//循环执行
loop(1);
})
})
}).catch(function(err){
console.log(err);
});
//循环执行
function loop(r) {
var promises = [];
promises.push(mtcp.readCoils(0, 10));
promises.push(mtcp.readDiscreteInputs(0, 10));
promises.push(mtcp.readHoldingRegisters(1, 10));
promises.push(mtcp.readHoldingRegisters(10, 50, {unsigned: true}));
promises.push(mtcp.readInputgRegisters(0, 30));
Promise.all(promises).then(function(results){
console.log("REQUEST "+r);
console.log("===============");
results.forEach(function(result){
console.log(JSON.stringify(result.result));
});
}).catch(function(err){
console.log(err);
});
setTimeout(function(){execute(r+1)}, 500);
}
更多通讯资源请登录网信数智 (wangxinzhihui.com)。