文档中心 › 开发实践
Node.js / NestJS 搭建 PLC 数据采集网关
如果你更想自己造轮子,本文给一套可复用的分层思路。nscada 本身即按此结构实现,公开仓库里可参考协议驱动与队列实现。
一、模块怎么切
drivers/ —— 协议驱动统一接口:connect/read/write/disconnect
scheduler/ —— 周期/cron 任务,失败退避
pipeline/ —— 缩放、质量、批量落库
storage/ —— SQLite(分表 + WAL)
forwarding/ —— Outbox 队列 + HTTP/MQTT 发送器
web/ —— 免登录配置界面
核心原则:驱动可插拔、数据先落库、转发走队列。协议再多也只是多实现一个 read(tags)。
二、最小代码思路(伪码)
// 调度到点 →
const values = await driver.read(tags); // 读回点位
saveBatch(samples); // ① 写 SQLite(事务批量)
outbox.enqueue(mq(deviceId, values)); // ② 写待发队列
// 发送器循环 →
const rows = outbox.due();
for (const r of rows) await publish(r); // MQTT/HTTP
// 失败 → attempts+1, next_retry = now + 2^n·base
三、Node.js 做采集的取舍
- 优势:异步 IO 适合多设备轮询、生态丰富、TS 好维护、Web 界面可同进程交付;
- 注意:原生依赖(SQLite/串口)按目标平台预编译;低频采集场景 CPU 占用很低。
四、给你的建议
先做 Modbus + 一个任务循环跑通闭环,再补队列与死信,最后加界面。想少走弯路可直接用 nscada:在线 Demo、源码仓库与文档均可复用,欢迎在社区/开源仓库交流。
