一、简介:为什么大型产线必须"分布式"而非"单机"?

  • 单机 PLC 的瓶颈

    • 控制点数 > 2000 时,扫描周期从 4 ms 恶化到 20 ms,无法满足高速包装线需求。

    • 单点故障 = 整线停机,汽车焊装车间一次停机损失 50 万元/小时。

  • 分布式价值

    • 将 2000 点拆分到 10 个节点,每节点 200 点,扫描周期恢复 2 ms。

    • 单节点故障可热切换,产线降速运行而非全停。

    • 产线扩展时新增节点即可,无需更换主 PLC。

  • 核心挑战:节点间数据交互延迟、时钟漂移、任务协同失序。

本文基于实时 Linux + EtherCAT/PROFINET + PTP 时间同步,给出可落地的多 PLC 节点组网方案,适用于汽车、锂电、光伏等大规模连续生产场景。


二、核心概念:6 个关键词搞懂分布式控制

关键词 一句话 本文对应技术
分布式 PLC 多个独立控制节点通过网络协同,逻辑上统一 实时 Linux + Xenomai
确定性网络 传输延迟可预测、有界 EtherCAT(周期抖动 < 1 μs)
PTP(IEEE 1588) 精密时间协议,亚微秒级时钟同步 linuxptp / ptp4l
TAS(Time-Aware Shaper) 时间感知整形,802.1Qbv 标准 交换机门控调度
全局状态一致性 所有节点对同一时刻的输入输出达成共识 分布式快照算法
故障域隔离 单节点故障不扩散 心跳监控 + 热备切换

三、环境准备:30 分钟搭好 3 节点实验网

3.1 硬件清单(单节点配置,共 3 套)

组件 型号/规格 数量 备注
工业 PC Intel J6412 / 4 核 / 8 GB 3 无风扇,-20~60℃
实时网卡 Intel I210-T1(支持 PTP 硬件时间戳) 3 关键!软件时间戳精度不足
EtherCAT 从站 Beckhoff EL1809/EL2809 各 3 数字量输入/输出
PTP 交换机 Hirschmann OCTOPUS 8M 1 支持 802.1AS 和 TAS
网线 Cat 6A 屏蔽双绞线 若干 < 100 m 节点间距

3.2 软件环境

组件 版本 安装命令
实时 Linux Debian 11 + Xenomai 3.2 见下文脚本
EtherCAT Master IgH EtherCAT 1.5.2 源码编译
PTP 协议栈 linuxptp 3.1.1 apt install linuxptp
PLC 运行时 CODESYS Runtime 3.5.19 授权安装

3.3 一键安装实时内核与 Xenomai

#!/bin/bash
# install_xenomai.sh - 在三台节点上分别执行
set -e

# 1. 安装依赖
sudo apt update
sudo apt install -y build-essential libncurses-dev bison flex \
    libssl-dev libelf-dev bc git wget

# 2. 下载内核与 Xenomai
KERNEL_VER=5.10.100
XENO_VER=3.2.1
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-${KERNEL_VER}.tar.xz
wget https://xenomai.org/downloads/xenomai-${XENO_VER}/xenomai-${XENO_VER}.tar.bz2

# 3. 打 Xenomai 补丁
tar -xf linux-${KERNEL_VER}.tar.xz
tar -xjf xenomai-${XENO_VER}.tar.bz2
cd linux-${KERNEL_VER}
../xenomai-${XENO_VER}/scripts/prepare-kernel.sh --linux=.

# 4. 配置编译(启用 COBALT 实时核心)
make x86_64_defconfig
./scripts/config --enable CONFIG_XENOMAI_COBALT
./scripts/config --enable CONFIG_XENO_DRIVERS_NET_E1000E
make -j$(nproc) deb-pkg

# 5. 安装
sudo dpkg -i ../linux-image-*.deb ../linux-headers-*.deb
sudo reboot

重启后验证:

uname -r                    # 应包含 xenomai
sudo /usr/xenomai/bin/latency  # 测试空载延迟,应 < 10 μs

四、应用场景:汽车焊装车间分布式控制

某汽车厂焊装车间包含 4 条产线、120 台机器人、800 个安全门、3000 个传感器。采用传统集中式 PLC 时,扫描周期 16 ms,机器人轨迹抖动导致焊点偏移,不良率 3%。

改造方案

  • 按工位拆分 12 个分布式 PLC 节点,每节点控制 250 点。

  • 节点间通过 EtherCAT 背板总线互联,周期 2 ms。

  • PTP 同步各节点时钟,确保安全联锁信号全局一致。

  • 关键节点(如安全 PLC)双机热备,切换时间 < 50 ms。

效果:扫描周期降至 2 ms,焊点偏移 < 0.1 mm,不良率降至 0.3%,年节约质量成本 800 万元。


五、实际案例与步骤:3 节点组网实战

目标:搭建 Node-A(主站)、Node-B/C(从站),实现周期同步、数据共享、故障切换。

5.1 网络拓扑规划

[Node-A: 192.168.1.10/24]  <--PTP/EtherCAT-->  [Node-B: 192.168.1.11/24]
       |                                          ^
       +----------[PTP Switch]---------------------+
       |
[Node-C: 192.168.1.12/24]

5.2 步骤 1:配置 PTP 时间同步(全局时钟基准)

Node-A(Grandmaster,主时钟)
# /etc/linuxptp/ptp4l.conf
[global]
priority1               128
priority2               128
domainNumber            0
twoStepFlag             1
network_transport       L2

[eth0]
# 使用硬件时间戳
tx_timestamp_timeout    10

启动:

sudo ptp4l -f /etc/linuxptp/ptp4l.conf -i eth0 -m -S &
sudo phc2sys -s eth0 -c CLOCK_REALTIME -m -O 0 &  # 同步系统时钟
Node-B/C(Slave,从时钟)
# /etc/linuxptp/ptp4l.conf(仅 priority 不同)
[global]
priority1               255   # 比 Master 低,确保不抢占
priority2               128
domainNumber            0
twoStepFlag             1
network_transport       L2

[eth0]
tx_timestamp_timeout    10

启动:

sudo ptp4l -f /etc/linuxptp/ptp4l.conf -i eth0 -m -S &
sudo phc2sys -s eth0 -c CLOCK_REALTIME -m -O 0 &
验证同步精度
# 在 Slave 节点执行
pmc -u -b 0 'GET CURRENT_DATA_SET'
# 期望输出:offsetFromMaster 绝对值 < 100 ns

5.3 步骤 2:配置 EtherCAT 分布式总线

Node-A(EtherCAT Master)
# /etc/ethercat.conf
MASTER0_DEVICE="00:1E:67:xx:xx:xx"  # I210 网卡 MAC
DEVICE_MODULES="e1000e"

# 启动 Master
sudo /etc/init.d/ethercat start
sudo ethercat slaves  # 应看到 Node-B/C 的从站
Node-B/C(EtherCAT Slave 模式,作为远程 IO)
/* ec_slave.c - 简化版从站代码,基于 SOES */
#include "ecat_slv.h"

void APP_safeoutput(void) {
    // 安全状态:输出清零
}

void APP_output(void) {
    // 将本地输出映射到 EtherCAT PDO
    ESCvar.ALevent = etohs(0x0C);
}

void APP_input(void) {
    // 将 EtherCAT PDO 映射到本地输入
}

int main(void) {
    ecat_slv_init(&config);
    while (1) {
        ecat_slv();
        // Xenomai 实时任务调度
        rt_task_wait_period(NULL);
    }
}

编译:

gcc ec_slave.c -o ec_slave -I/usr/xenomai/include \
    -L/usr/xenomai/lib -lxenomai -lsoes -lrtdm
sudo ./ec_slave

5.4 步骤 3:实现节点间数据共享(全局变量表)

设计分布式全局变量表(GVT),所有节点通过 EtherCAT PDO 订阅/发布:

变量名 类型 发布节点 订阅节点 周期
Line1_Robot1_Pos float[6] Node-A Node-B,C 2 ms
Safety_EStop_Global bool Node-A ALL 1 ms(紧急)
NodeB_Temperature float Node-B Node-A 100 ms

Node-A 的 CODESYS 程序片段:

// 定义外部变量,绑定到 EtherCAT PDO
VAR_GLOBAL
    Line1_Robot1_Pos : ARRAY[1..6] OF REAL;
    Safety_EStop_Global : BOOL;
END_VAR

// 主循环:每 2 ms 执行
PROGRAM PLC_PRG
    IF Safety_EStop_Global THEN
        // 全局急停,所有节点同步响应
        Robot1.Stop();
        Robot2.Stop();
    END_IF
    
    // 将 Node-B 数据转发到 Node-C
    NodeC_Data := NodeB_Data;
END_PROGRAM

5.5 步骤 4:故障检测与热切换

心跳机制(Watchdog)
/* watchdog.c - Xenomai 实时任务 */
#include <alchemy/task.h>
#include <alchemy/sem.h>

RT_TASK heartbeat_task;
RT_SEM fault_sem;

void heartbeat(void *arg) {
    int node_id = *(int*)arg;
    uint64_t last_seen[3] = {0};
    
    while (1) {
        rt_task_wait_period(NULL);
        
        // 检查各节点心跳计数器
        for (int i = 0; i < 3; i++) {
            if (i == node_id) continue;
            
            uint64_t now = rt_timer_read();
            if (now - last_seen[i] > 10 * MS) {  // 10 ms 无响应
                rt_sem_v(&fault_sem);  // 触发故障处理
            }
        }
    }
}

void fault_handler(void *arg) {
    rt_sem_p(&fault_sem, TM_INFINITE);
    
    // 切换逻辑:Node-A 故障时,Node-B 升主
    if (current_role == SLAVE && master_alive == FALSE) {
        become_grandmaster();
        takeover_ethercat_master();
    }
}

启动:

sudo ./watchdog --node-id=0  # Node-A
sudo ./watchdog --node-id=1  # Node-B
sudo ./watchdog --node-id=2  # Node-C

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

问题 现象 解决
PTP 同步偏差 > 1 μs 硬件时间戳未启用 确认网卡支持 PTP,检查 ethtool -T eth0
EtherCAT 从站掉线 网线松动或拓扑变更 使用 ESI 配置工具重新扫描,启用自动重连
节点间数据延迟不一致 交换机未启用 TAS 配置 802.1Qbv 门控,确保关键帧优先传输
热切换时数据丢失 全局状态未快照 实现分布式快照算法(Chandy-Lamport)
Xenomai 任务崩溃 双核锁步配置错误 BIOS 关闭超线程,内核加 nohz_full 参数

七、实践建议与最佳实践

  1. 网络分层设计

    • 控制层(EtherCAT/PROFINET):确定性,周期 < 1 ms

    • 信息层(标准以太网):非实时,用于 HMI、SCADA

  2. 时钟冗余

    • 配置 2 个 Grandmaster,优先级相差 1,主故障时自动切换。

  3. 数据版本控制

    • 全局变量附加 32 位时间戳,订阅节点丢弃过期数据(> 2 个周期)。

  4. 仿真验证

    • 使用 NetEm 模拟网络延迟:tc qdisc add dev eth0 root netem delay 500us 100us

    • 验证系统在 20% 丢包下的容错能力。

  5. 文档化拓扑

    • 用 Graphviz 绘制网络图,随代码版本管理:

    digraph network {
        A [label="Node-A\nGrandmaster"];
        B [label="Node-B\nSlave"];
        C [label="Node-C\nSlave"];
        SW [label="PTP Switch"];
        A -> SW -> B;
        SW -> C;
    }

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

分布式 PLC 组网
├─ 时钟:PTP(Grandmaster/Slave,< 100 ns)
├─ 网络:EtherCAT 确定性 + TAS 门控
├─ 数据:全局变量表(GVT)+ 时间戳版本
├─ 协同:心跳检测 + 分布式快照
├─ 容错:热备切换 + 故障域隔离
└─ 验证:NetEm 仿真 + 现场压测

掌握本文方案,你就能:

  • 将单机 PLC 扩展为 100+ 节点的分布式系统

  • 确保全局时钟偏差 < 1 μs,控制周期 < 2 ms

  • 实现故障秒级切换,产线可用性 99.99%

立刻搭建你的 3 节点实验网,用 pmc 命令看到 offsetFromMaster: 23 ns 的那一刻,你就跨入了工业 4.0 分布式控制的大门!

Logo

更多推荐