Я пытался использовать одно приложение node.js для связи с ПЛК по протоколу MODBUS RTU. Я успешно связался с ПЛК по протоколу MODBUS TCP. Однако, когда я изменил тот же код для MODBUS RTU, у меня возникли трудности с тем, чтобы приложение и ПЛК нашли друг друга.
пакет, который я использовал, является: serialport jsmodbus
В настоящее времяЯ пытался использовать разные эмуляторы Modbus для связи с ПЛК. Один из них, который назывался MODBUS SIM 32, работал, что доказало, что соединение и настройка ПЛК просто в порядке. Однако, когда я выровнял настройки моего приложения node.js с ПЛК, это просто завершило ошибку тайм-аута. Я попробовал с опцией Modbus TCP из того же пакета, и он работал просто отлично. Но когда я переключался на опцию RTU из того же пакета, я всегда получал тайм-аут, за исключением случаев, когда модуль ПЛК перезагружался. Затем я узнал, что он получит что-то через функцию .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-сценариев, он сможет передаватьправильная инструкция Modbus через какой-либо канал (RTU / последовательный порт или TCP / ethernet) к модулю ПЛК. Пожалуйста, смотрите следующее для основного скрипта:
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, но не через последовательный порт. Просто интересно, есть ли у кого-то опыт в этой области или у него есть обоснованное предположение, чтобы начать с.
В настоящее время я нахожусь в месте, где я буквально попробую любое мнение.
Спасибо!
Roland