modbus-connect
Version:
Modbus RTU over Web Serial and Node.js SerialPort
54 lines (46 loc) • 2.06 kB
JavaScript
// 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
}