js实现modbustcp
Modbus TCP 协议简介
Modbus TCP 是一种基于 TCP/IP 协议的工业通信协议,用于设备间的数据交换。其协议格式简单,通常由事务标识符、协议标识符、长度、单元标识符和功能码组成。
实现 Modbus TCP 的基本步骤
建立 TCP 连接
使用 Node.js 的 net 模块创建 TCP 客户端,连接到 Modbus TCP 服务器。以下是一个简单的连接示例:
const net = require('net');
const client = new net.Socket();
client.connect(502, '192.168.1.1', () => {
console.log('Connected to Modbus TCP server');
});
client.on('error', (err) => {
console.error('Connection error:', err);
});
构造 Modbus TCP 请求帧
Modbus TCP 帧包含以下字段:
- 事务标识符(2字节):用于匹配请求和响应。
- 协议标识符(2字节):固定为 0x0000。
- 长度(2字节):后续字节数。
- 单元标识符(1字节):设备地址。
- 功能码(1字节):如 0x03(读取保持寄存器)。
- 数据部分(可变长度)。
示例代码构造读取保持寄存器的请求:

function buildReadHoldingRegistersRequest(unitId, startAddress, quantity) {
const transactionId = 0x0001;
const protocolId = 0x0000;
const length = 6; // Unit ID + Function Code + Start Address + Quantity
const functionCode = 0x03;
const buffer = Buffer.alloc(12);
buffer.writeUInt16BE(transactionId, 0);
buffer.writeUInt16BE(protocolId, 2);
buffer.writeUInt16BE(length, 4);
buffer.writeUInt8(unitId, 6);
buffer.writeUInt8(functionCode, 7);
buffer.writeUInt16BE(startAddress, 8);
buffer.writeUInt16BE(quantity, 10);
return buffer;
}
发送请求并解析响应
发送请求后,解析服务器返回的响应帧。响应帧的结构与请求类似,但数据部分包含寄存器的值。
示例代码解析读取保持寄存器的响应:

client.on('data', (data) => {
const transactionId = data.readUInt16BE(0);
const protocolId = data.readUInt16BE(2);
const length = data.readUInt16BE(4);
const unitId = data.readUInt8(6);
const functionCode = 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);
});
错误处理
Modbus TCP 协议中,如果请求出错,服务器会返回异常响应,功能码的最高位设置为 1,并附带错误码。
示例代码检查异常响应:
client.on('data', (data) => {
const functionCode = data.readUInt8(7);
if (functionCode & 0x80) {
const errorCode = data.readUInt8(8);
console.error('Modbus error:', errorCode);
}
});
使用现成库简化开发
如果需要更完整的实现,可以使用现成的库如 modbus-serial:
const ModbusRTU = require('modbus-serial');
const client = new ModbusRTU.ClientTCP({
host: '192.168.1.1',
port: 502,
timeout: 2000
});
client.connect().then(() => {
return client.readHoldingRegisters(0, 10);
}).then((data) => {
console.log('Read holding registers:', data.data);
}).catch((err) => {
console.error('Error:', err);
});
注意事项
- 确保 Modbus TCP 服务器的 IP 和端口正确。
- 处理网络断开和重连逻辑。
- 根据实际需求调整超时时间。
- 对于大规模数据传输,考虑分批次请求。






