UNPKG

modbus-connect

Version:

Modbus RTU over Web Serial and Node.js SerialPort

51 lines (43 loc) 1.71 kB
// function-codes/SGM130/openFile.js const { FUNCTION_CODES } = require('../../constants/constants.js'); /** * Формирует запрос для функции 0x55 (Open File). * @param {string} filename - Имя файла ASCII (без завершающего нуля) * @returns {Uint8Array} - PDU запроса */ function buildOpenFileRequest(filename) { 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.OPEN_FILE; // 0x55 pdu[1] = nameBytes.length; pdu.set(nameBytes, 2); pdu[pdu.length - 1] = 0x00; // завершающий нулевой байт return pdu; } /** * Парсит ответ функции 0x55 (Open File). * @param {Uint8Array} responsePdu - PDU ответа * @returns {number} - длина файла (4 байта, big-endian) */ function parseOpenFileResponse(responsePdu) { if (responsePdu[0] !== FUNCTION_CODES.OPEN_FILE) { 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}`); } const length = (responsePdu[1] << 24) | (responsePdu[2] << 16) | (responsePdu[3] << 8) | (responsePdu[4]); return length >>> 0; } module.exports = { buildOpenFileRequest, parseOpenFileResponse }