干运动控制这一行的,应该都经历过从脉冲轴到总线轴的切换。以前做多轴设备,脉冲频率上限、接线长度、抗干扰、伺服数量,哪一个都能让人头疼一整天;现在EtherCAT基本成了中高端运动控制的事实标配,接线变成一根网线串到底,周期同步能做到微秒级,轴数从几轴到几十轴都敢往上堆。我第一次在一台24轴设备上跑通EtherCAT同步时,说实话有点不太适应——原来调同步要抠脉冲沿、要看示波器,现在只要把SYNC0、SYNC1这些参数配对了,多轴联动自己就整整齐齐。
这篇主要聊两块:一是EtherCAT本身,包括它的报文机制、同步参数SYNC0/SYNC1、从站开发和实际组网案例;二是FSoE(Functional Safety over EtherCAT,安全EtherCAT),也就是把安全功能跑在标准EtherCAT网络上的那套做法。适合正在学EtherCAT的新手,也很适合那些想把安全功能并入总线的设备工程师。内容不搞教科书式的罗列,全部按我在现场遇到的实际问题和项目里的处理方式来写。
1. EtherCAT凭什么后来居上:从“报文抄送”到“报文飞过”
1.1 传统总线为什么满足不了多轴运动控制
早期做多轴协调,大家用脉冲加PLC或者专用运动控制卡,轴一多就要算频率、算加减速,线缆一大把,现场干扰一来位置还会丢。后来出现了现场总线,比如Profibus DP、DeviceNet,本质上还是主站轮询从站:主站问一句,从站答一句,一个周期里从站越多,轮到每个从站的时间就越晚。同步精度能到几毫秒就算不错,做飞剪、贴装、联动这类要求高的工艺,明显不够用。
EtherCAT的思路和上面完全不同。它不是轮询,而是主站把一帧报文发到网络上,报文经过每一个从站时,从站硬件当场取出属于自己的数据、塞进要回传的数据,然后立刻转给下一个从站。所有从站都在同一帧里“同时”看到自己的数据,配合分布式时钟,执行时刻可以达到微秒级同步。这个思路在工业以太网里是独一份的。
1.2 EtherCAT报文如何“飞过”从站
用一句大白话总结EtherCAT的数据传输:报文是“飞”过从站的,不是“被抄送”的。
主站发出的每一帧以太网报文中,包含若干个数据报(Datagram)。从站控制芯片(ESC)实时检查经过自己的数据报,如果目标地址是自己,就直接在硬件层面修改对应数据位的值,同时更新一个叫WKC(工作计数器)的字段,表示“这站已经处理过了”。整个处理过程不需要从站CPU参与,转发延迟通常只有几百纳秒。
我习惯用一个比喻:传统总线像邮局寄信,一封信一封封装、一件件送,越远的住户越晚收到;EtherCAT更像一条快递流水线,包裹经过每个人手里时,大家当场把自己的货塞进包裹或者从包裹里拿走自己的货,所有人处理的是同一个包裹。所以从用户角度看,EtherCAT是串行传输,但效果上所有从站都是“同时”收到数据的。
1.3 硬件处理才是实时性的关键
EtherCAT能跑到微秒级实时,很大程度上依赖从站控制芯片的硬件处理机制。主站发出的周期数据,从站ESC直接在两端的物理层芯片之间做报文转发与数据插入,MCU只是在需要的时候读写DPRAM里的数据。也就是说,通信周期不受从站固件处理速度限制。
很多从站开发者第一次上手时会觉得奇怪:为什么我的MCU主频不高,却也能跑1kHz甚至更高的EtherCAT周期?原因就在这里——通信处理和应用程序处理是解耦的。真正要在1ms周期里做完的位置环、速度环等,是MCU自己算的,而报文收发与数据交换已经由ESC硬件完成了。这也是我在后面讲从站开发时反复强调的一点:别急着优化MCU代码,先把ESC的同步和数据处理机制吃透。
1.4 分布式时钟DC:让24个轴在同一时刻动作
如果只有“同一帧数据同时到达”,还不够,因为在物理线上,第一个从站和最后一个从站收到报文的时间还是有微小差异。要让24个轴真正在同一时刻输出位置,EtherCAT引入了分布式时钟(Distributed Clock,DC)机制。
DC的核心思路很简单:主站选择一个从站作为参考时钟,其他所有从站不断校准自己的本地时钟,最终整个网络上所有设备共享同一个时间基准。应用层在编程时可以指定某一时刻作为同步点,比如下一个周期的上升沿,每个从站到达这个时间点后同时锁存输入或刷新输出。这就是SYNC0信号的基础——它不是一个主站从站之间“轮流触发”的信号,而是从站内部根据共享时钟自己产生的同步中断。
理解了这一点,你再去看现场设备“明明是同一张网,为什么启用了DC之后跑起来明显平整了”,心里就有数了。
2. SYNC0和SYNC1:运动控制同步参数到底怎么配
2.1 先搞清楚SYNC0和SYNC1的角色
EtherCAT从站配置文件里常看到0x1C32、0x1C33这些对象,里面就是SYNC0和SYNC1的事件配置。这两者的角色分工,新手很容易搞混。
SYNC0是周期同步事件,通常作为从站应用层的主循环触发源。也就是说,从站MCU在SYNC0中断到来时,去读取主站下发的目标位置/控制字,执行位置环或速度环,然后刷新实际位置与状态字回传给主站。在伺服驱动器场景里,SYNC0基本就等同于“位置控制节拍”。
SYNC1是第二同步事件,常见用途是输入锁存或精确采样。比如要用编码器的Z相做原点捕捉,或者要在特定时刻锁存一个高速输入信号的时间戳,就可以把它分配给SYNC1。SYNC1可以设定自己的周期和偏移时间,不一定非得和SYNC0一致。
2.2 DC模式下配置实例
拿我在一个24轴项目里的常规配置举例,主站周期1ms,所有轴用SYNC0作为控制周期,SYNC1用作编码器锁存:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 分布式时钟DC | 启用 | 所有从站共享时间基准,必须开 |
| SM2/SM3同步模式 | 设为DC模式 | 输入输出事件由DC时钟控制 |
| SYNC0周期 | 1 ms | 与主站任务周期一致 |
| SYNC1周期 | 1 ms | 输入锁存周期,可按需调整 |
| Sync0偏移时间 | 按站点编号递增 | 补偿报文到达延时,具体见下 |
| 同步单元分配 | 输出PDO绑定SYNC0 | 输入PDO可绑定SYNC0或SYNC1 |
需要特别提醒的是,SYNC0和SYNC1的偏移时间(Shift Time)不是随便填的。EtherCAT帧从主站出发,经过第1个从站、第2个从站……到达第24个从站是有物理延时的。如果所有从站都在SYNC0上升沿“立刻输出”,那么第24个站的输出实际比第1个站晚了一个微秒级的时间。单看一个周期,这个时差可能很小;但在高速高精度工艺里,这个时差就会表现为“波浪”或“扭曲”。正确的做法是给不同从站配置不同的偏移时间,让所有从站的实际输出动作发生在同一个物理时刻。
2.3 偏移时间与从站数量
那偏移时间怎么算?按经验,一般在每个从站的ESC配置里有一个基于DC的本地延时补偿机制,主站工具(比如汇川InoProShop、倍福TwinCAT)在扫描时会自动计算从站延时。手动配置时,可以参考一段估算:报文在一个从站上的处理转发延时通常不到1μs,线缆传输每米约5ns,所以第N个从站的延时大约等于前面N-1个从站转发延时之和加上线缆延时。24个站串下来,累计可能也就十几到几十微秒。虽然不大,但如果你做的是±0.01mm级别同步,这点时间乘上速度会变成可观的轮廓误差。
我的建议是:新项目调试时把主站工具自动算出的偏移时间先保留,不要一上来就改成0;如果出现联动波浪,最先检查的就是这个值有没有被意外清掉。现场的坑我踩过不止一次,最后查下来不是伺服参数问题,而是SYNC0偏移时间全被写成了0。
2.4 抖动排查
即使SYNC0配对了,如果整机还是能看到明显的“一顿一顿”,就要查几个方向。一是主站周期是否稳定,有些PLC里如果程序任务和EtherCAT周期任务没分开,或者中断被别的服务阻塞,周期会有毛刺;二是从站数量增加后,总线周期是否已经接近极限,最好用抓包工具看总线实际负载和周期波动;三是伺服驱动器的位置环增益是否和同步周期匹配,周期从1ms改成0.5ms后,增益如果不变,有些轴会感觉“更紧”或“更冲”。
排查抖动时,我看到有人喜欢反复调伺服增益,结果越调越乱。更快的做法是用示波器或分析工具同时看几个轴的实际位置曲线,如果所有轴都在同一时刻出现一个方向一致的微小抖动,基本就是同步或主站周期的问题;如果只有某一轴抖,再看机械和伺服增益。先把同步问题排除,再谈单轴调参,这个顺序很重要。
3. 从站开发入门:ESC、状态机和六个容易踩的坑
3.1 一套EtherCAT从站由什么组成
EtherCAT从站硬件核心是ESC(EtherCAT Slave Controller)芯片,常见有Beckhoff的ET1100、ET1810,Microchip的LAN9252等。ESC承担所有通信协议处理,对外提供DPRAM接口,MCU通过SPI或并行总线访问DPRAM里的邮箱和过程数据。市面上很多从站模组就是把ESC和MCU做一个板上,开发时只需要在MCU里跑从站协议栈代码。
从站软件方面,EtherCAT技术组织提供了SSC(Slave Stack Code)工具,可以生成从站协议栈的基础代码。很多人第一次打开SSC会蒙圈:一堆C文件、配置选项。我建议先别急着改代码,第一步是把自己的ESC硬件接好,用主站软件(比如TwinCAT)能扫到从站,确认硬件和EtherCAT状态机都能正常跑,之后再动协议栈和应用逻辑。
3.2 从站状态机:Init→PreOp→SafeOp→Op
EtherCAT从站有一个明确的状态机,主站会逐步引导从站切换状态:Init(初始化)→ PreOp(邮箱通信建立)→ SafeOp(过程数据通信建立,但输出仍被禁止)→ Op(正常运行)。这个设计很聪明,它保证了启动过程中“先建立通信,再传数据,最后才允许输出”,避免伺服或IO模块在通信尚未稳定时乱动作。
我遇到最多的问题是从站卡在SafeOp进入不了Op。常见原因有:主站已经发送了有效的输出数据,但从站应用层的PDO映射不完整,导致状态机校验失败;或者是看门狗设置太短,数据帧稍微迟一点就被判定为通信超时。排查时先看主站的日志,它会明确提示是“输入数据无效”还是“同步错误”,再针对性查PDO配置或看门狗参数。别一上来就把锅推给伺服本身,大多数情况下问题都在协议栈配置。
3.3 对象字典和PDO映射怎么组织
EtherCAT的从站应用数据通过过程数据对象(PDO)组织,每个PDO由多个子项组成。比如一个伺服轴在周期同步位置模式(CSP)下:
- RxPDO(主站→从站):控制字、目标位置
- TxPDO(从站→主站):状态字、实际位置、实际速度
对象字典里的地址、子索引要和从站的ESI描述文件(XML)一致。主站软件导入从站XML后,会自动识别可用的PDO和同步参数。有的从站支持在线配置PDO映射,新手改完映射后一定要注意重新上下电或者重新切换状态,否则映射不生效,主站还是会报数据长度不匹配。
3.4 实操中的六个坑
SPI读写时序:LAN9252这类芯片的SPI接口对时序要求比较严,MCU端如果用了不带超时的忙等待,偶发读回的数据会错位。建议加CRC校验或重复读取验证。
PDO映射地址重叠:改PDO映射时,两个子项指向了同一个对象地址,数据会互相覆盖,位置数据和报警字冲突,表现是“偶发跳变”。
站别名没配:EtherCAT默认按照物理连接顺序分配站号;如果设备换位置或者增加从站,站号就全变了。调试方便的做法是给每个从站设置设备别名(Alias),把站号和物理设备绑定。
拓扑串接后某站掉线:这往往是网线或接头问题。EtherCAT对物理层质量敏感,水晶头没压好、屏蔽层接地不良,都会出现高速下丢包。用质量好一点的工业网线和金属接头,能少很多事。
DC同步环没配好:从站要支持DC才谈得上微秒级同步,如果不校验从站是否真正进入了DC同步状态,SYNC0就算配了也可能没生效。
忽略WKC:开发或者排查时,用EtherCAT抓包工具看WKC值很有用。WKC表示这一帧有多少从站正常处理了,值不对就能定位到具体哪一站没处理数据,省得一台台查。
这六个坑,我自己在不同项目里都踩过,尤其是第二个和第三个,隐蔽性很强,报错信息也很不直观。写在这里给做从站开发的朋友提个醒。
4. 汇川H5U带24个660伺服轴的配置案例,新手能学到什么
4.1 这案例解决什么问题
网上最近很流行一个案例:汇川H5U中型PLC通过EtherCAT带24个SV660N伺服轴。很多新手拿它当EtherCAT网络的入门参考,我觉得确实合适。H5U本身是CODESYS内核,EtherCAT主站集成得比较完整;SV660N是常见的标准伺服驱动器,支持CSP、CSV等标准运动模式。两者的组合刚好覆盖了“主站怎么配、从站怎么接、轴怎么出位置”这三个最基本的问题。
组网方式其实很简单:H5U的EtherCAT网口出来接第一台660的IN口,660的OUT口再接第二台的IN口,一路串到第24台。站号默认就是物理顺序:第1台是站1,第2台是站2,以此类推。这也是新手最容易懵的地方——不是随便配一个站号,而是靠物理接线顺序决定的。
4.2 总线周期与负载估算
很多人一听24个轴,就觉得总线会不会带不动。我按典型CSP模式估算一下:每个轴输出PDO按6字节(控制字+目标位置)、输入PDO按6字节(状态字+实际位置)算,24个轴合计大约288字节;加上EtherCAT报文头、邮箱等内容,一帧也就400字节上下。在100Mbps的物理线速下,传输一帧的纯时间大概几十微秒,即使主站扫描周期设成1ms,总线负载也只有百分之几。所以24轴对EtherCAT来说远没到瓶颈,真正要关注的是主站CPU能否在每个周期内完成运算和各轴插补。
如果选的PDO映射比较大,比如把实际速度、报警码、转矩全部加进去,一帧数据量可能到700字节以上,传输时间依然在1ms周期承受范围内。但周期缩短到250μs时,就要重新算负载了,并且从站数量越多,MASTER的调度压力越大。我给的建议是:项目初期把主站周期设为1ms,跑通后再根据联动效果和CPU余量决定是否缩短。
4.3 新手应该重点看的配置点
看这类案例程序,重点不是抄参数,而是看四件事。
第一是站号分布和拓扑。第二是PDO映射,案例里每个轴映射了哪些对象,为什么目标位置要映射到CSP模式里的对象,控制字和状态字里各个bit的含义。第三是DC同步参数,案例里SYNC0周期、偏移时间是怎么设的。第四是轴使能顺序:先建立通信,再复位报警,最后使能伺服,这个顺序在很多配置里写得很清楚,照着走一遍比自己瞎试快得多。
4.4 跑起来之后经常出现的问题
我用类似结构做过项目,跑起来之后出问题的点很集中。比如某个轴偶尔报“跟随误差过大”,得先看是不是那个轴的增益没调好;但如果是在24个轴都静止时会随机某一个轴报一次,十有八九是同步周期抖动或者控制周期和伺服周期不匹配。这时候别急着加增益,按我第2节讲的排查顺序来。
再比如中途掉了一站,重新推上去之后其他轴都还在跑,只有掉线的轴不动。原因是从站重新进入Op后,需要重新接收一轮完整的同步数据,如果程序里没有做“重新启动后先复位再使能”的逻辑,驱动器就不会动。这类逻辑,案例程序里通常会写,但新手往往忽略了它的必要性,等到现场出了问题才反应过来。
5. FSoE:在同一根网线上把“安全”也走成总线
5.1 传统安全回路是怎么做的
以前做设备安全,急停、安全门、光栅都是硬接线:安全继电器出一路硬触点,直接串进伺服驱动器的使能回路或主接触器线圈。这种方式可靠性高、排查直观,我在很多老设备上修过安全回路,一根线断了马上就能量出来。但它最大的问题是线缆多:一个安全门双通道至少两根常闭线,多个急停要串成一大串,安全IO点多了之后柜子里的线像瀑布一样。
还有一个问题是诊断能力弱。硬接线安全回路断了,报警面板只有一个“安全回路断开”,到底是哪个急停、哪扇门出问题,要一个人拿万用表量半天。
5.2 总线安全的核心思路:黑通道
FSoE的思路就是在普通EtherCAT网线里再走一套“安全通信”。它不是一个独立的安全总线,也不是把安全信号和普通信号混在一起传,而是在EtherCAT的基础上用一套额外的报文格式,端到端地保护安全数据。
FSoE用的“黑通道”(Black Channel)原则很有意思。它把整条EtherCAT链路看作一个不可信的传输通道——中间可能丢包、乱序、错位、被篡改,FSoE协议在上层通过连接ID、32位CRC、序号和看门狗来识别这些异常,一旦发现异常就进入安全状态。所以中间的交换机、从站设备完全不需要懂安全协议,它们只需要透明转发。换句话讲,安全通信的可靠性不是靠链路质量,而是靠协议本身对错误的检测能力。
打个比方,普通报文像快递包裹,FSoE报文像放在保险箱里的贵重物品——快递运输过程中包裹有没有被拆过不重要,重要的是保险箱的锁、编号和完整性校验摆在明面上。
5.3 FSoE报文里藏了什么
FSoE报文实际上是作为EtherCAT邮箱通信的一种数据类型跑在网络上的。每一帧FSoE数据包含几个关键信息:连接ID(用于标识是哪一对安全主站和安全从站在通信)、序号(发送方每帧递增,接收方发现序号不连续就知道丢帧或乱序了)、32位CRC(覆盖整条FSoE帧,检测篡改和误码)、状态码(反映安全状态机)、以及实际的安全数据。
连接建立过程也不是随便发的,而是走一套安全状态机:先复位,再启动,参数化,检查参数,最后进入数据交换阶段。两边约好的连接ID、CRC参数和看门狗时间只要对不上,就永远进不了数据交换状态。这个机制保证了安全通信不能“马马虎虎跑起来”,配置错了宁可不通信。
5.4 SIL3和常用安全功能
FSoE可以达到IEC 61508的SIL3安全完整性等级。对做设备的人来说,SIL3意味着通讯环节的故障检测能力足够覆盖绝大多数随机硬件失效和系统性失效。光有通信协议还不够,真正执行安全功能的还是设备本身:安全PLC里的安全程序、驱动器内部的STO逻辑、安全IO模块的双通道输入等。FSoE只是把安全信号从主站传到从站的载体,最终切断驱动的是驱动器内安全电路,不是协议本身。
伺服系统里常见的通过FSoE触发的安全功能:
| 功能 | 含义 | 典型应用 |
|---|---|---|
| STO | 安全转矩关断,切断电机力矩 | 急停、门开关触发后直接停 |
| SS1 | 安全停止1,先按斜率减速再断力矩 | 正常停机后进入安全状态 |
| SS2 | 安全停止2,减速后保持受控停止,不立即断力矩 | 可快速恢复生产的场景 |
| SOS | 安全运行停止,位置保持并监控 | 防止意外移动 |
| SLS | 安全限速,速度超过设定值触发安全反应 | 人员在场时的维护运行 |
6. FSoE配置与故障响应:从参数到现场排查
6.1 安全连接的建立
FSoE落地配置,主要是在安全PLC和安全从站里各建一条安全连接。两边要约定一组参数。我在项目里常用的一组参数:
| 参数 | 典型值 | 说明 |
|---|---|---|
| 连接ID | 自定义,确保全网唯一 | 主站和从站一致,否则不进Data状态 |
| 看门狗接收超时 | 50~200 ms | 超过该时间没收到有效帧,进入Failsafe |
| FSoE CRC配置 | 使能 | 每条安全报文都做32位校验 |
| 安全从站地址 | 与EtherCAT站号绑定 | 换站后需要重新检查 |
配置完成后,安全PLC会向FSoE从站发起连接,从站校验参数没错后才进入数据交换状态。调试时最常看到的状态是“连接建不起来”,十有八九是连接ID不一致或从站安全参数化数据没下载成功。别改了一大堆参数,应该先在从站工具里确认安全参数已经生效并回读对比。
6.2 故障响应时间怎么算
做安全评估时,要给出从触发急停到“设备实际停下来”的时间。这个时间不只是按下按钮到信号到达的时间,而是整条链路时间之和。粗略算:FSoE看门狗时间(比如50ms,最坏情况要等一整帧超时)加上安全PLC的扫描周期(比如10ms)加上安全从站检测到FSoE故障后内部切换STO的时间(通常几毫秒),再加上驱动器关断功率和电机制动的机械时间。前两部分是通信和安全程序固有的,可以通过缩小看门狗和安全PLC周期来压缩,但也不能无限小,因为太小容易误触发。
实际项目中,我一般先按最坏情况估算一遍,如果总时间不满足设备的安全要求,再逐段优化。不要单独为了追求“响应快”把看门狗设成10ms,结果总线稍微抖动一下就全线进安全状态,那比响应慢还难受。
6.3 现场常见问题
连接ID冲突:多个安全从站共用一个连接ID,主站只认第一个,其余全部无法连接。排查时给每个安全从站编独立的ID。
参数化后进不了Data:连接参数、CRC匹配模式、安全数据长度对不上都会卡住。用主站诊断信息看是“参数不匹配”还是“看门狗超时”,指向完全不同。
安全功能测试必须做双通道验证:比如STO功能,要分别验证两个通道触发时都能正常切断力矩,还要做断线测试,模拟通信中断时从站必须进入安全状态。这个测试不要偷懒,我见过调试时功能正常,但断掉一根网线后驱动器照样还有力矩的情况,原因就是从站安全参数配置里把通信看门狗关了。
安全从站替换后参数丢失:有些伺服驱动器的安全参数保存在驱动器内部,更换备件后没有重新导入安全配置,设备处于无保护运行状态。新的FSoE从站上电后,第一步就是核对安全参数版本。
我个人的习惯是,做FSoE项目时把“通信建立”和“功能验证”分开管理:先让连接稳定进入数据交换,跑一个小时后看有没有误报,再去做真正的STO/SS1动作测试。这样既检验了通信可靠性,也避免了现场一通乱调导致安全问题被掩盖。
这个思路其实同样适用于普通EtherCAT调试——先把通信层面的周期、同步、掉站整稳定了,再处理应用层的工艺逻辑,步调会顺很多。FSoE听起来复杂,但剥开来看,无非就是EtherCAT基础上加了一层带安全校验的“保险箱”,真正理解和跑通之后,反而会觉得比原来那一大摊硬接线省心太多。