ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

EtherCAT实时以太网从协议原理到Linux主站与STM32从站实现

EtherCAT实时以太网从协议原理到Linux主站与STM32从站实现 工业现场里跑实时通信绕不开的一个名字就是 EtherCAT。我第一次在设备上看到它是在一台多轴运动控制柜里——主站只有一块小小的嵌入式板子下面挂了十几个从站伺服、IO、编码器全串在一条网线上周期抖动稳定在微秒级。当时我的第一反应是这不就是普通以太网吗凭什么能做到这么硬实时后来自己动手搭了一套主从站从站用 STM32 跑,主站跑在 Linux 上一路踩坑下来才真正理解它为什么能在工业现场站稳脚跟。这篇就把 EtherCAT 从协议原理、时钟同步、主从站实现到 Linux 侧配置按我自己的理解完整拆一遍适合刚接触工业总线、准备做运动控制或者想搞懂实时以太网底层机制的读者。1. EtherCAT 到底解决的是工业现场的什么问题1.1 传统现场总线的瓶颈在哪里要理解 EtherCAT得先知道它替代的是什么。早些年工业现场主流是 CAN、Profibus、Modbus 这类总线。CAN 总线抗干扰强、成本低但带宽只有 1Mbps 级别挂几十个节点之后一轮通信周期轻松上到几毫秒甚至十几毫秒。对于普通逻辑控制够用可一旦涉及多轴联动插补比如六轴机械臂要做 1kHz 的轨迹更新1ms 的周期就意味着每个周期只能算一次轨迹会明显发顿。Profibus 稍微好一点但本质还是令牌轮询机制节点越多周期越长而且它是主从轮询每个从站都要单独应答一次通信效率随节点数线性下降。Modbus 就更不用说了基于串口或者 TCP实时性基本靠运气。问题的核心在于这些总线的通信模型是逐个访问。主站问一个从站从站答一个再问下一个。节点数量一多光通信开销就把周期吃满了。工业现场需要的恰恰是所有节点在同一时刻被同步更新这就催生了实时以太网方案。1.2 EtherCAT 的飞读飞写机制EtherCAT 最核心的设计思想叫Processing on the fly我习惯叫它飞读飞写。主站发一帧以太网数据这帧数据在环网上依次经过每个从站从站在数据帧经过自己的那一刻直接从帧里读取发给自己的数据、把要上报的数据写进帧里然后帧继续往下走。整个过程从站不需要把整帧收完再处理也不需要单独回一帧。这个机制带来的直接好处是无论挂多少个从站主站始终只发一帧、收一帧。100 个从站和 10 个从站主站的通信开销几乎一样周期时间只取决于帧在物理链路上传播的延迟。这就是为什么 EtherCAT 能做到几十微秒的周期而节点数还能上百。打个比方传统总线像老师挨个点名每个学生单独回答EtherCAT 像老师把一张问卷传下去每个学生只填自己那一栏传完一圈问卷就收回来了。效率差距一目了然。1.3 和普通以太网的本质区别很多人会问EtherCAT 用的是标准以太网物理层和帧格式那它和普通以太网有什么本质区别区别在于谁来处理帧。普通以太网里每个网卡收到帧后要交给协议栈、CPU 处理这个软件路径的延迟不可控抖动大。EtherCAT 从站用的是专用 ESCEtherCAT Slave Controller芯片或者 FPGA 实现的硬件逻辑帧经过时由硬件直接读写不经过 CPU延迟是确定的、可预测的。另外 EtherCAT 用的是逻辑环网拓扑物理上可以是线型、树型、星型但数据流是环形的。主站发出的帧绕一圈回到主站主站通过帧里的工作计数器判断这一轮是否正常完成。这种设计让 EtherCAT 既有以太网的带宽又有现场总线的确定性。2. EtherCAT 报文结构与寻址方式拆解2.1 一帧 EtherCAT 数据长什么样EtherCAT 帧是嵌在标准以太网帧里的。以太网帧的 EtherType 字段填 0x88A4就表示这是 EtherCAT 报文。帧内部由若干数据报Datagram组成每个数据报包含命令、索引、地址、长度、数据区和工作计数器WKC。命令字段决定了这个数据报是读还是写、访问的是逻辑地址还是物理地址。常见命令有 APRD自动增量物理读、APWR自动增量物理写、LRD逻辑读、LWR逻辑写、LRW逻辑读写。自动增量寻址用于从站初始化阶段逻辑寻址用于正常运行阶段。工作计数器是 EtherCAT 的一个巧妙设计。每个从站处理完一个数据报后会把该数据报的 WKC 加一。主站收到返回帧后检查 WKC 是否等于预期值就能判断这一轮通信是否所有从站都正常参与了。如果某个从站掉线WKC 就会少主站立刻能发现。2.2 自动增量寻址与逻辑寻址的配合从站刚上电时主站还不知道每个从站的位置和类型这时候用自动增量寻址。主站发一个 APRD 数据报地址字段填 0第一个从站收到后把地址加一第二个从站看到地址变成 1 就处理……以此类推。通过这种方式主站可以逐个读取每个从站的信息完成拓扑扫描和从站识别。识别完成后主站会给每个从站分配逻辑地址把它们的输入输出数据映射到一段连续的逻辑地址空间里。之后正常运行就用 LRW 命令一个数据报就能读写所有从站的 IO 数据。这就是 EtherCAT 高效的关键——一次逻辑读写覆盖全部节点。2.3 从站 ESC 内部的数据存储区每个从站里的 ESC 芯片有一块内部存储区通常几 KB 到几十 KB。这块存储区被划分为若干区域寄存器区、过程数据 RAM、邮箱区等。过程数据 RAM 就是主站和从站交换实时 IO 数据的地方主站的 LRW 数据报直接映射到这块 RAM 上。邮箱区用于非周期通信比如参数配置、固件升级、SDO 读写。EtherCAT 的 CoECANopen over EtherCAT协议就跑在邮箱通道上用对象字典的方式管理从站参数。这也是为什么很多 EtherCAT 从站会带一个 objdef.c 文件——那就是对象字典的定义编译时如果指针类型转换有问题就会报类似 conversion from pointer to small 的警告本质是对象字典里某些条目类型和实际存储不匹配。3. 分布式时钟 DC 同步的完整过程3.1 为什么需要 DC 同步EtherCAT 的通信周期可以做到很小但如果各个从站的本地时钟各走各的哪怕初始对齐了跑一段时间也会漂移。对于多轴联动来说如果两个伺服的时间基准差了几微秒插补出来的轨迹就是错的。所以 EtherCAT 引入了分布式时钟Distributed ClocksDC机制让所有从站的时钟对齐到同一个参考时钟。DC 同步的目标是所有从站的系统时间偏差控制在纳秒级通常要求小于 100ns。这个精度是靠硬件时间戳和传播延迟测量实现的不是软件对时能比的。3.2 参考时钟与从站时钟的传播延迟测量DC 同步的第一步是选一个参考时钟通常是第一个支持 DC 的从站或者主站自己。然后主站发起一轮测量发一个带时间戳的帧帧经过每个从站时从站记录下帧到达和离开的本地时间。帧绕一圈回到参考点后主站就能算出每一段链路的传播延迟。具体来说主站先发一个广播读命令让所有从站锁存当前本地时间。然后主站再发一轮从站记录帧到达时刻。通过比较不同从站记录的时刻结合已知的帧传播顺序就能算出每个从站到参考时钟的偏移量。这个过程叫传播延迟测量是 DC 初始化的核心。3.3 时钟漂移补偿与同步循环测出初始偏移后从站会把自己的本地时钟加上这个偏移对齐到参考时钟。但晶振会漂移所以还需要持续补偿。EtherCAT 的做法是主站周期性发送 ARMW自动增量读多写命令把参考时钟的当前时间广播给所有从站从站根据这个时间调整自己的时钟速率。这里有个细节从站不是简单地把时间设成参考值而是调整自己时钟的走速。如果本地时钟走快了就稍微放慢走慢了就加快。这种平滑调整避免了时间跳变保证同步过程连续稳定。实际调试时你会看到从站的 System Time Difference 寄存器值逐渐收敛到接近零收敛速度和稳定性就是判断 DC 配置是否正确的关键指标。3.4 DC 配置中容易踩的坑我踩过最典型的一个坑是从站支持 DC但主站没使能 DC 模式结果从站时钟自由运行多轴联动时轨迹抖动明显。排查时看从站的 0x092C 寄存器System Time Difference值一直在几百微秒波动这就是没同步的表现。另一个坑是传播延迟测量时拓扑里有分支。EtherCAT 支持树型拓扑但 DC 测量对分支的处理有讲究如果主站配置的拓扑和实际接线不一致测出来的延迟就是错的。所以接线变更后一定要重新扫描拓扑别偷懒沿用旧配置。还有一个常见问题是参考时钟选择。默认第一个 DC 从站做参考但如果那个从站本身晶振质量差整个网络的同步精度都会被拖累。工程上一般选主站或者晶振最好的从站做参考。4. 主站与从站的实现路径4.1 主站方案Linux 上的 IgH EtherCAT Master主站实现目前最主流的是 Linux 上的 IgH EtherCAT Master。它以内核模块形式运行直接操作网卡绕过协议栈保证实时性。安装流程大致是下载源码、配置、编译内核模块、加载模块、启动主站服务。配置里最关键的是网卡绑定。IgH 需要独占一块网卡通过ec_master的main_devices参数指定。绑定时要确认网卡驱动支持常见的 Intel 网卡e1000e、igb支持较好。绑定后这块网卡就不能再用于普通网络通信了所以工控机上一般至少两块网卡一块跑 EtherCAT一块跑普通网络。启动后可以用ethercat命令行工具扫描从站ethercat slaves列出所有从站ethercat pdos查看过程数据映射ethercat sdos读写对象字典。这些命令是调试的主力建议一开始就把常用命令记熟。4.2 从站方案STM32 加 ESC 芯片从站实现常见两种一是用专用 ESC 芯片如 ET1100、ET1200、LAN9252配 MCU二是用带 EtherCAT 从站功能的 MCU 或 FPGA。基于 STM32 的方案通常是 STM32 加 LAN9252 或 ET1100STM32 通过 SPI 或并口访问 ESC。STM32 侧要跑从站协议栈处理 PDO 映射、SDO 服务、状态机切换。状态机从 INIT 到 PREOP 到 SAFEOP 再到 OP每一步都有明确的检查项。比如 PREOP 到 SAFEOP 要完成邮箱通信配置SAFEOP 到 OP 要确认 PDO 数据有效。调试时如果卡在某个状态上不去基本就是对应的配置没做对。从站还需要几个网口标准 EtherCAT 从站需要两个网口IN 和 OUT实现环网直通但如果是从站链的末端可以只用一个。有些紧凑型从站芯片内部集成了两个 PHY外部只需要接两个 RJ45。如果做的是分支节点可能还需要更多端口但那是特殊情况。4.3 对象字典与 PDO 映射的实操从站的对象字典Object Dictionary定义了所有可访问的参数用索引和子索引寻址。比如 0x6000 通常是输入 PDO 映射区0x7000 是输出 PDO 映射区。PDO 映射决定了哪些对象被周期性传输哪些走邮箱。配置 PDO 映射时主站和从站的映射必须一致。我遇到过主站配了 8 字节输入从站只准备了 4 字节结果读出来的数据错位。排查时用ethercat pdos对比主从站的映射表一眼就能看出问题。对象字典的代码实现里那个 objdef.c 的警告其实很常见。它通常是说某个对象条目的指针被转成了小类型可能是定义时类型不匹配。虽然只是警告但如果涉及实际数据访问可能导致读取错误。建议把这类警告当错误处理逐个核对对象类型定义。5. Linux 侧 EtherCAT 环境搭建与调试命令5.1 内核模块编译与网卡绑定在 Linux 上搭 IgH 主站第一步是确认内核版本和源码匹配。IgH 对内核版本有要求太新的内核可能编译不过需要打补丁。编译流程是./configure --with-linux-dir/usr/src/linux然后make和make modules_install。网卡绑定用ethercat工具或者直接改配置文件。绑定后加载ec_master模块用dmesg看日志确认主站启动成功。如果日志里报 no device 或者 failed to open基本是网卡没绑对或者驱动不支持。注意绑定 EtherCAT 的网卡不能再被 NetworkManager 管理否则会冲突。建议在配置里把这块网卡排除掉或者直接关掉 NetworkManager 对它的管理。5.2 常用调试命令速查调试 EtherCAT 离不开ethercat命令行工具下面这些是我用得最多的命令作用使用场景ethercat slaves列出所有从站上电后确认拓扑ethercat pdos查看 PDO 映射排查数据错位ethercat sdos读写对象字典配置从站参数ethercat states查看从站状态状态机卡住时ethercat master查看主站信息确认主站运行ethercat dc查看 DC 状态排查同步问题ethercat states特别有用它会显示每个从站当前处于哪个状态。如果某个从站一直在 PREOP 上不去说明邮箱配置有问题如果在 SAFEOP 上不去 OP说明 PDO 数据没准备好。5.3 实时性调优的几个关键点Linux 本身不是实时系统跑 EtherCAT 主站需要做实时性调优。常见做法是打 PREEMPT_RT 补丁把内核变成完全可抢占的。另外要调整 CPU 隔离把主站线程绑到独立核心上避免被其他任务打断。还有几个细节关闭 CPU 频率调节cpufreq避免频率变化影响定时关闭不必要的后台服务用chrt把主站线程设成实时优先级。这些做完之后周期抖动能从几百微秒降到几十微秒甚至更低。我实测下来普通内核加这些调优1ms 周期能稳定跑但要做到 250us 以下PREEMPT_RT 基本是必须的。如果对抖动要求极高还可以考虑用 FPGA 做主站但成本和开发复杂度都上去了。6. 实际项目中的经验与常见问题6.1 拓扑扫描失败的排查链路拓扑扫描失败是最常见的问题排查要按链路走。先看物理层网线是否插好、从站供电是否正常、指示灯状态。EtherCAT 从站一般有 RUN 和 ERR 两个灯ERR 常亮说明有错误。物理层没问题就看主站日志dmesg里会显示扫描到几个从站。如果数量不对可能是某个从站没上电或者网线断了。如果扫描到但从站状态不对用ethercat states看具体卡在哪。还有一种情况是拓扑里有不支持 EtherCAT 的设备比如普通交换机。EtherCAT 对交换机很敏感普通交换机可能引入不确定延迟导致扫描失败或者周期抖动。工程上建议用专用分支模块或者直接线型连接。6.2 周期抖动大的原因分析周期抖动大通常有几个来源一是主站实时性不够CPU 被其他任务抢占二是网络里有非 EtherCAT 流量干扰三是从站处理能力不足某个从站响应慢拖累整个环。排查时先看主站侧用cyclictest测系统延迟。如果系统本身抖动就大那 EtherCAT 周期肯定稳不了。然后看网络确认没有其他流量跑在 EtherCAT 网段上。最后逐个从站排查把可疑从站摘掉看抖动是否改善。6.3 从站开发中的状态机陷阱从站状态机切换是开发中最容易卡的地方。INIT 到 PREOP 需要邮箱通信正常PREOP 到 SAFEOP 需要 SMSync Manager配置正确SAFEOP 到 OP 需要 PDO 数据有效且 DC 同步完成如果使能了 DC。我遇到过一次卡在 SAFEOP查了半天发现是 SM2 和 SM3 的配置反了。输入和输出的 Sync Manager 配置必须和 PDO 映射对应配反了状态机就上不去。这种问题看代码很难发现用ethercat sdos读 SM 配置寄存器对比才找到。6.4 多轴联动场景下的 DC 调优多轴联动对 DC 精度要求最高。除了基本的 DC 配置还要注意几点参考时钟选晶振最好的节点传播延迟测量后确认每个从站的偏移量合理运行中监控 System Time Difference超过阈值要报警。实际调优时我会先把 DC 使能让系统跑起来然后用ethercat dc看各从站的时间差。如果某个从站偏差明显大于其他可能是它的晶振有问题或者链路延迟测量不准。必要时可以手动调整补偿参数但一般优先换硬件。7. 写在最后的一点个人体会EtherCAT 这套东西看文档觉得不难真正上手才知道细节多。我最大的体会是协议原理要懂但更重要的是动手搭一遍。从主站编译、网卡绑定到从站状态机、PDO 映射每一步都有坑踩过一遍才算真会。另外调试工具要用熟。ethercat那套命令看着简单但组合起来能解决大部分问题。遇到状态机上不去、数据错位、周期抖动先别急着改代码用命令把现场状态读出来往往问题就清楚了一半。最后说个容易被忽略的点EtherCAT 的稳定运行依赖硬件质量。网线、连接器、从站芯片任何一个环节偷工减料最后都会体现在周期抖动上。工业现场不比实验室电磁环境复杂该用好料的地方别省。
返回列表