js实现modbustcp
Modbus TCP 协议简介
Modbus TCP 是一种基于 TCP/IP 的工业通信协议,常用于设备间的数据交换。其协议格式简单,数据帧包含事务标识符、协议标识符、长度、单元标识符和功能码等字段。
实现 Modbus TCP 的基本步骤
创建 TCP 客户端连接
使用 Node.js 的 net 模块建立与 Modbus TCP 服务器的连接。需要指定目标设备的 IP 地址和端口(默认 502)。

构造 Modbus 请求帧
请求帧的格式如下:
- 事务标识符(2 字节):用于匹配请求与响应
- 协议标识符(2 字节):Modbus TCP 固定为 0x0000
- 长度(2 字节):后续字节数
- 单元标识符(1 字节):设备地址
- 功能码(1 字节):如 0x03 读取保持寄存器
- 数据(可变长度):根据功能码变化
发送请求并处理响应
通过 TCP 连接发送构造好的请求帧,监听返回的数据流。响应帧结构与请求帧类似,需校验事务标识符和功能码是否匹配。

代码示例
以下是一个读取保持寄存器的示例实现:
const net = require('net');
// Modbus TCP 请求构造
function createReadRequest(unitId, startAddr, quantity) {
const buffer = Buffer.alloc(12);
buffer.writeUInt16BE(1, 0); // 事务ID
buffer.writeUInt16BE(0, 2); // 协议ID
buffer.writeUInt16BE(6, 4); // 长度
buffer.writeUInt8(unitId, 6); // 单元ID
buffer.writeUInt8(0x03, 7); // 功能码
buffer.writeUInt16BE(startAddr, 8); // 起始地址
buffer.writeUInt16BE(quantity, 10); // 寄存器数量
return buffer;
}
// 创建连接并发送请求
const client = new net.Socket();
client.connect(502, '192.168.1.100', () => {
const request = createReadRequest(1, 0, 10);
client.write(request);
});
// 处理响应
client.on('data', (data) => {
const unitId = data.readUInt8(6);
const funcCode = data.readUInt8(7);
const byteCount = data.readUInt8(8);
const values = [];
for (let i = 0; i < byteCount/2; i++) {
values.push(data.readUInt16BE(9 + i*2));
}
console.log(`Received values: ${values}`);
client.end();
});
错误处理
检查响应中的功能码高位是否置位(0x80),表示异常响应。异常代码会出现在数据字段的第一个字节,常见的异常代码包括:
- 0x01:非法功能码
- 0x02:非法数据地址
- 0x03:非法数据值
性能优化
对于高频通信场景,建议实现连接池管理和请求队列。事务标识符应确保唯一性,可采用递增计数器实现。大数据量读取可考虑分批次请求。






