当前位置:首页 > JavaScript

js实现modbustcp

2026-04-07 00:02:57JavaScript

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(读取保持寄存器)。
  • 数据部分(可变长度)。

示例代码构造读取保持寄存器的请求:

js实现modbustcp

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;
}

发送请求并解析响应

发送请求后,解析服务器返回的响应帧。响应帧的结构与请求类似,但数据部分包含寄存器的值。

示例代码解析读取保持寄存器的响应:

js实现modbustcp

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 和端口正确。
  • 处理网络断开和重连逻辑。
  • 根据实际需求调整超时时间。
  • 对于大规模数据传输,考虑分批次请求。

标签: jsmodbustcp
分享给朋友:

相关文章

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…

js实现路由

js实现路由

js实现路由的方法 在JavaScript中实现路由功能可以通过多种方式完成,以下是几种常见的方法: 使用原生JavaScript实现路由 通过监听window.onhashchange事件来实现基…

js实现显示隐藏

js实现显示隐藏

显示隐藏的实现方法 在JavaScript中,实现元素的显示和隐藏可以通过多种方式完成。以下是几种常见的方法: 修改CSS的display属性 通过改变元素的display属性可以在none(隐藏)…

js实现原理

js实现原理

JavaScript 实现原理 JavaScript 是一种解释型语言,其实现原理涉及多个核心组件和运行机制,包括引擎、运行时环境、事件循环等。 引擎与解释执行 现代 JavaScript 引擎(如…