一、简介:为什么实时Linux软PLC是工业4.0的必然选择?

  • 传统硬PLC的困境

    • 封闭生态:西门子S7-1200、三菱FX系列,编程软件授权费高昂,协议不开放。

    • 扩展受限:IO点数固定,增加模块需停机,产线柔性改造困难。

    • 国产化瓶颈:芯片断供风险,高端运动控制卡依赖进口。

  • 实时Linux软PLC的突破

    • 灵活性:x86/ARM/龙芯全平台适配,虚拟机+容器实现一机多控。

    • 可扩展性:Python/C++算法直接嵌入,AI视觉、边缘计算无缝融合。

    • 成本优势:硬件成本下降60%,授权费用归零。

  • 核心价值:掌握实时Linux PLC架构设计 = 拥有自主可控的工业控制底座,适配智能制造、新能源产线、半导体设备等高端场景。


二、核心概念:5个关键词读懂技术本质

关键词 一句话定义 本文应用场景
硬实时(Hard RT) 任务必须在截止时间内完成,超时即失效 伺服电机位置环控制,周期≤1ms
软实时(Soft RT) 偶尔超时可容忍,平均性能达标即可 HMI刷新、日志记录,周期100ms
PREEMPT_RT Linux主线实时补丁,全内核可抢占 通用工业PLC,生态丰富,易维护
Xenomai 双内核方案,微秒级确定性延迟 高端运动控制,数控系统
PLC Runtime 解释执行IEC 61131-3程序的中间层 梯形图→C代码→实时线程

三、环境准备:搭建实时Linux PLC开发平台

3.1 硬件选型(三档配置)

档位 场景 CPU 内存 实时网卡 参考型号
经济型 小型产线逻辑控制 ARM Cortex-A72 4核 2GB 普通千兆网 瑞芯微RK3588
标准型 中大型产线+运动控制 x86 i7-12700 12核 8GB Intel I210-T1 研华UNO-238
高端型 多轴同步数控系统 x86 i9-13900K + FPGA 32GB EtherCAT专用卡 倍福CX2040

3.2 软件栈版本锁定

组件 版本 安装命令
实时内核 Linux 5.15.71-rt53 见下文编译脚本
PLC Runtime CODESYS Runtime 3.5.19 官网下载ARM/x86包
运动控制库 EtherCAT SOEM 1.4.0 git clone
开发环境 CODESYS IDE 3.5.19 Windows/Linux双版本

3.3 一键编译PREEMPT_RT内核(可复制)

#!/bin/bash
# build_rt_kernel.sh
set -e
KERNEL_VER=5.15.71
RT_PATCH=patch-5.15.71-rt53.patch.xz

# 下载源码
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-${KERNEL_VER}.tar.xz
wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.15/${RT_PATCH}

# 解压打补丁
tar -xf linux-${KERNEL_VER}.tar.xz
cd linux-${KERNEL_VER}
xzcat ../${RT_PATCH} | patch -p1

# 配置:启用PREEMPT_RT + 工业IO驱动
make x86_64_defconfig
./scripts/config --enable CONFIG_PREEMPT_RT
./scripts/config --enable CONFIG_I210
./scripts/config --enable CONFIG_E1000E
./scripts/config --enable CONFIG_SPI_SPIDEV
./scripts/config --enable CONFIG_GPIO_SYSFS

# 编译安装
make -j$(nproc)
sudo make modules_install
sudo make install
sudo update-grub

echo "RT内核编译完成,重启选择新内核"

四、应用场景:新能源汽车电池模组产线

场景描述:某动力电池工厂需改造一条模组焊接产线,核心需求如下:

  • 逻辑控制:20台焊接机器人顺序启停,安全门、光栅、急停回路硬实时响应(≤10ms)。

  • 运动控制:4台SCARA机器人同步插补,周期1ms,轨迹偏差≤0.1mm。

  • 视觉检测:6组工业相机AI缺陷检测,与PLC周期同步触发。

  • 数据上云:焊接参数实时上传MES,支持OTA远程升级。

传统方案:西门子S7-1500 + ET200SP分布式IO + 单独工控机跑视觉,总成本45万,扩展需停机。

实时Linux软PLC方案

  • 单台x86工控机运行PREEMPT_RT内核,CODESYS Runtime执行PLC程序。

  • 核隔离:CPU 0-1运行Linux系统任务,CPU 2-3专用实时PLC线程。

  • EtherCAT总线连接伺服驱动器、远程IO、相机触发, cycle time 250μs。

  • 视觉算法以ROS2节点运行,通过shared memory与PLC高速交互。

效果:硬件成本降至18万,产线换型时间从4小时缩短至30分钟,国产化率100%。


五、实际案例与步骤:三层架构设计与实现

5.1 总体架构图

┌─────────────────────────────────────────┐
│           应用层 (Application)           │
│  ┌─────────┐ ┌─────────┐ ┌─────────┐   │
│  │ 梯形图  │ │ 功能块  │ │ C算法   │   │
│  │ LD/FBD  │ │ 运动控制│ │ AI推理  │   │
│  └────┬────┘ └────┬────┘ └────┬────┘   │
│       └───────────┴───────────┘         │
│              CODESYS IDE                 │
├─────────────────────────────────────────┤
│          Runtime层 (Middleware)          │
│  ┌─────────────────────────────────┐    │
│  │     CODESYS Runtime Kernel      │    │
│  │  (IEC 61131-3 虚拟机 + 调度器)   │    │
│  └─────────────────────────────────┘    │
│  ┌─────────┐ ┌─────────┐ ┌─────────┐   │
│  │EtherCAT │ │Modbus   │ │OPC UA   │   │
│  │主站协议 │ │TCP/RTU  │ │服务器   │   │
│  └─────────┘ └─────────┘ └─────────┘   │
├─────────────────────────────────────────┤
│           内核层 (Kernel Space)          │
│  ┌─────────────────────────────────┐    │
│  │      PREEMPT_RT 实时内核         │    │
│  │  (tickless + 高精度定时器 + 优先级继承)│ │
│  └─────────────────────────────────┘    │
│  ┌─────────┐ ┌─────────┐ ┌─────────┐   │
│  │GPIO/SPI │ │EtherCAT │ │设备驱动 │   │
│  │工业IO   │ │网卡驱动 │ │框架    │   │
│  └─────────┘ └─────────┘ └─────────┘   │
└─────────────────────────────────────────┘
           ↓↓↓ 硬件平台 ↓↓↓
      x86工控机 / ARM工业板 / 龙芯2K

5.2 内核层配置:实时性能调优

步骤1:CPU隔离与中断亲和性
#!/bin/bash
# cpu_isolation.sh
# GRUB参数:隔离CPU 2,3给实时任务
sudo sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="/GRUB_CMDLINE_LINUX_DEFAULT="isolcpus=2,3 nohz_full=2,3 rcu_nocbs=2,3 /' /etc/default/grub
sudo update-grub

# 网卡中断绑定到CPU 0,1(非实时核)
sudo systemctl enable irqbalance
sudo irqbalance --hintpolicy=exact

echo "重启后CPU 2,3专用于实时PLC"
步骤2:实时调度参数优化
#!/bin/bash
# rt_tuning.sh
# 写入/etc/sysctl.conf持久化
cat <<EOF | sudo tee -a /etc/sysctl.conf

# 实时调度
kernel.sched_rt_period_us = 1000000
kernel.sched_rt_runtime_us = 950000   # 保留5%给非实时,防止死锁

# 内存锁定
vm.swappiness = 1
vm.dirty_ratio = 5

# 高精度定时器
kernel.hz = 1000
EOF

sudo sysctl -p

5.3 Runtime层部署:CODESYS Runtime安装

#!/bin/bash
# install_codesys_runtime.sh
# 以x86_64为例,ARM需下载对应包
CODEFILE=CODESYS_Control_Linux_x86_64_3.5.19.0.deb

wget https://store.codesys.com/${CODEFILE}
sudo dpkg -i ${CODEFILE}

# 配置实时优先级
sudo sed -i 's/PLC_PRIORITY=80/PLC_PRIORITY=99/' /etc/codesyscontrol/settings

# 启动服务
sudo systemctl enable codesyscontrol
sudo systemctl start codesyscontrol

echo "CODESYS Runtime已启动,IDE可连接"

5.4 应用层开发:梯形图+ST混合编程

示例:电机启停控制(梯形图LD)
|    I0.0    I0.1    M0.0    |
|----] [----+--]/[----+--( )---|
|    启动    停止    运行     |
|           |                 |
|    M0.0   Q0.0             |
|----] [----+--( )-----------|
|    运行    电机              |
示例:位置控制算法(结构化文本ST)
// 位置环PID,周期1ms
PROGRAM PositionControl
VAR
    setPos : REAL := 100.0;      // 目标位置 mm
    actPos : REAL;               // 实际位置(来自编码器)
    errPos : REAL;               // 位置误差
    outVel : REAL;               // 输出速度指令
    
    // PID参数
    Kp : REAL := 2.5;
    Ki : REAL := 0.1;
    Kd : REAL := 0.05;
    
    // 中间变量
    integral : REAL;
    derivative : REAL;
    lastErr : REAL;
END_VAR

// 周期任务,由Runtime调度
errPos := setPos - actPos;
integral := integral + errPos * 0.001;  // 1ms周期
derivative := (errPos - lastErr) / 0.001;

outVel := Kp * errPos + Ki * integral + Kd * derivative;
outVel := LIMIT(outVel, -500.0, 500.0);  // 限速 ±500mm/s

lastErr := errPos;

5.5 核心指标验证

#!/bin/bash
# benchmark.sh
# 安装测试工具
sudo apt install rt-tests

# 1. 调度延迟测试(目标≤50μs)
cyclictest -p99 -i100 -d60s -n -a2,3 > cyclictest.log
# 解析结果:Max latency < 50μs 为合格

# 2. PLC周期抖动测试
# CODESYS内置Trace功能,导出CSV分析周期标准差

# 3. EtherCAT同步抖动
# 使用Wireshark抓包,分析Distributed Clock偏差

六、常见问题与解答(FAQ)

问题 现象 解决
cyclictest Max latency > 100μs CPU未隔离或电源管理未关 BIOS关闭C-State/Turbo,内核加isolcpus
CODESYS Runtime启动失败 授权文件缺失 复制.license文件到/opt/codesys/
EtherCAT从站掉线 网线质量或DC配置错误 使用屏蔽网线,检查ecrt_master_sync_reference_clock()调用
梯形图下载后PLC无响应 程序死循环或数组越界 IDE在线监控,启用CheckBounds编译选项
视觉与PLC通信延迟高 TCP/IP协议栈开销 改用shared memory或EtherCAT PDO映射

七、实践建议与最佳实践

  1. 版本锁定原则

    • 内核、Runtime、IDE版本写入《技术规格书》,升级需走变更评审。

  2. 分层测试策略

    • 单元测试:单个功能块仿真验证。

    • 集成测试:全IO回路+HIL硬件在环。

    • 现场测试:72小时连续运行,记录周期抖动曲线。

  3. 故障安全设计

    • 看门狗电路:PLC未响应时硬件切断输出。

    • 安全PLC分离:急停、安全门走独立安全继电器,不依赖软PLC。

  4. 文档化与追溯

    • 需求→设计→代码→测试用例,双向链接用Git+PlantUML管理。

    • 现场调试记录上传Confluence,支持远程审计。

  5. 国产化适配

    • 龙芯2K/3A5000平台验证:替换x86工控机,内核加CONFIG_CPU_LOONGSON64

    • 国产EtherCAT主站:推荐SOEM或IgH EtherLab,避免倍福授权。


八、总结:一张脑图带走全部要点

实时Linux工业PLC
├─ 优势:灵活、扩展、国产化
├─ 技术路线:PREEMPT_RT(通用) / Xenomai(高端)
├─ 三层架构:
│  ├─ 内核层:CPU隔离 + 实时调优
│  ├─ Runtime层:CODESYS + 现场总线
│  └─ 应用层:LD/FBD/ST + AI融合
├─ 核心指标:周期抖动<50μs,同步偏差<1μs
└─ 落地场景:新能源、半导体、智能产线

实时Linux软PLC不是"玩具",而是经过产线验证的工业级方案。
掌握本文架构设计,你就能:

  • 替代进口PLC,成本下降60%以上

  • 算法直接下沉到控制层,AI+控制一体化

  • 国产化芯片全适配,供应链自主可控

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐