搞工业现场这么多年如果要我说哪条实时总线最有“性价比”我的第一反应多半是EtherCAT。它用一种看起来有点“笨”的主从轮询方式硬生生把传统以太网拖进了硬实时阵营而且扩展起来比我想象中简单得多。最近几个月我一边在用汇川H5U带24个SV660N伺服轴跑整线节拍一边又在帮朋友调一块基于STM32的EtherCAT从站板子前者是主站应用后者是从站开发正好把协议栈上上下下踩了个遍。这篇东西就当作一次复盘从通信原理、主从站选型、多轴配置到现场报错排查一次讲清楚。不管你是刚入门现场总线的电气工程师还是正在给运动控制系统做主从站方案的嵌入式开发多少都能从里面找到能直接用的东西。1. EtherCAT凭什么做到高实时协议底层不再神秘很多人一上来就背概念说什么EtherCAT是“实时以太网”却搞不清楚它到底实时在哪里。其实核心就一句话数据在路上传处理也在路上做不等帧收完再处理。这个变化带来的效果非常直观下面拆开看。1.1 帧被拆成一个一个子包每个从站只认自己的那一节传统以太网交换是存储-转发交换机收到完整帧再查表转发遇到多端口同时发送还要排队整个链路时延和端口负载强相关所以没法保证确定性。EtherCAT换了一种玩法主站发出的以太网帧里装了好几个子报文这些子报文按顺序对应拓扑上的从站。帧从头传到尾每经过一个从站从站里的ESC芯片会立刻把属于自己的报文提取出来、改写数据、再送回帧里整个过程就是在硬件里“顺路捎带”完成的。类似什么就像高铁经过每个小站时不靠站台上堆放货物而是每个站的人在列车经过的一瞬间把包裹塞进对应车厢全程不停车所有包裹也在高速移动中完成交换。这就把传统以太网的转发延迟变成了“整帧过一遍的延迟”。实测下来100Mbps速率下100个从站的循环周期压到1ms以内很常见抖动可以到纳秒级。比如我用主站工具看到过几十纳秒的SYNC抖动。对于伺服控制这种需要多轴同步发指令的场景这才是真正的底气。从站数量增加时帧会变长但依然是线速转发而不是像交换机那样遇到冲突就排队所以从站数量不是瓶颈。1.2 状态机不是摆设它是保证系统不跑到沟里的安全带EtherCAT定义了Init、Pre-Op、Safe-Op、Op四个状态从站必须按顺序切换。Init阶段只能做邮箱通信此时主站可以读写从站字典但不能跑过程数据Pre-Op阶段可以分配PDO映射、设置同步参数但过程数据不输出Safe-Op阶段过程数据开始循环但输出被强制为安全值比如让伺服处于使能前状态只有到了Op所有控制量才会真正输出到执行器。这样设计有一个好处任何状态切换失败都停在原状态并给出错误码不会让现场设备乱动。从应用层看伺服轴最常用的是CiA402运动控制模式配合EtherCAT周期同步位置CSP模式。所谓CSP就是主站在每个同步周期把目标位置发给驱动器驱动器由自己的位置环完成跟踪而不是靠主站去一五一十地给脉冲。这样位置环的周期由驱动器决定常见配置有250μs、500μs、1ms等。项目里我按伺服说明书设了500μs主站PLC的循环周期也同步成500μs两边对上才不会出现曲线难看或者电机吱吱响。1.3 分布式时钟让24根轴在同一个“瞬间”收到指令多轴同步最怕什么怕A轴已经动了B轴还在等上位机。EtherCAT通过分布式时钟DC机制来统一从站时间。主站会选一个参考时钟所有从站在启动阶段通过测量帧的传输延迟来校正本地时钟之后每个周期根据从站时间戳计算补偿。只要DC配置正确各从站触发同步中断的时刻就能对齐到亚微秒甚至几十纳秒级。实际项目中我习惯先把DC起没起来作为第一项检查。如果DC没配好最典型的症状是轴在运行中每隔一段时间会“抖”一下用示波器看两个轴的同步信号间隔能有几十微秒甚至更多而配置正确之后波形基本重叠在一起。这部分内容往往被网上很多文章跳过但恰恰是EtherCAT比CANopen等老总线更出彩的地方。2. 从站和主站方案怎么选STM32到底能不能做EtherCAT很多人问我STM32能不能做EtherCAT从站我的答复通常是一句话STM32做从站控制没问题但EtherCAT底层通信不是STM32自己完成的。这里面的门道得从头讲。2.1 主站的三条路线PLC内置、PC软件、嵌入式开源EtherCAT主站本质上就是一个能按周期发送帧的设备。现场最省事的是PLC内置主站比如汇川H5U直接支持EtherCAT编程软件里扫一下从站就能建组缺点是主站实现不可见出现协议层面的问题只能通过厂家接口排查。如果要在Windows上做样机验证Beckhoff TwinCAT是绕不开的工具它能把PC变成一个软PLC主站拖个驱动模块就能扫从站。但TwinCAT授权费用不低而且对网卡有要求不少普通千兆网卡无法跑出好的实时性。嵌入式场景我常用SOEM它是一个轻量开源主站库跑在Linux或者裸机上都可以适合自研小设备。真要追求实时可以内核态跑IgH EtherCAT Master但它要求你对Linux实时补丁、网卡驱动比较熟不是拿来即用。CODESYS虽然内置主站但要看你用的硬件平台有没有Runtime授权。选主站的原则很简单开发周期短、调试界面好用就选商业方案需要深度定制的才选开源方案别一上来就想着自己造轮子。2.2 从站核心是ESC芯片MCU只当“管家”EtherCAT从站的实时性不是靠MCU软件堆出来的而是靠专用ESC芯片EtherCAT Slave Controller硬处理的。ESC负责解析帧、更新地址数据、管理状态机MCU只需要通过SPI或并行接口读写ESC的数据。MCU的任务是运行协议栈的“应用层”读指令、更新对象字典、控制设备动作。所以STM32完全可以做从站但前提是外面挂一颗ESC例如LAN9252、ET1100、ET1200或者选择集成ESC的单片机比如瑞萨的部分型号。具体接法上常用SPI从机模式STM32和ESC之间用一根SPI连好加上中断线和同步信号线。EEPROMSII里存了供应商ID、产品代码、从站名、PDO默认映射等信息主站扫描时靠它把从站认出来。所以只要EEPROM里的SII配置写错了主站就扫不到或者识别成“未知设备”。这块儿是新手踩坑重灾区。用SSC工具EtherCAT Slave Code Generator生成从站代码时完全没必要看懂每一行但一定要把SII里的名字、产品码、映射长度改对。顺便泼一盆冷水如果指望STM32内置的MAC直接底层实现EtherCAT帧处理那是给自己挖坑。个人换的板子、操作系统、定时器延时都会让周期抖动变大大概率跑不过市场上成熟方案。新项目我更推荐“ESC芯片STM32”或者“带ESC的单片机”把协议解析留给硬件把应用控制留给自己。3. 实操案例用汇川H5U带24个SV660N轴从扫描到CSP纸上谈兵没用我拿最近的实战案例来拆。这套线用了1台汇川H5U做控制网段上挂了24台SV660N伺服驱动器采用菊花链接线从站一台接一台串下去。3.1 先算一笔账24轴在1ms周期里到底要传多少数据很多人一听到24轴就觉得带宽不够。其实EtherCAT的Frame最大可以装1490字节左右的数据而每台SV660N即使按“主站发16字节、从站回16字节”的保守估算24台也才768字节100Mbps线速传完不到100μs再加上几个点对点的控制字整个报文也就几百字节。所以决定周期的不只是带宽更多是主站PLC循环时间、伺服从站执行周期和工程安全要求。我按500μs的同步周期来跑主站侧计算量、网络传输和伺服位置环都留了余量。实际测试下来24轴同时以500μs周期做矩形运动没有出现从站看门狗超时。当然线缆长度、线缆质量和从站间距也会影响最终极限不能只盯着理论带宽。记住一个判断逻辑EtherCAT的多轴容量从来不是帧长度不够而是主站能力和电源容量撑不撑得住。3.2 配置流程扫描、确认地址、核对PDO拿到新板子不要上来就拖24个轴。我习惯先把所有驱动器用网线串起来然后进H5U的EtherCAT配置界面点“扫描设备”。扫描完成后主站会列出一个从站列表这一步如果有的驱动器识别不到多半是末端没有正确终结或者网线松了先处理物理层。然后给每个从站分配稳定的站地址不要依赖拨码开关直接在软件里指定方便后期换备件。接着核对PDO映射。所谓PDO映射就是告诉从站“每个周期在帧的哪段位置放哪些数据”。以汇川为例轴控制一般需要在输出区放控制字、目标位置、目标速度、目标力矩等输入区拿状态字、实际位置、实际速度、实际电流。默认映射通常够用不用随便删减。一旦PDO长度和从站功能配置不符Pre-Op切Safe-Op就会失败。对不上时要重新通过组包/拆包工具核实。还有一个细节从站的站地址如果和上一次记录的不同主站可能会提示“设备替换”这时候需要确认是新换的备件还是接线顺序错了。3.3 CSP模式与同步参数设置同步位置模式CSP是所有运动控制项目的标配。主站在每个周期下目标位置驱动器内部执行位置命令。配置时需要把驱动器设为CSP模式并设置位置环、速度环的PI参数。同步参数最关键的是“倍率”主站和从站使用同样的DC参考从站每收到一个SYNC0信号就抓取一次目标位置。如果主站周期和从站执行周期不一致比如主站1ms、伺服250μs那伺服必须以4倍频运行此时要确认驱动器支持。程序里还要注意使能顺序。先清报警、再伺服使能最后给运动指令在CSP模式下位置环的使能逻辑比较严格不能直接往目标位置寄存器里丢一个数就以为轴会跑。我一般把轴使能、复位、运行状态封装成功能块避免在扫描周期里写一大堆分支逻辑。运行起来后用控制面板观察实际位置是否连续、速度是否超调基本能判断伺服环路和同步是否OK。如果出现某个轴运行中“咔”地停住并报跟随误差大概率是主站某几个周期没来得及刷新位置给定这时候先查PLC扫描时间和过程数据刷新是否被别的任务抢占了。4. EtherCAT调试实录从指针告警到从站掉线搞协议少不了和各种报错见面。下面几个是我最近实际遇到的每一个都让我翻了不少官方手册和论坛帖子。4.1 编译警告 #767-dconversion from pointer to small在从站开发时如果用SSC生成的代码配合IAR编译经常看到warning #767-d。我最初看到它并没有当回事后来从站一直扫描不到回头一查问题恰恰出在EEPROM读取代码上。这个警告的意思是编译器发现你把一个指针直接赋值给了小整型变量比如(uint16_t)para-pData在32位MCU上高位会被截断。虽然有时只是“有意的”地址段访问但截断后得到的地址就会偏移导致读出来的SII数据完全是乱的。正确的写法是用uintptr_t做桥梁uint16_t startAddr (uint16_t)(uintptr_t)para-pData;先把指针转成能容纳全位数值的uintptr_t再转成uint16_t并明确注释“此地址段仅用低16位”。这样编译器闭嘴代码意图也明确。排查过程中可以打开一条从站信息把EEPROM内容用16进制打印出来和SII配置对照基本一秒就能看出地址对不对。这类告警不致命但留着它在后续工程里很可能是定时炸弹。4.2 从站扫描不到或状态机卡死的通用排查顺序如果主站扫不到从站先查物理层网线两端是否插紧、线序是否正常、菊花链末端的终端电阻是否打开再看从站电源指示灯和RUN/ERR灯有些从站尚未完成初始化Power灯不亮就说明供电有问题。网络里如果有交换机直接换掉EtherCAT一般要求所有从站挂在同一个主站域内不应该有标准交换机参与。状态机卡死最常见的错误码有AL status 0x0015无效的邮箱配置、0x0018PDO长度不一致等。解决办法是回到Pre-Op之前关闭主站自动配置手动核对邮箱大小、PDO长度和同步单元参数。如果主站工具支持在线读取从站EEPROM也可以快速对比是否和期望不一致。别老想着重插网线先看清错误寄存器再动手。下面这张表是我的速查套路故障现象可能原因优先排查从站扫描不到接线松动、EEPROM错误、地址冲突从LED发光和SII内容入手卡在Init阶段邮箱参数没配对查AL状态码重新分配邮箱卡在Safe-OpPDO映射或DC配置不对核对子报文长度和同步参数运行中偶发掉线网线干扰、看门狗过短改善接地调大看门狗4.3 运行中偶发掉线和干扰问题多轴跑起来之后偶发“某台从站掉线”多半不是协议本身问题而是现场干扰。EtherCAT物理层基于100BASE-TX网线屏蔽层没接地、跟动力电缆同槽布线、端子接触氧化都会导致CRC错误累积。建议使用屏蔽工业网线至少做到两端屏蔽层可靠接地动力线和网线分层走不要挤在同一个线管里。另一个被忽略的是主站看门狗和时间参数。从站看门狗超时时间设太短PLC扫描周期稍微抖动一下就误报。我们要保证PLC循环周期稳定再考虑缩短看门狗。最后如果条件允许可以用一台带EtherCAT分析功能的设备抓帧看CRC错误和同步抖动这样比猜变量快得多。实际项目里我曾经因为一对RJ45端子压接不良导致网络跑半小时就掉一台从站换了水晶头重做后整整一个班次再没出过问题。物理层永远值得第一个怀疑。5. 一些现场的调试经验最后说点个人经验不一定都对但都是我踩过的坑。多轴项目一定要先小规模验证。我带24轴之前先带4轴跑跑循环确认DC同步稳定、PDO映射正确了再扩展到全轴。一次性挂满扫描对了未必程序就对轴多了后同步周期和PLC扫描时序的微小偏差会被放大。另外主站侧的日志一定要开着在出问题时能回放周期时间戳我习惯在程序里记录偶数个周期的最大时间一旦出现大的波动第一时间能判断是主站还是网络卡顿。从站开发的板子第一版最好把SPI速率放低一点。我用某STM32从站SPI速率从10MHz降到5MHz后通信稳定度明显提升所有手焊的电阻、电容最好都用测试板确认。因为ESC芯片内部逻辑很快但MCU的PDI时序跟不上就会出现偶发看门狗。还有一句经常和老同事说的话EtherCAT没什么神秘无非是别把底层交给软件把精力放在应用层。只要能掌握状态机、DC和PDO映射三件事绝大多数问题都能手到擒来。最后提一个小小的建议养成备份从站SII的习惯。每次验证完一套从站把EEPROM的bin文件保存到工程目录。现场换备件的时候直接烧一份进去比在主站里重新配置那台从站省事得多。做工程能把效率抠出来的才是真功夫。
阅读完成 · 觉得有帮助?