modbus-connect
Version:
Modbus RTU over Web Serial and Node.js SerialPort
58 lines (50 loc) • 1.95 kB
JavaScript
// function-codes/SGM130/set-controller-time.js
const FUNCTION_CODE = 0x6F;
const REQUEST_SIZE = 10;
const RESPONSE_MIN_SIZE = 1;
/**
* Формирует PDU-запрос для установки времени на контроллере.
* @param {{
* seconds: number,
* minutes: number,
* hours: number,
* day: number,
* month: number,
* year: number
* }} time - Объект с компонентами времени
* @returns {Uint8Array} - PDU запроса (10 байт)
* @throws {TypeError} Если параметры времени некорректны
*/
function buildSetControllerTimeRequest(time) {
const buffer = new ArrayBuffer(REQUEST_SIZE);
const view = new DataView(buffer);
view.setUint8(0, FUNCTION_CODE);
view.setUint8(1, 0x00); // резерв
view.setUint8(2, 0x00); // резерв
view.setUint8(3, time.seconds);
view.setUint8(4, time.minutes);
view.setUint8(5, time.hours);
view.setUint8(6, time.day);
view.setUint8(7, time.month);
view.setUint16(8, time.year, true); // little-endian
return new Uint8Array(buffer);
}
/**
* Проверяет ответ на команду установки времени.
* @param {Uint8Array} pdu - Полученный PDU ответа
* @returns {boolean} - true если ответ валиден
* @throws {Error} Если ответ некорректен
*/
function parseSetControllerTimeResponse(pdu) {
if (!(pdu instanceof Uint8Array)) {
throw new TypeError('PDU must be Uint8Array');
}
if (pdu.length < RESPONSE_MIN_SIZE || pdu[0] !== FUNCTION_CODE) {
throw new Error(`Invalid response: expected min ${RESPONSE_MIN_SIZE} bytes starting with 0x${FUNCTION_CODE.toString(16)}`);
}
return true;
}
module.exports = {
buildSetControllerTimeRequest,
parseSetControllerTimeResponse
};