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