1. EtherCAT为什么值得系统学一遍
做运动控制和设备自动化的工程师,最近几年应该都能感受到EtherCAT的统治力。不管是倍福、汇川、松下、台达还是各家DIY控制器,EtherCAT几乎成了中高端伺服通信的默认选项。EtherCAT这个名字本身就很直白:Ethernet for Control Automation Technology,把标准以太网帧改造成一个可以"边跑边取数"的实时总线。而FSoE(Functional Safety over EtherCAT)则是站在EtherCAT肩膀上解决设备安全通信的方案,把急停、安全门、光幕这些信号直接挂在同一根网线上传输。
这篇算是我自己整理的一份学习与实战笔记,覆盖了从EtherCAT主从站原理、STM32从站开发、汇川H5U带24个660伺服轴工程调试,到FSoE功能安全的入门拆解。适合三类人看:一是刚接触EtherCAT、不懂从站怎么跑起来的嵌入式工程师;二是做PLC集成、要给多轴设备做联动控制的应用工程师;三是对功能安全有兴趣、想搞明白FSoE到底比硬接线安全在哪的设备负责人。文章里的内容没有太多学院派推导,都是我在现场和测试台上真刀真枪折腾出的一些经验。
2. 核心机制与选型思路
2.1 EtherCAT为什么快:整帧穿行与分布式时钟
理解EtherCAT最大的一个坎,是它的数据交换方式和TCP/IP完全不同。以太网平时是"端到端"的,一个数据帧从A到B,中间经过交换机或路由器,每经过一跳就要解析、缓存、转发。EtherCAT把这一步彻底改了:主站发出去一个帧,从站在物理层面上直接把帧里属于自己那一段数据读出来、写回去,整个过程用硬件完成,没有操作系统调度介入,也没有协议栈转发延迟。数据帧从一个站穿到下一个站,一去一回,整个总线的延迟基本就是线缆和PHY芯片处理的时间。
在线上的表现就是:哪怕挂几十个伺服轴,一个周期也只需要几百微秒到一两毫秒。如果只有EtherCAT这一个从站总线,把伺服驱动的给定值、状态字、实际位置全部塞进一帧里,速度非常可观。另一个让EtherCAT发光的机制是分布式时钟(Distributed Clock,简称DC)。所有从站会共享同一个系统时间基准,主站每隔一段时间发一个特殊的同步帧,从站用本地硬件捕获这个时间,并自动补偿传输延迟和时钟漂移。这也是为什么EtherCAT可以做多轴插补,因为每个轴的动作基准是同一个时钟,不会出现某一台伺服已经在动、另一台还在等数据包的尴尬。
分布式时钟里有一个绕不开的坑:实际跑起来之后,从站之间的时钟漂移不是固定的,它会随温度、晶振精度而变。所以主站和从站必须循环执行延迟测量与同步补偿。调这个参数的时候,本地周期内系统时间会有很小的抖动,对普通点位控制没影响,但做高精度插补时,周期抖动会直接映射到轨迹上。我见过的做法是把DC同步的抖动目标控制在1微秒以内,如果跳得厉害,优先检查PHY芯片和ESC的时钟配置,而不是先怀疑算法。
2.2 主站与从站的角色划分
EtherCAT总线上只有一个主站,负责发帧、管理状态机、分配地址、配置同步参数。其它节点都是从站,从站不能主动发起通信,只能在帧经过自己的时候被动响应。刚开始学的人容易把EtherCAT当成CAN那样"每个节点平等"的总线,这个观念要立刻转过来。
主站通常有两种实现路径。一种是运行在PC或嵌入式Linux里的软件主站,常见的有IgH主站(基于内核模块的一个实现)、SOEM(一个轻量级开源主站库)、TwinCAT(倍福的Windows/实时系统方案)等。另一种是PLC厂家把主站集成进控制系统,比如汇川H5U、倍福CX系列、欧姆龙NJ系列,用户不需要关心主站协议栈实现,只需要在配置软件里把设备组态出来。
从站则几乎无一例外地使用专用的从站控制器芯片(ESC,EtherCAT Slave Controller),比如Beckhoff的ET1100、ET1200,或者各家授权兼容芯片。ESC的作用是把EtherCAT帧处理、FMMU映射、Mailbox报文这些繁琐的协议细节变成硬件寄存器操作。假如没有ESC,用一颗普通MCU的MAC去解析EtherCAT帧,基本不可能达到工业级周期。因为帧到达后给MCU的中断-响应-处理-回复流程太长,再加上一个帧要穿过几十个站,任何一个站多等几微秒,整个总线都会出问题。这也是为什么我看到有人问"能不能拿ESP32做EtherCAT从站"时,我会劝他老老实实上ESC,除非只是做概念验证,不会用到真实控制器上。
2.3 什么时候该选EtherCAT而不是其它总线
选EtherCAT,直观的理由是速度和同步性。假设一个项目有24个伺服轴,每个轴的过程数据大约是16字节输入加16字节输出(这已经是很节省的映射了),那么一帧的数据需求大概768字节,对应一个以太网帧就能装下。如果用Modbus RTU轮询从站,一帧一问一答,周期随轴数线性增长,24个轴跑到10毫秒以上很正常。但EtherCAT不管挂多少个从站,只要总数据量不超过一个以太网帧长度,周期基本持平。
不能只看速度,还要看生态。EtherCAT从站设备和主站设备的支持度现在已经很广,伺服、步进、IO、阀岛、编码器、温控模块,基本都能找到对应产品。FSoE的出现也意味着安全产品和标准EtherCAT设备能混挂在同一总线上,这对设备布局和安全回路设计来说非常划算。
当然EtherCAT也有不适合的场景。现场级离散传感器、低速IO、长距离分布的设备网络,用EtherCAT的经济性不如普通远程IO总线,硬件成本也更高。通信距离虽然可以用光纤扩展,但一般单段在100米内,太长的场景不如直接使用Profinet或者普通以太网加TSN。
3. 基于STM32的从站开发经验
3.1 从站硬件选型:ESC、PHY、EEPROM
STM32做EtherCAT从站,是一个很经典的组合。MCU不直接处理总线帧,它通过SPI和ESC连接,读写ESC内部的寄存器域和数据区,然后由MCU完成应用逻辑,比如读编码器、算位置环、控制IO等。ESC负责和主站打交道,MCU负责和产品功能打交道,两边通过SPI接口交换数据。
硬件上该选什么样的ESC?做小点数IO从站、又需要低成本的,用ET1200这类精简型;做伺服驱动器或者带复杂功能的安全从站,推荐ET1100这类完整型,它有更多FMMU通道和DPRAM空间。选择ESC时要注意工作电压、支持的过程数据大小和Mailbox能力,因为有些精简型ESC的邮箱缓冲做得很小,固件升级时会很不方便。实际项目里我见过不少人从STM32的PB12/PB13接了SPI去连ESC,但由于ESC的SPI时序要求比较严格,需要认真对着芯片手册核对自己的SPI模式、时钟极性和相位、最大频率以及片选信号的有效电平,稍不留神就通信不稳定。
从站板上另一块容易被忽略的是EEPROM,也就是从站信息接口(SII,Slave Information Interface)。EEPROM里存的是厂商ID、产品码、版本号、对象字典摘要、SM通道配置等。第一次上电时主站会读取这块EEPROM来识别设备。如果EEPROM烧录错误或者校验失败,从站会直接进入初始化失败的状态。EEPROM常见容量是16Kbit,写入时要注意页写限制,最好在代码里做一次性整体写回,避免频繁局部写导致寿命问题。
3.2 对象字典与那行767-D警告的处理
从站开发一定会遇到对象字典(Object Dictionary)的配置问题。从站的功能接口、映射关系、参数配置最终都体现在对象字典里。主站通过CANopen-over-EtherCAT(CoE)协议来访问这些对象,比如伺服轴的目标位置通常放在0x607A,状态字在0x6041,控制字在0x6040。如果使用STM32从站方案,你需要把对象字典的数据结构搭建起来,再把SDO请求、PDO映射、紧急事件等机制和ESC的Mailbox接口对接。
编译代码时常有人碰到这样一条警告:
..\ethercat\objdef.c(890): warning: #767-D: conversion from pointer to small integer
这条警告出现在IAR编译器下,本质是代码中把一个指针变量直接赋给了较小的整数类型(比如uint8或uint16),编译器认为类型差异大、可能发生截断。在EtherCAT从站代码里,最典型的场景是把对象字典条目的入口地址(指针)写进了一个用于映射的整型字段里。比如你定义了一个对象条目,然后用&object_entry这样的地址去做赋值运算,对方类型是uint16,高字节就被丢了。
处理方式要看你的意图。如果那个整型字段确实只需要存放偏移量或索引,那就把指针先强制转换成uintptr_t,再截断到目标宽度;如果那个字段本质上是用来表示“存在标记”的,就不应该把指针赋给它,而是用对应的宏定义值。我个人的习惯是直接看objdef.c第890行附近,看它是在哪个结构体初始化里报错,找到字段的语义再动手改,不要随便把整个警告屏蔽掉,否则后面可能埋下运行时写错寄存器地址的隐患。这个警告初看不影响功能,一旦对象字典的内存布局调整或平台换成64位MCU,截断会从隐患变成故障。
3.3 从站调试的完整流程
拿到一块STM32从站板,第一次接入主站系统,建议按这个顺序走。
第一步,先确认ESC的EEPROM内容是否正确。没有EEPROM内容,主站会把设备识别成“未知设备”。我用过的调试办法是用主站工具直接读SII信息,看到厂商ID、产品码、产品版本号都对得上,再往下走。
第二步,让从站进入Pre-Op状态。主站会尝试初始化邮箱通信,如果你看到从站一直卡在INIT回不去,多半是邮箱初始化通道没配对,或者MCU的SPI中断处理里丢了邮箱消息。这时候可以把SPI的收发流程打开调试打印,逐条看Mailbox请求是否响应。
第三步,配置PDO映射和SM通道。PDO映射的作用是把对象字典里的变量“映射”到DPRAM的过程数据区,这样每个周期主站和从站交换的只是很紧凑的一段字节,不必通过邮箱一帧一帧地读。很多初学者在这一步容易忘记SM的长度匹配,主站配置了3个字,从站只填了2个字,结果数据错位,位置值忽然变成很大的随机数。检查的方法很简单,把SM0到SM3的起始地址和长度都打印出来,和组态软件里的配置逐项核对。
第四步,切换OP状态测试周期性数据。重点观察从站的看门狗是否被反复触发。在OP状态下,如果主站发送周期帧的节奏不稳定,或从站应用层来不及更新输出数据,看门狗一超时就会把从站踢回Safe-Op。实际调试里,这个问题经常不是协议栈的问题,而是MCU应用代码里某个任务占用了太长时间,导致ESC的DPRAM数据没及时读写。可以把ESC中断优先级拉高,把过程数据更新放到中断上下文里完成,主循环只处理业务逻辑。
4. 汇川H5U带24个660伺服轴的通信配置
4.1 24站从零搭建:接线与建站
汇川H5U是内置EtherCAT主站的PLC,我在项目里用H5U带过24个660系列伺服驱动器,总轴数24,整体跑CSP周期同步位置模式。这个配置方案非常适合新手参考,因为H5U的组态软件完成度比较高,只要按部就班配置,基本不会出现太烧脑的问题。
接线方面,H5U本体通常有两个EtherCAT网口,一进一出,首站接在第一个网口,第二个网口接着下一个伺服。注意EtherCAT拓扑虽然是菊花链或星形,但每个从站都必须配置IN和OUT方向,接错会导致链路不通。现场环境里,我个人习惯使用成品机制网线,长度控制在20米以内,如果必须走长线或者经过高干扰区域,尽量用屏蔽网线并保证设备接地良好。
建站时,在H5U的编程软件里先扫描总线,让软件自动发现挂在网线上的24个伺服驱动器。每个站会自动分配一个站地址,默认可能从1排到24。如果将来要换设备或者维护,最好手动分配固定站地址,不要依赖自动化分配,否则更换某一台驱动器后地址可能错乱。扫描到全部24个站之后,确认每个站的产品型号和固件版本一致,再继续下一步参数配置。
4.2 CSP模式与关键参数
CSP模式(Cyclic Synchronous Position)是EtherCAT运动控制里最常使用的模式之一。每个周期主站把目标位置下发到伺服,伺服在本地完成位置闭环,同时把实际位置反馈给主站。相比PTP点到点模式,CSP省去了主站对加速减速过程的逐步计算,更有利于实现连续轨迹。
在H5U里配置CSP的要点有三项。第一项是过程数据映射,通常需要在伺服驱动器的对象字典里,把目标位置(0x607A)、控制字(0x6040)作为输出;把实际位置(0x6064)、状态字(0x6041)、跟随误差等作为输入。每个站分配多大长度的DPRAM,一定要和驱动器实际支持的PDO映射一致。H5U软件支持在站配置里手动编辑映射,也可以一键导入驱动器的ESM文件。
第二项是周期时间。同步周期一般设为1毫秒或2毫秒。周期越小,路径越平滑,但总线负载和主站CPU负担也随之上升。带24个轴、每个站十几字节过程数据,1毫秒完全可以跑得很稳。如果周期抖动太大,可以从1毫秒放宽到2毫秒,对大部分设备来说效果差异并不大。
第三项是伺服使能与回零方式。首次调试时,先让伺服运行在速度模式验证通讯方向,再切换到CSP测试位置跟随。回零一般使用绝对值编码器,配置原点偏置后每次上电直接读取当前坐标。如果是增量编码器,必须在每次上电后执行回零,否则所有位置指令都会基于错误原点运行。
4.3 上电使能与多轴联动调试
24轴系统直接上电就跑通是非常罕见的,更常见的流程是分组调试。先把24个轴分成4组,每组6个,逐组使能、逐组空跑。H5U的组态软件里可以单独给每个站做测试面板,给单个轴发一个缓慢的斜坡位置指令,观察实际位置是否跟随,方向是否正确。
联动调试的核心是看同步误差。运行一段简单的小圆或直线插补,在线监控每个轴的实际位置和指令位置差。如果所有轴的跟随误差都不大,说明主站下发和伺服反馈都稳定。如果某个轴的跟随误差明显偏大,先检查该轴伺服驱动器的速度环和位置环增益,再检查这一站的EtherCAT通信质量,比如帧丢失率、看门狗计数。还有一个隐藏问题:24轴的负载不同时,机械特性差异大,伺服参数可能不一致。这时候不要试图统一所有轴的增益参数,而是单独对重载轴做惯量辨识和增益整定,让各轴实际响应速度接近,插补出来的轨迹才好看。
多轴联动阶段,如果有轴报跟随误差超限,不要马上改驱动器参数。先用示波器功能把该轴的目标位置和实际位置同时抓出来,看是相位滞后还是剧烈震荡,再对症处理。我在现场见过一个案例,某轴报误差超限的原因是联轴器松动,机械间隙直接吃掉了位置反馈,和电子参数完全无关。这种问题靠调参数是永远调不好的。
5. FSoE功能安全与EtherCAT的融合
5.1 FSoE到底在保护什么
FSoE的全称是Functional Safety over EtherCAT,它是把功能安全通信建立在标准EtherCAT物理层之上的协议。传统安全回路用硬接线把急停按钮、安全门开关和安全继电器串成一个回路,信号可靠但布线复杂,一个安全功能多的设备,控制柜里会塞满安全继电器和安全电缆。
FSoE的思路是让安全数据和非安全数据在同一个EtherCAT网络里传输。急停状态、安全门状态、安全扭矩关断(STO)指令,都以数字量形式封装在FSoE的连接PDU里,与伺服控制数据一起走总线。这样既保留了功能安全要求的诊断覆盖率,又省掉大量硬接线,对轴数多的设备来说,控制柜紧凑程度和接线效率提升非常明显。
需要注意的是,FSoE并不是在总线坏了之后再反应的机制。它同样要求发生通信错误、数据损坏或者连接中断时,安全功能在规定的反应时间内动作,比如通信抖动超过阈值就触发安全停机。
5.2 Black Channel与安全报文的检查机制
FSoE有一个很巧妙的概念叫Black Channel。意思是FSoE不关心底层EtherCAT本身是否绝对可靠,它把整个EtherCAT网络当作一个“黑盒子”,在其之上自行设计一套安全通信协议,用来检测通讯过程中的所有错误模式:帧丢失、帧重复、错误顺序、错误CRC、地址错误等。
FSoE的报文叫FSoE Safety Control Protocol(FSCP)。在连接建立后,主站与安全从站之间周期传输带有CRC校验、Sequence Number、Connection ID以及安全数据的报文。Sequence Number用来检测报文是否重复或失序,CRC用来检测报文内容是否被篡改或损坏,Connection ID用来确认接收方确实是预期的伙伴设备。配对错误、CRC错误或连续丢失多个帧,都会触发安全连接断开,设备进入安全状态。目前FSoE通常配合安全等级为SIL3的认证设备使用,对于常见的机械设备,可靠性已经完全够用。
我在给设备配置FSoE时,最强调的一点是Functional Safe Connection Pairing。FSoE连接必须成对配置:主站侧的安全地址和从站侧的安全地址要严格配对。曾经有两个轴的安全从站地址配反了,调试时A轴安全门信号一直报错,而B轴却能收到A轴的数据,排查了很久,最后才发现是地址错位。建议在每个安全站的配置表上用标签打印机把地址编号打出来贴在端子侧,维护时一眼就能核对。
5.3 FSoE与标准过程数据的共存
一根总线里既要跑标准EtherCAT过程数据,又要跑FSoE安全数据,协议上是支持的。FSoE的数据包在EtherCAT帧里,通常占用专用的Mailbox或独立地址空间,不会和普通伺服PDO互相干扰。对应用工程师来说,不需要深入协议细节,只需要在组态软件里把安全站和非安全站在拓扑上挂好,并配置安全连接。
在实际的驱动产品上,安全扭矩关断信号可以直接走FSoE到达伺服驱动器,驱动器收到安全指令后,内部把功率管关断,不需要通过外部安全继电器切断动力电源。这是设备调试里一个不小的福利:你可以在不拆线的情况下,通过软件强制触发STO来验证安全回路动作。
但只要涉及功能安全,验证工作就不只是“通讯通了”那么简单。项目交付前,需要按设备的安全需求做风险评估和验证测试,重点是验证故障注入时安全反应是否符合预期。比如故意屏蔽一个轴的STO信号,确认系统能报错并停机;或者把安全通信线缆断开一瞬间,确认设备在要求时间内进入安全状态。这种测试我不建议在产线正常运行时做,最好在调试阶段再三确认。
6. 常见问题与排查技巧实录
6.1 编译期与协议栈常见问题
开发STM32从站时,最常见的一类问题是对象字典定义和映射不一致。前面提到过767-D警告,还有一类常见问题是SDO请求长度不符。主站发来一个写请求,长度是4字节,而从站对象字典里该对象定义的访问长度是2字节,协议栈通常会返回错误,但从站本身不会崩;可一旦你在错误处理里没有正确清空Mailbox缓冲,就会卡死后续所有通信。遇到这种情况,先把对象字典每个条目的数据类型和默认值打印出来,和主站的ESM文件对照,基本能定位。
IAR环境下另一个高频问题是内存对齐。ESC的DPRAM区域通常要求对齐到4字节访问,如果你用指针方式直接访问一个未对齐的缓冲,在Cortex-M3/M4上可能触发HardFault,或者在编译优化等级较高时出现行为异常。写从站代码时,推荐把过程数据缓冲区定义为联合体或带有对齐属性的结构体,不要用裸数组加偏移量拼接。
6.2 总线级问题排查速查表
下面这份速查表是我调试EtherCAT总线时经常对照的清单,对新手尤其有用。
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 主站扫描不到从站 | 接线方向接反、从站未上电、EEPROM信息异常 | 检查IN/OUT方向、给从站单独供电、用工具读取SII信息 |
| 从站识别型号不一致 | EEPROM中产品码或版本号错误 | 重新烧录SII,核对厂家ID和产品码 |
| 从站一直停在Pre-Op | Mailbox通道初始化失败 | 检查SM0/SM1配置,确认邮箱大小和时间 |
| 切OP后立马掉回Safe-Op | 看门狗超时、过程数据未及时更新 | 检查应用层周期任务耗时,确认PDO长度和映射 |
| 位置反馈周期跳变 | DC同步抖动、伺服参数不合适 | 查看DC同步误差,必要时松开1倍周期观测 |
| 某轴跟随误差大 | 机械间隙、增益不匹配、该站数据映射错位 | 抓取指令位置与实际位置曲线分步判断 |
6.3 几个容易被忽略的细节与经验
最后一个部分是我想特别分享的几个细节经验,这些经验通常不会出现在产品手册里。
第一,接地和网线质量决定了总线稳定性的下限。现场如果出现时而能通信、时而掉站的奇怪问题,优先检查屏蔽层接地和设备等电位。不要在弱电柜里走环形接地,要采用星形接到单一的接地排,再配电柜外壳。以太网隔离变压器不是万能的,高共模电压一样能击穿隔离层造成通信异常。我修过很多“奇奇怪怪”的EtherCAT故障,最后都是接地问题。
第二,从站EEPROM的烧录次数有限,量产烧录时要采用批量烧录器或专用生产线工具,不要在产品调试时反复擦写同一个EEPROM。试过一块板子在调试阶段烧录了几百次,最后SII读取偶发失败,主站扫描时有时识别不到,排查很久才发现是EEPROM寿命耗尽。
第三,别忽视从站固件升级对组态的影响。固件升级后,一些对象字典的默认值或PDO映射方式会发生变化,旧组态在升级后可能报错。制定升级流程时,建议先升级一台做验证,确认无误后再批量升级,并且升级后重新执行一次完整的通信测试,包括看门狗、DC同步和FSoE安全连接验证。
第四,调试FSoE时,请务必先断开可能触发真实停机的安全输出设备,比如先把安全继电器的输出端与被控负载分离,再去操作FSoE连接配置。原因很简单:配置阶段一旦地址或CRC参数错误,通信建立后会立刻触发安全动作,但这时机器可能停在危险位置或运行中途,突然停机本身就有风险。在所有安全配置都稳定之前,不让真实负载参与测试,是我个人最坚持的一条底线。
第五,整套EtherCAT系统的性能瓶颈不在总线,而在主站的应用层调度。24轴联动时,H5U的PLC扫描周期和EtherCAT周期是两个维度。如果你的运动控制算法放在PLC扫描周期里,而扫描周期大于总线周期,插补路径就会“阶梯化”。这种情况下,最好把轨迹规划算法放在更短周期的中断任务里,或者交给带独立运动控制器的方案。这也是为什么一些高精度项目会把EtherCAT主站和运动控制核心分开设计。
这套EtherCAT和FSoE的知识体系,我自己也是从踩坑里一点点攒出来的。有时候回头看最早的从站程序,总觉得当时绕了太多远路。如果你刚接触这块,希望这篇整理能帮你把路标立起来,少走点弯路。后面如果再折腾出新的坑和心得,我会继续补充分享。