纺织行业的设备种类多、协议杂,织机、浆纱机、络筒机往往来自不同厂家,数据接口各不相同。传统的做法是用组态软件或PLC上位机做采集,成本高、扩展性差。而Node.js凭借异步IO和丰富的基础生态,非常适合做这类高并发、多连接的数据采集网关,一台普通的工控机就能轻松接入几百路设备数据。本文将从通信协议接入、数据解析、实时推送、存储与看板几个方面,完整讲解实现方案。

一、整体架构设计与通信方式选型
一套典型的纺织机械监控系统可以划分为四层:设备层、采集层、服务层和展示层。设备层是各类纺织机械本身,采集层是运行Node.js的边缘网关(通常是一台工控机或树莓派),服务层负责数据汇聚、存储与业务逻辑,展示层则是浏览器端或大屏看板。
通信方式上,纺织机械最常见的是两种:串口通信(RS-232/RS-485)和以太网通信(Modbus TCP)。老式织机大多通过RS-485总线输出状态信号,支持Modbus RTU协议;较新的设备则直接提供以太网口,走Modbus TCP或者厂家私有TCP协议。Node.js处理串口需要借助第三方库,处理TCP则可以直接使用内置的net模块。
下面先安装依赖:
npm install serialport modbus-serial mysql2 ws
二、通过Modbus协议读取纺织机械数据
Modbus是工业领域事实上的标准,绝大多数纺织机械的PLC都支持。modbus-serial这个库同时封装了RTU和TCP两种模式,API完全一致,切换成本很低。以读取一台络筒机的运行状态为例,假设转速存放在保持寄存器40001,断纱计数在40002:
const ModbusRTU = require('modbus-serial');
const client = new ModbusRTU();
async function start() {
// TCP方式连接设备,RTU方式改用 connectRTUBuffered('/dev/ttyUSB0', {baudRate: 9600})
await client.connectTCP('192.168.0.10', { port: 502 });
client.setID(1); // Modbus从站地址
setInterval(async () => {
try {
// 从寄存器0开始读8个字,包含转速、断纱数、产量等
const data = await client.readHoldingRegisters(0, 8);
const rpm = data.data[0]; // 主轴转速
const yarnBreak = data.data[1]; // 断纱次数
const output = data.data[2]; // 当班产量(米)
console.log(`转速: ${rpm} r/min, 断纱: ${yarnBreak} 次, 产量: ${output} m`);
} catch (e) {
console.error('读取失败,设备可能离线:', e.message);
}
}, 3000);
}
start();这段代码每3秒轮询一次寄存器,拿到了最基础的三项数据。实际项目中要注意两点:一是RS-485总线上往往挂了多台设备,需要轮流切换setID逐台读取,两次请求之间留出50毫秒以上的间隔,避免总线冲突;二是寄存器地址表每个厂家不同,务必向设备厂商索取点表文档,不能凭猜测写地址。
对于不支持Modbus的老式织机,还可以监听其电控柜输出的开关量信号,通过串口报文或GPIO捕获后自行解析,思路是一样的,只是解析层需要针对具体报文格式写解析函数。
三、数据解析、异常判断与本地缓冲
原始寄存器值只是数字,要变成有意义的信息还需要一步解析。比如转速低于某个阈值可以判定为停机,断纱计数在一个轮询周期内增长说明发生了断纱事件。这些业务判断放在采集层做,可以就地触发报警,即使网络中断也不影响本地记录。
class MachineState {
constructor(id) {
this.id = id;
this.lastBreakCount = 0;
this.status = 'unknown'; // running / stopped / alarm
}
update(rpm, yarnBreak) {
const breakDelta = yarnBreak - this.lastBreakCount;
this.lastBreakCount = yarnBreak;
if (rpm < 50) {
this.status = 'stopped';
} else if (breakDelta > 0) {
this.status = 'alarm';
} else {
this.status = 'running';
}
return { id: this.id, rpm, yarnBreak, status: this.status, breakDelta, ts: Date.now() };
}
}另一个工程细节是本地缓冲。纺织车间网络环境不一定稳定,采集端应该把数据先写入本地队列(内存数组或SQLite),网络恢复后再批量上传到服务端。这个小设计能避免数据空洞,做产量统计时尤其重要。
四、WebSocket实时推送到监控看板
采集到数据后,管理层和车间大屏需要实时看到每台机器的状态。HTTP轮询延迟高、开销大,WebSocket是最合适的方案。Node.js侧用ws库建立一个推送服务,采集进程每读完一轮数据,就把所有机器的状态广播出去:
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
function broadcast(payload) {
const msg = JSON.stringify(payload);
wss.clients.forEach(ws => {
if (ws.readyState === WebSocket.OPEN) ws.send(msg);
});
}
// 采集到数据后调用
// broadcast({ type: 'machines', data: allMachineSnapshot });浏览器端用原生WebSocket API接收,配合简单的DOM更新就能做出一个实时状态墙:
<script>
const ws = new WebSocket('ws://192.168.0.20:8080');
ws.onmessage = (e) => {
const machines = JSON.parse(e.data).data;
machines.forEach(m => {
const el = document.getElementById('machine-' + m.id);
if (el) {
el.querySelector('.rpm').textContent = m.rpm;
el.className = 'card ' + m.status; // 用颜色区分运行/停机/报警
}
});
};
</script>如果设备数量上千、并发连接的客户端也多,可以把ws换成Socket.IO并配合Redis做横向扩展,不过对多数中型纺织厂来说单节点已经绰绰有余。
五、数据存储与效率分析
实时数据看板之外,历史数据入库是做OEE(设备综合效率)分析和产量报表的基础。MySQL是常见选择,采集数据按每台机器每条记录一行存储,时间字段加索引:
CREATE TABLE machine_log ( id BIGINT AUTO_INCREMENT PRIMARY KEY, machine_id SMALLINT NOT NULL, rpm SMALLINT, yarn_break INT, output_m INT, status VARCHAR(10), ts DATETIME NOT NULL, INDEX idx_ts (ts), INDEX idx_machine_ts (machine_id, ts) );
写入时注意批量插入,攒够一批或每隔几秒统一写一次,比逐条插入性能高出很多。Node.js侧配合mysql2的连接池即可:
const mysql = require('mysql2/promise');
const pool = mysql.createPool({ host: '127.0.0.1', user: 'root', database: 'textile' });
async function saveBatch(rows) {
const sql = 'INSERT INTO machine_log (machine_id, rpm, yarn_break, output_m, status, ts) VALUES ?';
await pool.query(sql, [rows.map(r => [r.id, r.rpm, r.yarnBreak, r.output, r.status, new Date(r.ts)])]);
}有了历史数据,就可以统计每台织机的运转率、平均转速、断纱频次,进而识别出效率低下的设备安排检修,也能为排产决策提供依据。数据量增长后,可以把超过半年的明细归档到ClickHouse这类列式库,MySQL只保留近期热数据。
整套方案跑起来之后,一台4核工控机接入两三百台织机毫无压力,CPU占用通常在10%以内。Node.js单线程模型在IO密集的采集场景里反而是优势,只要避免在主线程里做重量级计算,稳定性完全可以满足7乘24小时的车间运行要求。