node-modbus-serial
node-modbus-serial copied to clipboard
RTU over socket (second PR)
The previous PR was undone because of a bug, happy to submit patches to work rather than undoing next time.
I've reproduced the issues, tested and issued a patch on this branch, with the help of information provided by @Jalle19.
I'll try to find some time to test this soon
Hello, When I set the timeout and read it twice
client.setTimeout(500); await client.readHoldingRegisters(0,10); await client.readHoldingRegisters(0,10);
It's time out!
I think there may be a problem with the following code
this._port._transactionIdWrite += 1;
Hello, When I set the timeout and read it twice
client.setTimeout(500); await client.readHoldingRegisters(0,10); await client.readHoldingRegisters(0,10);
It's time out!
I think there may be a problem with the following code
this._port._transactionIdWrite += 1;
Do you have a full example please? Here's what I've just tried.
const ModbusRTU = require("../index");
const modbusClient = new ModbusRTU()
modbusClient.setID(1)
modbusClient.setTimeout(500) // 5 seconds
modbusClient.connectRTUBuffered("/dev/pts/5", {
debug: true,
baudRate: 19200,
dataBits: 8,
parity: 'none',
stopBits: 1,
}, read);
async function read() {
await modbusClient.readHoldingRegisters(0,10)
.then(console.log)
.catch(console.err);
await modbusClient.readHoldingRegisters(0,10)
.then(console.log)
.catch(console.err);
}
/* eslint-disable no-console, no-unused-vars, spaced-comment */
// create an empty modbus client
const ModbusRTU = require("../index");
const holdingRegisters = {0: 1, 1: 2, 2: 3};
const coils = {};
const inputRegisters = {};
const discreteInputs = {};
const vector = {
getInputRegister: function(addr) {
return inputRegisters[addr];
},
getMultipleInputRegisters: function(startAddr, length) {
const values = [];
for (let i = 0; i < length; i++) {
values[i] = inputRegisters[startAddr + i];
}
return values;
},
getDiscreteInput: function(addr) {
return discreteInputs[addr];
},
getHoldingRegister: function(addr) {
return holdingRegisters[addr];
},
setRegister: function(addr, value) {
holdingRegisters[addr] = value;
return;
},
getMultipleHoldingRegisters: function(startAddr, length) {
const values = [];
for (let i = 0; i < length; i++) {
values[i] = holdingRegisters[startAddr + i];
}
return values;
},
getCoil: function(addr) {
return coils[addr];
},
setCoil: function(addr, value) {
coils[addr] = value;
return coils[addr];
},
readDeviceIdentification: function() {
return {
0x00: "MyVendorName",
0x01: "MyProductCode",
0x02: "MyMajorMinorRevision",
0x05: "MyModelName",
0x97: "MyExtendedObject1",
0xab: "MyExtendedObject2"
};
}
};
// set the server to answer for modbus requests
console.log("server listening...");
const serverTCP = new ModbusRTU.ServerSerial(vector,
{
port: "/dev/pts/6",
debug: true,
unitID: 1
},
{
baudRate: 19200,
dataBits: 8,
stopBits: 1,
parity: "none"
}
);
serverTCP.on("initialized", function() {
console.log("initialized");
});
serverTCP.on("socketError", function(err) {
console.error(err);
serverTCP.close(closed);
});
function closed() {
console.log("server closed");
}