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