当前位置:首页 > JavaScript

js实现modbustcp

2026-03-15 06:33:14JavaScript

Modbus TCP 协议简介

Modbus TCP 是基于 TCP/IP 的 Modbus 协议变种,使用端口 502,数据帧去除了校验字段(由 TCP 层保证可靠性)。协议格式如下:

  • 事务标识符(2 字节):用于请求/响应匹配。
  • 协议标识符(2 字节):固定为 0x0000
  • 长度字段(2 字节):后续字节数。
  • 单元标识符(1 字节):设备地址。
  • 功能码(1 字节):如 0x03(读保持寄存器)。
  • 数据字段(可变):根据功能码变化。

JavaScript 实现方案

使用 Node.js 的 net 模块

通过 Node.js 的 net.Socket 可直接与 Modbus TCP 设备通信。以下为读取保持寄存器的示例:

const net = require('net');

// 配置设备参数
const device = {
  host: '192.168.1.100',
  port: 502,
  unitId: 1,
  startAddr: 0,
  registerCount: 10
};

// 创建 Modbus TCP 请求帧
function createReadHoldingRegistersRequest(unitId, startAddr, count) {
  const buffer = Buffer.alloc(12);
  buffer.writeUInt16BE(1, 0); // 事务标识符(示例值)
  buffer.writeUInt16BE(0, 2); // 协议标识符
  buffer.writeUInt16BE(6, 4); // 长度字段(后续 6 字节)
  buffer.writeUInt8(unitId, 6); // 单元标识符
  buffer.writeUInt8(0x03, 7); // 功能码:读保持寄存器
  buffer.writeUInt16BE(startAddr, 8); // 起始地址
  buffer.writeUInt16BE(count, 10); // 寄存器数量
  return buffer;
}

// 发送请求并解析响应
const client = new net.Socket();
client.connect(device.port, device.host, () => {
  const request = createReadHoldingRegistersRequest(
    device.unitId,
    device.startAddr,
    device.registerCount
  );
  client.write(request);
});

client.on('data', (data) => {
  const unitId = data.readUInt8(6);
  const funcCode = data.readUInt8(7);
  const byteCount = data.readUInt8(8);
  const registers = [];

  for (let i = 0; i < byteCount / 2; i++) {
    registers.push(data.readUInt16BE(9 + i * 2));
  }
  console.log('响应数据:', registers);
  client.end();
});

client.on('error', (err) => {
  console.error('通信错误:', err);
});

使用第三方库

若需快速开发,可选用以下库:

  • modbus-serial:支持 TCP 和 RTU。

    npm install modbus-serial

    示例代码:

    const ModbusRTU = require("modbus-serial");
    const client = new ModbusRTU.ClientTCP({
      host: "192.168.1.100",
      port: 502,
    });
    
    client.readHoldingRegisters(0, 10)
      .then((data) => console.log(data))
      .catch((err) => console.error(err));
  • jsmodbus:纯 JavaScript 实现。

    npm install jsmodbus

    示例代码:

    js实现modbustcp

    const Modbus = require('jsmodbus');
    const net = require('net');
    
    const socket = new net.Socket();
    const client = new Modbus.client.TCP(socket, 1);
    
    socket.connect({ host: '192.168.1.100', port: 502 }, () => {
      client.readHoldingRegisters(0, 10)
        .then((resp) => console.log(resp.response._body.values))
        .catch(console.error);
    });

注意事项

  • 字节序处理:Modbus 协议默认使用大端序(Big-Endian),需通过 BufferwriteUInt16BE 等方法正确处理。
  • 超时机制:添加超时逻辑避免无响应阻塞,例如 socket.setTimeout(3000)
  • 错误处理:检查功能码高位是否为 0x80(异常响应),并解析异常码。
  • 性能优化:复用 TCP 连接,避免频繁创建/销毁 Socket。

标签: jsmodbustcp
分享给朋友:

相关文章

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js 实现全屏

js 实现全屏

使用 requestFullscreen 方法 通过调用元素的 requestFullscreen 方法可以实现全屏。该方法兼容现代浏览器,但不同浏览器可能需要前缀。 const element =…