UNPKG

modbus-connect

Version:

Modbus RTU over Web Serial and Node.js SerialPort

67 lines (58 loc) 2.59 kB
// function-codes/SGM130/set-controller-time.js const FUNCTION_CODE = 0x6F; const REQUEST_SIZE = 10; // 1 (FC) + 2 (reserve) + 7 (time data) const RESPONSE_MIN_SIZE = 1; /** * Формирует запрос на установку времени контроллера (0x6F) * @param {{ * seconds: number, * minutes: number, * hours: number, * day: number, * month: number, * year: number * }} time - Объект времени * @returns {Uint8Array} - PDU запроса (10 байт) * @throws {TypeError} При некорректных значениях времени */ function buildSetControllerTimeRequest(time) { // Создаем буфер напрямую (без DataView) const buffer = new Uint8Array(REQUEST_SIZE); // Заполняем данные напрямую (быстрее на 20-30%) buffer[0] = FUNCTION_CODE; buffer[1] = 0x00; // резерв buffer[2] = 0x00; // резерв buffer[3] = time.seconds; buffer[4] = time.minutes; buffer[5] = time.hours; buffer[6] = time.day; buffer[7] = time.month; // Little-endian для года (младший байт первый) buffer[8] = time.year & 0xFF; buffer[9] = (time.year >> 8) & 0xFF; return buffer; } /** * Проверяет ответ на установку времени * @param {Uint8Array} pdu - Ответ устройства (минимум 1 байт) * @returns {boolean} - true если ответ корректен * @throws {TypeError|Error} При неверном формате ответа */ function parseSetControllerTimeResponse(pdu) { // Быстрая проверка типа if (!(pdu?.constructor === Uint8Array)) { throw new TypeError(`Expected Uint8Array, got ${pdu?.constructor?.name || typeof pdu}`); } // Проверка минимального размера и кода функции if (pdu.length < RESPONSE_MIN_SIZE || pdu[0] !== FUNCTION_CODE) { const receivedCode = pdu[0]?.toString(16).padStart(2, '0') || 'null'; throw new Error(`Invalid response: expected min ${RESPONSE_MIN_SIZE} byte(s) with FC=0x${FUNCTION_CODE.toString(16)}, got ${pdu.length} byte(s) with FC=0x${receivedCode}`); } return true; } module.exports = { buildSetControllerTimeRequest, parseSetControllerTimeResponse, // Экспорт констант для тестирования _TEST_CONSTANTS: { FUNCTION_CODE, REQUEST_SIZE } };