JavaScript 解析 Modbus 响应数据的实现方法
Modbus 协议作为工业自动化领域常用的通信协议,其数据传输采用二进制格式。在前端 JavaScript 中处理 Modbus 响应数据时,需要将字节数组解析为实际有意义的数据类型。本文将介绍如何实现 Modbus 常用数据类型的解析函数。
数据解析基础
Modbus 协议通常使用大端模式(Big-Endian)存储多字节数据,即高位字节在前,低位字节在后。我们需要根据这一特点实现不同数据类型的解析函数。
解析函数实现
1. 无符号 16 位整数解析
function parseUInt16(bytes, offset) {return (bytes[offset] << 8) | bytes[offset + 1];
}
这个函数将两个连续字节解析为一个无符号 16 位整数。通过左移 8 位将第一个字节作为高位,再与第二个字节进行按位或运算,组合成完整的 16 位数值。
2. 无符号 32 位整数解析
function parseUInt32(bytes, offset) {return (bytes[offset] << 24) | (bytes[offset + 1] << 16) | (bytes[offset + 2] << 8) | bytes[offset + 3];
}
通过将四个字节分别左移 24 位、16 位、8 位和 0 位,然后进行按位或运算组合成 32 位数值。
3. 字符串解析
function parseString(bytes, start, length) {const end = Math.min(start + length, bytes.length);let str = '';for (let i = start; i < end; i++) {if (bytes[i] === 0) break; // 遇到0x00终止str += String.fromCharCode(bytes[i]);}return str;
}
该函数从指定位置开始解析字符串,直到遇到终止符 0x00 或达到指定长度。
4. 有符号 16 位整数解析
function parseInt16(bytes, offset) {let value = (bytes[offset] << 8) | bytes[offset + 1];// 处理负数,16位有符号整数的范围是-32768到32767return value > 32767 ? value - 65536 : value;
}
5. 32 位浮点数解析
function parseFloat32(bytes, offset) {const buffer = new ArrayBuffer(4);const view = new DataView(buffer);// 将字节写入DataView(大端模式)view.setUint8(0, bytes[offset]);view.setUint8(1, bytes[offset + 1]);view.setUint8(2, bytes[offset + 2]);view.setUint8(3, bytes[offset + 3]);return view.getFloat32(0, false); // false表示大端模式
}
解析函数使用说明
错误处理:在实际应用中,需要添加边界检查,确保不会访问超出字节数组范围的索引。
数据类型转换:某些传感器数据可能需要额外的转换(如示例中的温度值除以 10),这取决于具体设备的协议定义。
字节序注意:大多数 Modbus 设备使用大端模式,但也有例外,使用时需参考设备手册。
应用场景:这些解析函数可用于 WebSocket 接收 Modbus 数据后的处理,或处理通过串口转 TCP/IP 获取的 Modbus 数据。