AI使用 Node.js modbus-serial 搭建一个可交互的 Modbus TCP 主站与从站 Demo

在工业物联网和自动化控制领域,Modbus 协议依然是最常见的通信方式之一。为了更直观地理解 Modbus TCP 的工作机制,我用AI写了一个小 Demo:同时实现了 从站(Slave) 和 主站(Master),并且能在本地跑通数据交互。

Demo 功能
  • 从站每2秒更新寄存器0。
  • 主站每3秒读取寄存器0,并写寄存器1。
  • 控制台能看到双向交互,证明通信正常。
js 复制代码
// master.js
const ModbusRTU = require('modbus-serial')
const client = new ModbusRTU()

async function run() {
  try {
    await client.connectTCP('127.0.0.1', { port: 1502 })
    client.setID(1)
    console.log('✅ 主站已连接到从站')

    setInterval(async () => {
      try {
        // 读取保持寄存器0
        const data = await client.readHoldingRegisters(0, 1)
        console.log('📥 主站: 读取寄存器[0] =', data.data[0])

        // 写保持寄存器1
        const value = Math.floor(Math.random() * 100)
        await client.writeRegister(1, value)
        console.log('📤 主站: 写寄存器[1] =', value)
      } catch (err) {
        console.error('读写错误:', err.message)
      }
    }, 3000)
  } catch (err) {
    console.error('连接失败:', err.message)
  }
}

run()
js 复制代码
// slave.js
const ModbusRTU = require('modbus-serial')

// 模拟保持寄存器(100个,2字节/个)
let holdingRegisters = Buffer.alloc(100 * 2)

const vector = {
  // 读取保持寄存器
  getHoldingRegister: function (addr) {
    const value = holdingRegisters.readUInt16BE(addr * 2)
    console.log(`📥 从站: 读取保持寄存器[${addr}] = ${value}`)
    return Promise.resolve(value)
  },
  // 写保持寄存器
  setRegister: function (addr, value) {
    holdingRegisters.writeUInt16BE(value, addr * 2)
    console.log(`📤 从站: 写保持寄存器[${addr}] = ${value}`)
    return Promise.resolve()
  },
  // 读取线圈
  getCoil: function (addr) {
    return Promise.resolve(addr % 2 === 0)
  },
  // 写线圈
  setCoil: function (addr, value) {
    console.log(`📤 从站: 写线圈[${addr}] = ${value}`)
    return Promise.resolve()
  }
}

// 启动 Modbus TCP 从站
const customPort = 1502 // 自定义端口,避免与其他服务冲突
const serverTCP = new ModbusRTU.ServerTCP(vector, {
  host: '127.0.0.1',
  port: customPort,
  debug: true,
  unitID: 1
})

console.log(`✅ Modbus TCP 从站已启动,监听 127.0.0.1:${customPort}`)

// 模拟寄存器0的值每2秒变化
setInterval(() => {
  const randomValue = Math.floor(Math.random() * 1000)
  holdingRegisters.writeUInt16BE(randomValue, 0)
  console.log('🔄 从站: 更新寄存器[0] =', randomValue)
}, 2000)
运行
  1. npm install modbus-serial
  2. node slave.js
  3. node master.js
结果
git

modbusSlaveMasterNodeDemo

modbus-serial Modbus-TCP
相关推荐
前端之虎陈随易32 分钟前
编程语言级别的Skill市场,AI Agent 的未来形态
前端·vue.js·人工智能·typescript·node.js
国强_dev1 小时前
技术探讨:使用 stunnel 加密转发数据库连接时,如何获取客户端真实 IP?
数据库·网络协议·tcp/ip
云栖梦泽在8 小时前
Claude Code / Codex 使用卡顿怎么办?AI 编程 Agent 连接失败与网络排查思路
网络·人工智能·网络协议·chatgpt·性能优化
子不语18011 小时前
从0开始学习S7-1200+ET200SP(3)——两台S7-1200通过TCP连接
网络协议·学习·tcp/ip
折哥的程序人生 · 物流技术专研11 小时前
Java面试通关⑦:JavaWeb网络核心全集
网络协议·http·javaweb·校招·前后端交互·java面试·社招
huainingning12 小时前
锐捷ACL单向TCP互通组网-通过Established状态回包实现
服务器·网络·tcp/ip
huainingning12 小时前
锐捷ACL单向TCP互通组网-使用TCP三次握手SYN包置位为1实现
服务器·网络·tcp/ip
儒雅的烤地瓜13 小时前
计算机网络 | 路由器局域网(内网)IP和外网(公网)IP的区别与联系
网关·tcp/ip·智能路由器·ip·外网·内网·nat技术
meilindehuzi_a13 小时前
从零开始:用原生 Node.js 徒手拆解 RAG 与向量检索底层原理
node.js·rag
炒毛豆14 小时前
ai全栈-node.js相关的学习之路(草稿版)
学习·node.js