如何监视和控制台记录所有串行端口Modbus流量?
我一直在尝试使用一个node.js应用程序通过MODBUS RTU协议与PLC通信。我已经通过MODBUS TCP协议成功与PLC通信。但是,当我将相同的代码修改为MODBUS RTU时,我遇到了使应用程序和PLC相互查找的困难。
我一直使用的软件包是:串行端口jsmodbus
当前,我尝试使用不同的Modbus仿真器与PLC通信。其中之一被称为MODBUS SIM 32,可以证明连接和PLC设置都很好。但是,当我将node.js应用程序的设置与PLC对齐时,它刚刚结束了超时错误。我已经尝试过使用同一程序包中的Modbus TCP选项,并且效果很好。但是,当我从同一软件包切换到RTU选项时,除重新启动PLC单元外,总是会出现超时。然后我发现它会通过.data函数接收某些信息,据我所知。
我一直用于MODBUS RTU通信的代码如下:
const Modbus = require('jsmodbus');
const SerialPort = require('serialport');
function connectModbusRtu(baudRate,COMport, parity,dataBits,stopBits) {
const options = {
baudRate:baudRate,
dataBits:dataBits,
stopBits:stopBits,
Parity:parity
};
const modbusPort = new SerialPort(COMport, options);
const client = new Modbus.client.RTU(modbusPort, 1);
modbusPort.on('open', function(){
if(modbusPort.isOpen){
console.log('Connection through modbus established.');
client.writeSingleRegister(1,12)
.then(function(resp){
console.log('I wrote the answer.');
console.log(resp);
}).catch(function(err){
console.log('I had it wrong.');
console.log(err);
});
}else{
console.log('COMport open failure.');
}
})
modbusPort.on('data', function () {
console.log('------------Data------------');
console.log(arguments);
})
modbusPort.on('close',function() {
console.log('------------CLose------------');
console.log(arguments);
modbusPort.open();
});
modbusPort.on('error', function() {
console.log('------------General Error------------');
console.error;
});
return client;
}
module.exports = connectModbusRtu;
以下代码是我一直在使用的Modbus TCP:
const Modbus = require('jsmodbus');
const net = require('net');
function connectModbusTcp(host, port) {
const modbusSocket = new net.Socket();
const client = new Modbus.client.TCP(modbusSocket);
const options = {
host,
port
};
modbusSocket.on('connect', () =>
console.log('Connection through modbus established')
);
modbusSocket.on('error', console.error);
modbusSocket.connect(options);
return client;
}
module.exports = connectModbusTcp;
主要目标是在称为上述js脚本之一的主脚本之后,它应能够通过任何通道(RTU /串行端口或TCP /以太网)将正确的Modbus指令传递给PLC单元。请参见以下主要脚本:
const express = require('express');
const connectModbusTcp = require('../../modbus/connectModbusTcp');
const connectModbusRtu = require('../../modbus/connectModbusRtu');
const router = express.Router();
router.post('/', (req, res) => {
console.log('Establishing modbus connection');
const client = connectModbusRtu(9600,'COM4','NONE',8,1);
//const client = connectModbusTcp('192.168.1.124', 502);
req.app.set('modbusClient', client);
res.json({ msg: 'Establishing modbus connection' });
});
module.exports = router;
但是,我可以通过TCP代码集(而不是串行端口)完美地执行它。只是想知道是否有人在这个领域有经验,或者有一个有根据的猜测。
目前,我确实可以尝试任何意见。
谢谢!
罗兰
回答如下:您是否为自己创建了一个脚本?我们在办公室可以通过https://www.virtual-serial-port/article/modbus-decoder/描述这些程序包。还是出于其他目的?