3. 工业通信协议栈全景

STM32MP1 系列(如 STM32MP157)与 STM32MP2 系列(如 STM32MP257)在工业网关、边缘控制器和远程 IO 场景中经常需要同时面对多种工业协议。它们的共同点是:芯片本身只提供以太网 MAC、CAN-FD 控制器、UART、SPI 等物理与链路层外设,而 Modbus、CANopen、EtherCAT、PROFINET、OPC UA 这些协议栈,要么运行在 Cortex-A 侧的 Linux 用户态/内核态,要么运行在 Cortex-M 侧的裸机或 RTOS 上,要么由专用硬件加速单元承担。选型的第一步不是比较协议“谁更先进”,而是先判断协议栈落在哪一侧、需要什么实时性、需要什么硬件配合。

协议栈在 STM32MP 上的分层落点

把五类协议放到同一张分层图上,可以看清它们的本质差异。Modbus RTU/TCP 与 CANopen 属于“轻量级、可软件实现”的协议:Modbus RTU 走 UART 或 RS-485 收发器,Modbus TCP 走 Linux 的 socket;CANopen 走 CAN-FD 控制器,协议栈(如 CANopenNode)可跑在 Cortex-M 裸机或 Linux 的 SocketCAN 之上。EtherCAT 与 PROFINET 属于“硬实时工业以太网”:EtherCAT 从站通常需要 ESC(EtherCAT Slave Controller)专用芯片或支持 EtherCAT 的 MAC,主站则依赖 Linux 的 IgH EtherCAT Master 或 Xenomai/RT-Preempt 内核;PROFINET 的 RT/IRT 对周期抖动要求更严,STM32MP 上一般以 PROFINET RT 从站为主,IRT 需要专用 ASIC。OPC UA 则是“信息层协议”,它不关心底层是 Modbus 还是 PROFINET,运行在 Linux 用户态,用 open62541 或 UA-.NET 等栈实现,负责把现场数据统一成地址空间模型。

STM32MP 工业协议栈分层落点与实时性需求 信息层 应用/实时层 现场总线层 链路/驱动层 硬件外设层 OPC UA open62541 / 地址空间建模 MQTT / REST 边缘上云与数据汇聚 Cortex-A Linux 用户态 非实时,周期 10ms~1s 级 EtherCAT 主站 IgH / RT-Preempt,周期 1ms PROFINET RT 从站 p-net,周期 1~4ms Cortex-M 裸机/RTOS 硬实时,抖动 < 10μs Modbus RTU/TCP libmodbus,周期 10~100ms CANopen CANopenNode,周期 1~10ms EtherCAT 从站 / PROFINET IRT 需 ESC / ASIC 硬件加速 SocketCAN / tty Linux 内核驱动 Ethernet MAC / PHY RGMII / RMII HAL / LL 驱动 Cortex-M 侧外设 UART / RS-485 Modbus RTU 物理层 FDCAN CANopen 物理层 千兆以太网 EtherCAT/PROFINET ESC / ASIC 硬实时加速 实时性递增 →

五类协议的适用性对比

从工程落地角度看,五类协议在 STM32MP 上的适用性可以按“实时性—实现成本—生态成熟度”三个维度判断。Modbus 的实时性最弱,但实现最简单:Linux 侧用 libmodbus 打开 /dev/ttySTM0 或 TCP 端口即可,Cortex-M 侧用 UART 中断收发也能实现从站。CANopen 的实时性中等,CAN-FD 在 1Mbps 仲裁段下典型周期 1~10ms,CANopenNode 在 Cortex-M 上占用约 20~40KB Flash,适合分布式 IO 和伺服驱动。EtherCAT 的实时性最强,从站周期可到 250μs,但必须依赖 ESC 芯片(如 LAN9252、ET1100),STM32MP 通常作为主站或通过 SPI/并口连接 ESC 做从站。PROFINET RT 从站可用 p-net 协议栈在 Linux 上实现,周期 1~4ms,适合工厂自动化;IRT 则必须专用 ASIC。OPC UA 不参与实时控制,它负责把上述协议的数据统一建模,典型周期 100ms~1s,适合边缘网关与 MES/SCADA 对接。

协议典型周期STM32MP 落点硬件依赖典型场景
Modbus RTU/TCP10~100msA 侧 Linux / M 侧裸机UART+RS485 / 以太网仪表采集、老旧设备接入
CANopen1~10msM 侧裸机 / A 侧 SocketCANFDCAN 控制器分布式 IO、伺服、工程机械
EtherCAT250μs~1msA 侧主站 / ESC 从站ESC 芯片、RT 内核运动控制、高速 IO
PROFINET RT1~4msA 侧 Linux(p-net)以太网 MAC、RT 内核工厂自动化、过程控制
OPC UA100ms~1sA 侧 Linux 用户态无特殊硬件边缘网关、SCADA/MES 集成

选型依据与决策路径

实际选型时,建议按以下顺序判断。第一,先问“控制周期是多少”:若周期小于 1ms 且要求抖动小于 10μs,直接排除 Modbus 和 OPC UA,优先 EtherCAT 或 PROFINET IRT,并确认是否需要 ESC/ASIC。第二,问“现场已有哪种总线”:若现场已有 CAN 线束,选 CANopen 成本最低;若已有 RS-485 仪表,Modbus RTU 最直接;若已有 PROFINET 网络,则用 p-net 做从站。第三,问“是否需要向上层系统暴露语义化数据”:若需要,则在实时协议之上叠加 OPC UA 信息模型,而不是用 OPC UA 替代实时协议。第四,评估 Cortex-M 侧资源:CANopenNode 约 30KB Flash、8KB RAM;Modbus 从站约 10KB Flash;若 M 侧还要跑电机控制,需预留算力。第五,确认 Linux 内核实时性:EtherCAT 主站和 PROFINET RT 从站建议使用 RT-Preempt 或 Xenomai,普通内核下周期抖动可能达到数百微秒,无法满足 1ms 周期要求。

选型速记:实时性要求 < 1ms → EtherCAT/PROFINET IRT;1~10ms → CANopen/PROFINET RT;10~100ms → Modbus;信息集成 → OPC UA 叠加在实时协议之上,不替代实时协议。

一个典型的混合协议网关示例

假设一台 STM32MP157 网关需要同时接入 4 路 RS-485 Modbus RTU 仪表、1 路 CANopen 伺服,并把数据上传到 OPC UA 服务器。合理的分工是:Cortex-M4 侧用 UART 中断实现 4 路 Modbus RTU 从站轮询,周期 50ms,把寄存器值写入共享内存;Cortex-A7 侧用 SocketCAN 读取 CANopen 的 PDO 数据,周期 5ms;Linux 用户态运行 open62541,把 Modbus 寄存器和 CANopen 对象字典映射为 OPC UA 变量节点,发布周期 200ms。这样既保证了 CANopen 的实时性,又用 OPC UA 完成了语义化集成。若把 Modbus 轮询也放到 A 侧用户态,50ms 周期下 CPU 占用约 3%~5%,可接受;但若周期压到 5ms,则建议下移到 M 侧,避免 Linux 调度抖动导致轮询超时。

常见误区:不要试图用 OPC UA 直接做实时控制回路。OPC UA 的 PubSub 虽然支持 UDP 传输,但 STM32MP 上 Linux 用户态的调度抖动通常在 100μs~1ms 量级,无法保证硬实时。正确做法是实时协议负责控制,OPC UA 负责信息集成。

总结来看,STM32MP 的异构架构(Cortex-A + Cortex-M)恰好为“实时控制 + 信息集成”提供了天然分工:M 侧承担 CANopen、Modbus RTU 等轻量实时任务,A 侧承担 EtherCAT 主站、PROFINET RT、OPC UA 等需要 Linux 生态的任务。选型的核心不是比较协议优劣,而是把协议放到正确的核、正确的内核实时性配置和正确的硬件加速路径上。