UNPKG

modbus-connect

Version:

Modbus RTU over Web Serial and Node.js SerialPort

75 lines (65 loc) 2.21 kB
// function-codes/read-device-identification.js const { sliceUint8Array, fromBytes } = require('../utils/utils.js'); const { FUNCTION_CODES } = require('../constants/constants.js'); const FUNCTION_CODE = FUNCTION_CODES.READ_DEVICE_IDENTIFICATION; const MEI_TYPE = 0x0E; function buildReadDeviceIdentificationRequest(categoryId = 0x01, objectId = 0x00) { return fromBytes( FUNCTION_CODE, MEI_TYPE, categoryId, objectId ); } /** * Разбирает ответ функции 0x2B/0x0E (чтение идентификатора устройства). * @param {Uint8Array} response * @returns {{ * functionCode: number, * meiType: number, * category: number, * conformityLevel: number, * moreFollows: number, * nextObjectId: number, * numberOfObjects: number, * objects: Record<number, string> * }} */ function parseReadDeviceIdentificationResponse(response) { if (response.length < 7) { throw new Error('Invalid Device Identification response length'); } const functionCode = response[0]; const meiType = response[1]; const category = response[2]; const conformityLevel = response[3]; const moreFollows = response[4]; const nextObjectId = response[5]; const numberOfObjects = response[6]; let offset = 7; const objects = {}; // Используем windows-1251 для декодирования текста const decoder = new TextDecoder('windows-1251'); for (let i = 0; i < numberOfObjects; i++) { const objectId = response[offset]; const length = response[offset + 1]; const stringBytes = sliceUint8Array(response, offset + 2, offset + 2 + length); const value = decoder.decode(stringBytes); objects[objectId] = value; offset += 2 + length; } return { functionCode, meiType, category, conformityLevel, moreFollows, nextObjectId, numberOfObjects, objects }; } module.exports = { buildReadDeviceIdentificationRequest, parseReadDeviceIdentificationResponse }