modbus-connect
Version:
Modbus RTU over Web Serial and Node.js SerialPort
72 lines (60 loc) • 2.91 kB
JavaScript
// utils/detect-port-settings.js
const createTransport = require('./factory.js');
const ModbusClient = require('../client.js');
const COMMON_BAUD_RATES = [1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200];
const PARITIES = ['none', 'even', 'odd'];
const STOP_BITS = [1, 2];
const DATA_BITS = [7, 8]; // Добавил перебор dataBits
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
/**
* Автоопределение настроек порта (baudRate, parity, stopBits, dataBits) для Modbus RTU.
* Использует фабрику транспорта createTransport.
*
* @param {string} transportType - 'node' или 'web'
* @param {object} options - исходные опции, должны включать путь/порт: path (node) или port (web)
* @param {number} slaveId - ID Modbus устройства (по умолчанию 1)
* @param {Array<number>} baudRates - опциональный список скоростей, по умолчанию COMMON_BAUD_RATES
*
* @returns {object|null} Найденные настройки или null, если ничего не подошло
*/
async function detectPortSettings(transportType, options, slaveId = 1, baudRates = COMMON_BAUD_RATES) {
for (const baudRate of baudRates) {
for (const parity of PARITIES) {
for (const stopBits of STOP_BITS) {
for (const dataBits of DATA_BITS) {
const settings = {
...options,
baudRate,
parity,
stopBits,
dataBits,
};
let client;
try {
const transport = await createTransport(transportType, settings);
client = new ModbusClient(transport, slaveId, { timeout: 300 });
await client.connect();
// Попытка читать первый регистр — если успешно, значит настройки подходят
await client.readHoldingRegisters(0, 1);
await client.disconnect();
return settings;
} catch (err) {
if (client) {
try {
await client.disconnect();
} catch {}
}
// Ошибка — игнорируем и пробуем следующую конфигурацию
}
await delay(100);
}
}
}
}
return null;
}
module.exports = {
detectPortSettings
}