当前位置:首页 > 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 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与…

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: functio…

js实现路由

js实现路由

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