在航天地面支持设备中,发射场控制系统的核心任务是把分散的阀门、传感器与点火控制器纳入统一调度。DeLaunch是一套面向小型试验台的控制框架,借助Node.js的非阻塞IO与丰富生态,可以用较少代码完成设备接入、时序编排与遥测推送。

系统总体架构
DeLaunch采用主从式结构。主进程负责接收操作员指令、维护全局状态机,并通过子进程隔离直接操作硬件的模块。这样的设计能在子进程异常退出时,由主进程重启并恢复上下文,避免单点故障导致整个控制面瘫痪。
设备层一般包含串口继电器、PLC网关与以太网采集卡。Node.js通过serialport包处理串口,用net模块对接TCP设备,再用ws库把状态变更推送给监控前端。所有外部事件都转化为内部消息,在事件总线上流动,业务逻辑只关心消息类型而非物理接口。
状态机设计
发射流程有严格的阶段约束,例如"预增压"未完成不能进入"点火准备"。我们用一个显式状态机描述这些跃迁,把危险操作锁死在非允许状态之外。
const states = {
IDLE: 'idle',
PREPRESS: 'prepress',
READY: 'ready',
IGNITE: 'ignite',
ABORT: 'abort'
};
let current = states.IDLE;
function transition(next) {
const allowed = {
idle: ['prepress', 'abort'],
prepress: ['ready', 'abort'],
ready: ['ignite', 'abort'],
ignite: ['abort'],
abort: ['idle']
};
if (allowed[current].includes(next)) {
current = next;
return true;
}
return false;
}
上述代码把状态跃迁表写在对象中,易于审查和单元测试。实际系统中会把每次跃迁记录到审计日志,供事后回溯。
设备通信实现
串口设备通常协议简单但容错差,需要在应用层加重发与校验。下面示例展示如何用Node.js打开串口并解析帧。
const SerialPort = require('serialport');
const port = new SerialPort('/dev/ttyUSB0', { baudRate: 9600 });
port.on('data', (buf) => {
// 假设帧格式:0xAA 长度 命令 校验
if (buf[0] === 0xAA) {
const len = buf[1];
const cmd = buf[2];
const sum = buf.slice(3, 3 + len).reduce((a, b) => a + b, 0) & 0xFF;
if (sum === buf[3 + len]) {
console.log('valid frame cmd=' + cmd);
}
}
});
对于TCP设备,我们复用net.Socket,在data事件中做缓冲拼接,防止半包。WebSocket部分则用ws广播状态,前端拿到的是已脱敏的遥测,不直接暴露控制端口。
子进程隔离
直接发点火指令的模块放在独立子进程,主进程用child_process.fork启动,通过message事件收结果。这样即使子进程因硬件异常崩溃,主循环依旧存活。
const { fork } = require('child_process');
const igniter = fork('./igniter.js');
igniter.on('message', (m) => {
if (m.type === 'done') {
transition('ignite');
}
});
// 主进程收到操作员确认后
igniter.send({ cmd: 'fire', token: 'op-123' });
子进程内部再做一次权限校验,确认token有效才驱动GPIO或串口。双层校验降低误触发概率。
性能与扩容
Node.js单线程处理IO足够应付几百路传感器,但密集计算应交给Worker或子进程。当地面站需要多节点部署时,用cluster模块启动多个实例,前面加一层负载,把WebSocket连接分散开。
| 方案 | 延迟 | 扩展方式 |
|---|---|---|
| 轮询架构 | 百毫秒级 | 加线程 |
| 事件驱动 | 毫秒级 | 加节点 |
从表里能看出,事件模型在控制环路中优势明显。DeLaunch把关键路径保持在主事件循环,非关键日志入库走异步队列,互不阻塞。
常见误区
有人把setTimeout当精确定时器用,在Node里它受事件循环影响,误差可能到几十毫秒。发射时序若依赖它,会出现错位。正确做法是用硬件时钟或实时操作系统配合,Node只发"允许窗口"而非具体微秒点。
控制系统的可靠性优先于开发便利,任何抽象都不能掩盖物理约束。
DeLaunch在Node.js上验证了轻量发射场控制的可行性,但生产环境仍需冗余电源、独立急停与人工确认环节,软件只是其中一环。