我使用以下代码来模拟modbus从设备:
const modbus = require('jsmodbus')
const SerialPort = require('serialport')
const options = {
baudRate: 115200
}
const socket = new SerialPort("COM4", options)
const server = new modbus.server.RTU(socket)
server.on('connect', function (client) {
console.log("in connect")
console.log(client);
});
server.on('connection', function (client) {
console.log("in connection")
console.log(client);
});
server.on('readHoldingRegisters', function (adr, len) {
console.log("in readHoldingRegisters")
console.log("adr: " + adr);
console.log("len: " + len);
});
上面的代码实际上模拟了一个设备。当我运行此代码时,我设置的主设备可以看到从设备。问题是我似乎无法让服务器功能到达其
console.log
部分。
我有两种理论。
首先,我的从设备使用 jsmodbus 库来模拟服务器,而我的主设备使用 modbus-serial 进行通信。这会导致问题吗?
我的第二个理论是,我上面的代码是同时运行的,不会环顾四周或保持开放状态以查看未来的通信。我该如何解决这个问题?
我也对新理论持开放态度。我的目标最终是通过
server.on
命令将 modbus 数据传回主机。
编辑
直接读取串口数据就知道有数据进来了:
socket.on('readable', function () {
console.log('Data:', socket.read()) //prints incoming buffer data
});
我仍然没有通过服务器命令获取数据。
我已添加答案关于此处发布的其他问题。
简而言之,事件侦听器当前仅在显式禁用缓冲区时才起作用:
const server = new modbus.server.RTU(socket, { coils: undefined, /* ... */ })