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