软 PLC 总是导致伺服掉线?教你在 Intel N97 上用 CPU 绑核与 PREEMPT_RT 榨出 <50μs 实时性
2026-04-04 17:36:00
#SoftPLC #PREEMPT_RT #CPU绑核 #CODESYS #EtherCAT #边缘
一、 场景痛点:UI 一卡顿,机器臂就“撞墙”
在 2026 年,为了把电控柜的 BOM 成本砍掉一半,越来越多的非标自动化集成商开始采用 “IPC + SoftPLC (软 PLC)” 的架构。
现状:客户买了一台搭载 Intel N97(4 核)的无风扇工控机,装上 Ubuntu 系统。同时运行了 CODESYS Linux Runtime(控制 10 个 EtherCAT 伺服轴,要求 1ms 循环周期),还跑着一个 Node.js 的看板大屏。
事故现场:
平时跑得好好的,但只要工人在屏幕上点击下载历史报表,或者后台 Docker 容器开始写日志,系统 CPU 占用率瞬间飙升。
CODESYS 的 1ms 实时任务被 Linux 系统的普通进程“抢占”了 CPU 时间片。
EtherCAT 主站无法在规定时间内发送同步报文(Sync0),导致底层伺服驱动器触发 Sync Lost 报警并瞬间切断使能(掉线急停)。
正在高速运动的机械臂因为失去控制,凭借惯性直接撞毁了价值 10 万的测试夹具。
必须通过 PREEMPT_RT 实时内核 + CPU 物理核隔离 (Core Isolation) + 中断亲和性绑定 (IRQ Affinity),为 SoftPLC 划出一块“绝对无人打扰”的物理禁区。
二、 架构设计:算力“楚河汉界”的物理切片
Intel N97 拥有 4 个物理核心。我们要在系统底层建立严格的“阶级制度”:
隔离区 (Isolated Zone):分配 Core 2 和 Core 3。完全剥离 Linux 调度器的管理,禁止任何普通用户进程、后台服务甚至系统时钟中断进入这两个核心。它们 100% 专属于 CODESYS 和 EtherCAT 实时主站。
普通区 (Housekeeping Zone):分配 Core 0 和 Core 1。负责处理所有的“脏活累活”,包括 SSH 登录、Node.js 界面渲染、数据库写入、网卡收发包中断。
[Core 0/1: Linux 内核调度器 + Docker + UI] | (硬件级物理隔离) |[Core 2/3: CODESYS Runtime <--> EtherCAT 专网卡]
三、 核心实施步骤 (Copy & Paste)
假设你已经安装了 Ubuntu 24.04,并且(根据我们 1 月份的行业动态)内核已经升级到原生支持 PREEMPT_RT 的 Linux 6.14+。
1. 修改 GRUB 引导参数 (隔离 CPU 核心)
我们需要在系统启动的那一刻,就把 Core 2 和 Core 3 从系统调度器里“摘”出来。
编辑 /etc/default/grub 文件,修改 GRUB_CMDLINE_LINUX_DEFAULT:
# isolcpus=2,3 : 隔离核心 2 和 3,普通进程无法调度到这里 # nohz_full=2,3 : 关闭这俩核心的 Tick 时钟中断(Tickless),消除系统定时器带来的微秒级抖动 # rcu_nocbs=2,3 : 将 RCU 回调任务从这俩核心移走 # intel_pstate=disable : 禁用 Intel 动态节能降频,保持最高性能 # processor.max_cstate=0 : 禁用 C-States 休眠,防止核心从休眠中唤醒造成的几十微秒延迟 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash isolcpus=2,3 nohz_full=2,3 rcu_nocbs=2,3 rcu_nocb_poll intel_pstate=disable processor.max_cstate=0 clocksource=tsc tsc=reliable"
执行 sudo update-grub 并重启系统。
验证:运行 htop,你会发现普通进程全挤在 Core 0 和 1 里,Core 2/3 空空如也。
2. 处理网卡与中断洪峰 (IRQ Routing)
即使隔离了 CPU,网卡收到数据时产生的硬件中断(IRQ)默认还是会随机打断所有 CPU。必须把无关网卡的中断全部赶到 Core 0。
# 假设 eth0 是连外网的网卡,eth1 是专供 EtherCAT 的网卡 # 找出 eth0 的中断号 cat /proc/interrupts | grep eth0 # 假设中断号是 124 和 125,将它们的亲和性 (smp_affinity) 绑定到 CPU 0 (掩码为 1) # 掩码换算:CPU 0 -> 1, CPU 1 -> 2, CPU 2 -> 4, CPU 3 -> 8 echo 1 > /proc/irq/124/smp_affinity echo 1 > /proc/irq/125/smp_affinity
3. 将软 PLC 绑定到隔离核心
在启动 CODESYS (或你的 C++ 控制程序) 时,使用 taskset 或 chrt 强制将其扔进我们准备好的隔离核心。
# 以 FIFO 实时调度策略 (优先级 99),强制在 CPU 2 上运行 codesyscontrol 进程 sudo chrt -f 99 taskset -c 2 /opt/codesys/bin/codesyscontrol.bin -d /etc/CODESYSControl.cfg
四、 踩坑复盘 (Red Flags)
1. 致命的 BIOS SMI (系统管理中断)
现象:系统一切配置完美,cyclictest 测出来平均抖动只有 15μs。但只要运行超过 24 小时,必然会出现一次 5000μs (5ms) 的恐怖毛刺,直接导致机器掉线。
黑盒真相:这是 x86 主板底层的 SMI (System Management Interrupt) 搞的鬼。主板的 BIOS 为了监控温度或控制风扇,会触发一个最高优先级的不可屏蔽中断,连 Linux 内核都无法干预,直接把 CPU 挂起几毫秒。
避雷:做软 PLC 选型,绝对不能买普通的家用主板或廉价准系统! 必须向工控机厂商索要 “已优化 SMI 的实时版 BIOS 固件”。在 BIOS 中彻底关闭 Hyper-Threading (超线程)、SpeedStep 和 C-States。
2. 选错 EtherCAT 专用网卡芯片
坑:为了图便宜,工控机的两个网口用的是 Realtek (瑞昱) RTL8111。
后果:Realtek 的 Linux 驱动在处理高频小包时延迟极大,且不支持 Intel 网卡特有的多队列 MSI-X 中断。跑到 1ms 周期时,网卡直接发热罢工。
对策:跑 EtherCAT 主站的专用网口,必须认准 Intel i210-AT 或 i226-IT 芯片。这是工控界的黄金法则。
五、 关联资源与选型
软硬解耦不是让你随便找台电脑装软件,而是对硬件底层的深度榨取。
硬件底座推荐:
研华 (Advantech) UNO-2271G V2 / MIC-770 V3:板载双 Intel i210 网卡,且官方提供经过严格 SMI 优化的工业级 BIOS(BIOS 甚至没有温控曲线,强制全速)。
核心软件栈:
CODESYS Control for Linux SL:目前全球装机量最大的标准化软 PLC 运行时环境,原生支持 CPU 绑核与 EtherCAT 主站。
软件情报:CODESYS 运行时各平台授权费用与兼容性查询
一键调优脚本 (Real-Time Tuner)
手改内核参数和 IRQ 很容易把系统搞挂?
我们编写了一个 "Linux IPC 硬实时调优工具 (Bash Script)"。
包含:一键禁用非必要系统服务、自动计算 CPU 掩码绑定中断、禁用 Swap 交换分区,并自动跑 1 小时的 cyclictest 生成延时热力图。
架构师福利:一键拉取边缘超融合 IPC 内核性能极速压榨脚本 (RT-Tuner)