当 Docker 下的实时性 vPLC 从实验室走进车间
实验室里 docker run 起来一个 OpenPLC V4、在仿真器跑通启保停,和车间里让它真正替你驱动一台设备,中间隔着确定性这道坎。本篇讲清容器化 vPLC 怎么从”能跑”走到”敢用”。
图:PREEMPT_RT + 隔离核 + SCHED_FIFO + 网卡直通,把”能跑”的容器变”敢用”的实时 vPLC。
一、实验室容忍抖动,车间要求有界时延
- 实验室:扫描周期 10–100ms,偶尔抖一下无所谓,看的是趋势和逻辑对不对。
- 车间:运动闭环、安全联锁要求的是最坏时延有界(worst-case bounded latency)。“平均 1ms”没意义,要的是”最差也不超过 X μs”。
标准 Linux 默认用 CFS 调度,容器默认没有任何实时保障。所以”在 Docker 里跑起来了”和”能进车间”是两件事——前者只是功能可用,后者是时序可证。
二、容器不是实时障碍,但默认不是实时
OpenPLC V4 的扫描任务走 SCHED_FIFO(见 STruC++ 与实时性)。要让它在容器里拿到实时优先级,需要一整套宿主机+容器配合:
- 宿主机实时内核:打 PREEMPT_RT。它已在 2024 年合入 Linux 主线,意味着实时 Linux 现在有整个内核社区维护的底座,不再是边角项目。
- CPU 隔离:
isolcpus=把控制核从通用调度器 fence 开,避免普通进程/内核线程抢占;配合rcu_nocbs=、关超线程降低抖动。 - 容器内提权:
--cap-add=SYS_NICE --ulimit rtprio=99,否则容器里设不了SCHED_FIFO。 - 绑核专享:
--cpuset-cpus把 vPLC 绑到隔离核。 - 禁 swap + 锁内存:
--memory-swap=--memory防换出,mlock把关键代码/数据锁物理内存。 - 实时带宽:cgroup v2 用
--cpu-rt-runtime而非--cpus给实时带宽。
三、网络确定性:现场总线怎么进容器
- EtherCAT 走 raw socket / L2 帧,需要专用网卡直通:用
--network host或 macvlan / SR-IOV 直通物理网卡。否则容器网桥的 NAT/转发既引入抖动,又让 SOEM 拿不到 L2 帧(见 为什么选 SOEM)。 - 出向整形:TSN 的 ETF / TAPRIO 队列规则 + NIC 硬件时间戳,让周期帧按调度发出,而不是”CPU 有空才发”。
- 设备透传:串口/网卡用
--device或-v /dev/xxx精确映射,别图省事挂全量/dev。
四、一套可参考的部署骨架
# 宿主机(grub):隔离核 2,3,关 SMI 干扰
isolcpus=2,3 rcu_nocbs=2,3
# 容器:实时权限 + 绑核 + 禁 swap + 网卡直通
docker run -d --name openplc-rt \
--cap-add=SYS_NICE --ulimit rtprio=99 \
--cpuset-cpus=2,3 \
--memory-swappiness=0 --memory-swap=--memory \
--network host \
ghcr.io/autonomy-logic/openplc-runtime:latest
这些数值是方向性的。最坏时延取决于硬件、BIOS SMI、负载,必须按部署实测验证,绝不能假设。
五、云 vPLC 的边界(呼应 vPLC 篇)
- 跨网/云部署的 vPLC 受网络抖动影响,时延敏感的回路必须留在边缘/本地硬件;中心只做编排与下发(Autonomy Edge 的角色)。
- 合并部署(一机多 vPLC)省控制柜、省备件、省电,但故障也集中——需要冗余与回滚。容器镜像版本化让
docker rollback秒级恢复,这恰是 vPLC 相对物理 PLC 的弹性优势。
六、从实验室到车间的 checklist
- 宿主机 PREEMPT_RT +
isolcpus隔离控制核 - 容器
SYS_NICE/rtprio/cpuset/ 禁 swap /mlock - 现场总线网卡直通(EtherCAT 要 raw socket)
- 实测最坏时延并留余量(不是看平均)
- 关键回路本地自治,云只做编排
- 安全收口(见 安全设计)
七、小结
Docker 让 vPLC 的部署像软件一样灵活,但”灵活”和”确定”是两件事。把实时性当作一等约束来设计,vPLC 才敢走出实验室、走进车间。
→ 下一篇:为什么选 SOEM,看 V4 的 EtherCAT 主站驱动为什么是它。
配套代码与参考仓库
- OpenPLC Runtime v4(Autonomy-Logic,MIT):https://github.com/Autonomy-Logic/openplc-runtime
- OpenPLC Editor v4(Autonomy-Logic,GPL-3.0):https://github.com/Autonomy-Logic/openplc-editor
- 本系列配套示例(Docker Compose / 启保停 ST / GPIO 接线 / AI agent):https://gitcode.com/linjian19901122/openplc-v4-samples
- 实时 Docker 部署骨架(grub
isolcpus+docker run),见示例库realtime/
系列导航 · 双向链接(OpenPLC V4 系列 · 共 12 篇)
- ① 定位:从教学玩具到工业级 vPLC
- ② 协议栈变迁
- ③ 实战入门:Docker + 启保停
- ④ 树莓派 GPIO 与隔离
- ⑤ 编译器管线:MatIEC → STruC++
- ⑥ 安全设计:TLS/JWT/8443
- ⑦ 插件系统实战
- ⑧ AI 增强 PLC(预测性维护)
- ⑨ vPLC 与 Autonomy Edge
- ⑩ 实时性 vPLC:实验室→车间
- ⑪ 为什么选 SOEM(EtherCAT 主站)
- ⑫ Edge Control 机遇与挑战
本系列当前均为草稿(
draft: true)。建议发布序:① → ③ → ② → ④ → ⑧ 打头,⑩⑪⑫ 作深度延展按读者反馈穿插。