UNPKG

modbus-connect

Version:

Modbus RTU over Web Serial and Node.js SerialPort

54 lines (46 loc) 2.06 kB
// function-codes/SGM130/read-file-length.js const { FUNCTION_CODES } = require('../../constants/constants.js'); /** * Формирует запрос для функции 0x52 (Read File Length). * @param {string} filename - Имя файла ASCII (без завершающего нуля) * @returns {Uint8Array} - PDU запроса */ function buildReadFileLengthRequest(filename) { // Преобразуем имя файла в ASCII коды const nameBytes = new TextEncoder().encode(filename); if (nameBytes.length > 0xFA) { throw new Error('Filename too long, max 250 bytes allowed'); } // Формируем PDU: [код функции, длина, имя файла..., 0x00] const pdu = new Uint8Array(2 + nameBytes.length + 1); pdu[0] = FUNCTION_CODES.READ_FILE_LENGTH; pdu[1] = nameBytes.length; pdu.set(nameBytes, 2); pdu[pdu.length - 1] = 0x00; // завершающий нулевой байт return pdu; } /** * Парсит ответ функции 0x52. * @param {Uint8Array} responsePdu - PDU ответа * @returns {number} - длина файла или -1, если файл отсутствует */ function parseReadFileLengthResponse(responsePdu) { if (responsePdu[0] !== FUNCTION_CODES.READ_FILE_LENGTH) { throw new Error(`Invalid function code in response: ${responsePdu[0]}`); } if (responsePdu.length !== 5) { throw new Error(`Invalid response length: expected 5 bytes, got ${responsePdu.length}`); } // Длина файла — 4 байта, big-endian const length = (responsePdu[1] << 24) | (responsePdu[2] << 16) | (responsePdu[3] << 8) | (responsePdu[4]); // Если длина равна 0xFFFFFFFF, вернуть -1 (файл отсутствует) return length === 0xFFFFFFFF ? -1 : length >>> 0; // >>> 0 для unsigned } module.exports = { buildReadFileLengthRequest, parseReadFileLengthResponse }