UNPKG

modbus-connect

Version:

Modbus RTU over Web Serial and Node.js SerialPort

72 lines (60 loc) 2.91 kB
// 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 }