2. 工业设备软件运行环境剖析

工业设备软件的报警与恢复能力,首先取决于它运行在什么环境里。同样是“程序卡住”,PLC 的扫描周期超时、SCADA 的历史库写入阻塞、边缘控制器的容器 OOM,其成因、可观测信号和恢复手段完全不同。本节按“软件栈—实时性约束—典型失效场景”三条线索,逐一剖析六类典型运行载体,为后续报警设计与异常恢复建立环境基线。

一、六类载体的软件栈分层

从下往上,工业软件栈大致可分为五层:硬件与固件层(CPU、FPGA、BSP、Bootloader)、系统层(裸机循环、RTOS、Linux/Windows、Hypervisor)、运行时层(PLC 运行时、OPC UA 栈、容器运行时、JVM/.NET)、应用层(控制逻辑、组态、算法、HMI)、通信与数据层(现场总线、工业以太网、MQTT、时序库)。六类载体的差异,本质是这五层的裁剪与组合方式不同。

PLC 通常是“裸机循环 + 实时内核 + 专有运行时”,用户程序被编译为中间码或机器码,由固件按固定扫描周期调度,几乎不暴露操作系统接口。DCS 是分布式结构:现场控制站(类似高可靠 PLC)承担回路控制,操作站与工程师站运行在 Windows/Linux 上,中间由专用控制网络连接,因此 DCS 的“软件栈”是跨节点的。SCADA 是上位监控层,典型栈为 Windows/Linux + 组态运行时 + 实时/历史数据库 + 通信驱动,实时性最弱但数据吞吐最大。边缘控制器多为 Linux + 容器(Docker/K3s)+ OPC UA/Modbus 网关,兼顾控制与数据上云。工控机(IPC)是通用 x86 + Windows/Linux,常跑组态、视觉、MES 客户端,实时性依赖是否加装实时补丁或软 PLC。嵌入式终端(HMI 面板、网关、传感器节点)资源最紧,常见 RTOS 或精简 Linux,Flash 与 RAM 以 MB 计。

六类工业载体的软件栈分层与实时性梯度 通信/数据层 总线·OPC UA·MQTT 应用层 逻辑·组态·算法 运行时层 PLC运行时·容器·JVM 系统层 裸机·RTOS·Linux 硬件/固件层 CPU·BSP·Bootloader PLC 现场总线 梯形图/ST 专有运行时 实时内核 MCU/SoC 周期 1~10 ms 抖动 < 100 µs 扫描超时 I/O 失联 看门狗复位 DCS 控制网 回路组态 控制站运行时 RTOS+Win 冗余控制器 周期 50~500 ms 冗余切换 < 1 s 主备失步 网络风暴 操作站掉线 SCADA OPC/Modbus 组态+HMI 实时/历史库 Windows/Linux 服务器/工作站 刷新 0.5~2 s 非硬实时 驱动断连 历史库写满 画面假死 边缘控制器 MQTT/UA 边缘算法 容器运行时 Linux+RT补丁 ARM/x86 周期 10~100 ms 软实时 容器 OOM 磁盘写满 上云断链 工控机 IPC 以太网 视觉/MES .NET/JVM Windows x86 工控主板 周期 100 ms~s 非实时 蓝屏/重启 风扇/硬盘故障 授权过期 嵌入式终端 串口/CAN HMI/采集 轻量运行时 RTOS/精简Linux MCU/MPU 周期 1~50 ms 硬实时/软实时 Flash 写坏 内存泄漏 通信超时 强实时 / 确定性高 弱实时 / 吞吐优先 实时性梯度:PLC ≈ 嵌入式终端 > DCS 控制站 > 边缘控制器 > 工控机 > SCADA

二、实时性约束:不是“快”,而是“确定”

工业语境下的实时性,核心指标是确定性而非平均速度。常用三个量衡量:周期(任务多久执行一次)、抖动(周期波动范围)、最坏执行时间(WCET)。PLC 的扫描周期典型为 1~10 ms,抖动要求常在 100 µs 以内;DCS 控制站回路周期 50~500 ms,冗余切换需在 1 s 内完成;SCADA 刷新 0.5~2 s,属非硬实时;边缘控制器在 10~100 ms 量级,属软实时;工控机跑 Windows 时通常无实时保证;嵌入式终端视是否 RTOS 而定。

判断一个环境能否满足要求,可用简单的利用率检验:设任务周期 T、WCET 为 C,则 CPU 利用率 U = C/T。单任务需 U < 1,多任务需满足可调度性判据(如速率单调调度要求 Σ(Cᵢ/Tᵢ) ≤ n(2^(1/n)−1))。例如某边缘控制器上,采集任务 C=8 ms、T=50 ms,算法任务 C=20 ms、T=100 ms,则 U = 0.16 + 0.20 = 0.36,理论可调度;但若算法任务因 GC 或容器调度抖动使 C 突增到 60 ms,U 升至 0.76,接近临界,此时报警应关注“周期超时次数”而非平均负载。

实时性报警的判据应基于“超时次数/抖动分布”,而不是 CPU 平均占用率。平均 30% 占用但每秒一次 200 ms 抖动,对控制回路而言可能比持续 70% 占用更危险。

三、典型失效场景与可观测信号

不同载体的失效模式差异显著,恢复策略也必须匹配。下表给出常见失效、可观测信号与恢复方向的对应关系(参数为教学示例,非实测值)。

载体典型失效可观测信号恢复方向
PLC扫描超时、I/O 失联扫描周期告警位、模块诊断字、看门狗计数切安全输出、重启运行时、切换冗余 CPU
DCS主备失步、控制网风暴冗余状态字、网络负载率、站间心跳强制同步、隔离故障网段、降级为单站运行
SCADA驱动断连、历史库写满驱动连接状态、队列深度、磁盘剩余重连驱动、滚动归档、降采样写入
边缘控制器容器 OOM、磁盘写满cgroup 内存事件、inode 使用率、重启次数限制内存、清理日志、重启容器
工控机蓝屏、硬盘故障、授权过期系统事件日志、SMART、License 剩余天数自动重启、切换备用机、提前续期
嵌入式终端Flash 写坏、内存泄漏写次数计数、堆剩余、通信超时率只读挂载、定期重启、远程升级

四、从环境基线到报警设计

剖析运行环境的最终目的,是为报警阈值和恢复动作找到依据。建议按以下顺序建立基线:先确认载体类型与实时等级,再列出该载体上真正可采集的信号(很多 PLC 只暴露诊断字,不暴露 CPU 占用),然后为每个关键信号定义“正常范围—预警阈值—报警阈值”三档,最后为每档绑定恢复动作并验证其副作用。例如边缘控制器磁盘使用率,可设 70% 预警(触发日志清理)、85% 报警(停止非关键写入)、95% 紧急(重启采集容器)。阈值必须结合本机写入速率估算:若日志每天增长 2 GB、磁盘剩余 20 GB,则约 10 天触达 95%,预警应提前到 70% 即约 3 天前,留出人工处置窗口。

不要把上位 SCADA 的报警阈值直接套用到 PLC 或边缘控制器。同一物理量在不同载体上的采样周期、滤波方式和量程可能不同,阈值必须按载体分别标定并记录版本。