ARTICLE DETAIL

资讯详情

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

EtherCAT从站固件升级实战:FoE与CoE全解析

EtherCAT从站固件升级实战:FoE与CoE全解析 1. 从一次产线停机说起为什么固件升级值得单独拎出来讲去年冬天一个做半导体封测设备的朋友半夜给我打电话说他们一台设备上的EtherCAT从站模块出了问题现象很怪主站能扫到节点PDO数据也正常刷新但某个通道的采样值偶尔会跳变重启之后能好一阵过几个小时又复发。他们第一反应是硬件坏了换了模块问题依旧又怀疑是线缆干扰换了屏蔽线还是老样子。折腾到第三天才有人想起来——这批从站模块的固件版本和主站配置里记录的版本对不上是产线临时用了一批旧固件模块顶上去的。这件事让我印象很深。EtherCAT从站固件升级这件事平时没人愿意碰因为它是那种不做没事、做错了出大事的操作。但真到了需要批量更新、需要修复现场bug、需要给客户交付新功能的时候升级能力就是硬门槛。而EtherCAT体系里固件升级主要靠两条路FoEFile over EtherCAT和CoECANopen over EtherCAT。前者是专门为传文件设计的后者本质上是把CANopen的对象字典机制搬到了EtherCAT上通过对象字典里的特定条目来触发和传输固件数据。这篇内容我想聊的不是FoE和CoE是什么这种教科书定义而是把这两条路真正跑通、跑稳所需要的那些细节状态机怎么走、邮箱通信的边界在哪、分段传输的坑在哪、升级失败之后怎么救回来。适合正在做EtherCAT从站开发、设备维护、产线调试的工程师也适合那些被固件升级四个字坑过一次、想搞清楚底层到底发生了什么的人。下面我按实际操作的顺序把FoE和CoE两条链路拆开讲中间穿插我自己踩过的坑和验证过的参数。2. FoE固件升级一条为文件传输而生的专用通道2.1 FoE的定位与它解决的问题FoE的全称是File Access over EtherCAT从名字就能看出来它是EtherCAT协议族里专门负责传文件的那一个。EtherCAT的邮箱通信Mailbox本身是带协议多路复用能力的SM0/SM1这对邮箱通道上可以跑CoE、FoE、EoE、SoE等多种协议靠的是邮箱头里的Protocol字段来区分。FoE的协议类型值是0x02这个值在配置从站邮箱参数时必须和从站固件里声明的一致否则主站发过去的FoE请求会被从站直接丢弃连错误响应都不会回。FoE的设计目标很明确在EtherCAT的邮箱通道上用最小的协议开销完成文件读写。它不关心文件内容是什么固件、配置文件、日志、参数表都能传。正因为这种通用文件传输的定位FoE成了EtherCAT从站固件升级最主流的方式。大多数从站芯片厂商比如常见的ESC芯片方案都会在Bootloader里内置FoE服务端主站侧用FoE客户端把固件文件推过去从站Bootloader接收完、校验通过、写入Flash、跳转到新固件。这里有个关键点很多人一开始会忽略FoE升级通常发生在Bootloader阶段而不是应用固件运行阶段。也就是说从站需要先进入Bootloader模式FoE服务端才处于可用状态。进入Bootloader的方式各厂商不同有的是通过写某个寄存器触发软复位并停留在Bootloader有的是通过SIISlave Information Interface里的配置决定上电后先跑Bootloader还是直接跑应用。这个差异直接决定了你的升级流程怎么设计。2.2 FoE的状态机五个状态和它们之间的跳转条件FoE协议本身定义了一个简洁的状态机理解它是排查升级失败的第一步。状态机大致是这几个状态状态含义进入条件离开条件Idle空闲等待请求上电或传输结束收到Read/Write请求Read读文件收到FoE Read请求数据发完或出错Write写文件收到FoE Write请求数据收完或出错Busy忙请求被排队收到请求但当前无法处理前一个操作完成Error错误校验失败、超时、参数非法收到新的请求或复位实际调试中最常卡住的是Write状态。主站发Write请求时邮箱头里会带上文件名和密码可选从站如果接受会回一个ACK然后主站开始按块发送数据。每一块数据发完从站要回一个ACK主站才发下一块。这个一问一答的节奏是FoE可靠性的来源但也是速度的瓶颈。块大小Block Size通常由从站决定常见的是512字节或1024字节邮箱缓冲区大小必须能容纳整个FoE数据帧加上协议头否则会出现数据被截断但双方都不报错的诡异现象。注意邮箱缓冲区大小在SII或从站配置里定义主站侧配置的邮箱大小必须和从站一致。我见过一次升级失败查了两天最后发现是主站ESI文件里写的邮箱大小是128字节而从站实际是256字节FoE数据帧超过128字节就被主站自己截断了。2.3 分段传输的实操细节块大小、超时与重传FoE的Write操作是分段进行的每一段叫一个Fragment。主站发送一个Fragment后必须等待从站的响应才能发下一个。这个响应可能是ACK继续、Busy稍等、或者Error终止。超时时间怎么设是个经验活。从站处理Flash写入需要时间尤其是擦除一个扇区可能要几十毫秒甚至上百毫秒。如果主站的超时设得太短比如50ms从站在擦除期间来不及回ACK主站就判定超时、重传结果从站收到重复的Fragment状态机乱掉。我的经验是FoE写操作的超时至少设500ms保守一点设1000ms。这个值不是拍脑袋来的而是根据从站Flash的扇区擦除时间来估算的。你可以查从站芯片的Flash手册找到最大扇区擦除时间乘以2作为安全余量。重传机制也要注意。FoE协议本身没有序号机制重传靠的是主站超时后重新发送当前Fragment。从站必须能识别这个Fragment我收过了否则会重复写入。好的Bootloader实现会在FoE状态机里记录当前期望的Fragment序号收到重复的直接回ACK但不重复写。如果你的从站Bootloader没做这个保护升级过程中一旦发生重传固件就可能损坏。这是选型时要重点确认的。2.4 升级完成后的校验与跳转别跳过CRC固件数据全部传完后FoE协议允许主站发送一个完成信号从站收到后开始校验。校验方式通常是CRC32或者厂商自定义的哈希。这一步绝对不能省。我见过为了加快升级速度把校验关掉的实现结果现场升级了200台设备有3台因为传输过程中的偶发位翻转导致固件损坏设备变砖返修成本远超省下的那几秒钟。校验通过后从站把固件写入Flash的应用程序区然后跳转到新固件。跳转前要确认几件事中断向量表是否已经重定位、看门狗是否已经喂过、外设是否已经复位到安全状态。这些是Bootloader的基本功但恰恰是很多自研Bootloader容易漏掉的地方。跳转失败的表现通常是设备反复重启或者停在Bootloader不动这时候只能通过调试接口重新烧录所以升级前一定要确保调试接口可用。3. CoE固件升级借对象字典走一条曲线救国的路3.1 CoE为什么能用来传固件CoE是CANopen over EtherCAT的缩写它把CANopen的对象字典、PDO、SDO这些概念完整地搬到了EtherCAT上。CoE本身的设计目的是做参数访问和过程数据交换不是传文件。但对象字典里可以定义任意类型的对象包括大数组ARRAY和大记录RECORD于是就有了把固件拆成多个对象条目通过SDO分段传输这种做法。用CoE升级固件的典型流程是从站对象字典里定义一组对象比如0x5000到0x5FFF这段厂商自定义区域每个对象是一个子索引对应固件的一个数据块。主站通过SDO分段下载Segmented SDO Download把固件数据逐块写进去全部写完后再写一个触发升级的对象从站收到后开始校验和写入Flash。这条路和FoE比优缺点都很明显。优点是不需要从站进入Bootloader模式应用固件运行期间就能接收固件数据可以先存到外部Flash或RAM里等数据收完再触发升级。缺点是协议开销大、速度慢SDO分段传输每段都要握手而且对象字典的定义需要从站固件和主站配置严格匹配灵活性差。3.2 SDO分段下载的时序与邮箱压力SDO分段下载的时序比FoE复杂。一次完整的SDO下载分两个阶段先是初始化下载Initiate Download主站告诉从站要写哪个对象、数据总长度是多少然后进入分段下载Download Segment每段数据带一个标志位表示还有更多或这是最后一段。从站每收到一段要回一个响应主站收到响应才发下一段。这个过程中邮箱通道的压力比FoE大。因为SDO的协议头更长有效数据占比更低。假设邮箱缓冲区是256字节FoE一帧能带240字节左右的有效数据而SDO分段一帧可能只能带200字节出头。对于几百KB的固件这个差异会放大成几秒甚至十几秒的升级时间差。更麻烦的是SDO分段下载期间邮箱通道被占满其他CoE服务比如PDO映射、紧急报文可能被阻塞。如果从站的应用逻辑依赖PDO实时刷新升级期间可能会出现控制抖动。所以用CoE升级固件通常建议在设备处于安全状态比如停机、维护模式下进行不要在主站正常控制生产的时候做。3.3 对象字典的设计固件缓冲区怎么划分用CoE升级固件对象字典的设计是核心。常见做法是定义一个固件下载缓冲区对象比如0x5FFF下面挂多个子索引每个子索引对应一个固定大小的数据块。主站按顺序写子索引0、1、2……直到写完。最后一个子索引写完后再写一个控制对象比如0x5FFE的特定值来触发升级。这里有个细节子索引的数量和每个块的大小要在设计阶段就定死因为主站侧的配置ESI文件或XML描述需要和从站对象字典完全一致。如果固件大小超过预设的缓冲区总容量就得重新设计对象字典这意味着从站固件和主站配置都要改。相比之下FoE的文件名和长度是动态的灵活得多。另一个细节是数据对齐。SDO分段传输的数据是字节流但对象字典里的对象可能有对齐要求。如果从站固件在接收数据时按4字节对齐访问而主站发来的数据长度不是4的倍数最后一段就会出问题。我的做法是每个子索引固定为256字节固件数据不足的部分补0xFF这样从站处理起来简单也不会出现对齐问题。3.4 CoE升级的适用场景与取舍说了这么多CoE的麻烦那它到底什么时候值得用我的判断是三种情况第一种从站硬件没有独立的Bootloader或者Bootloader不支持FoE。有些低成本从站方案为了省Flash空间Bootloader做得极简只支持通过调试接口烧录这种情况下CoE是唯一能在应用层做远程升级的路。第二种升级过程不能中断设备运行。比如某些产线设备不允许停机只能在线升级。CoE可以在应用运行时先把固件数据缓存起来等一个合适的时机再触发写入和重启。第三种固件数据需要和参数配置一起传输。CoE的对象字典天然适合传结构化数据可以把固件和配置参数打包成一组对象一次性完成升级和配置更新。如果以上三种情况都不满足那就老老实实用FoE。FoE更快、更简单、更可靠是EtherCAT从站固件升级的首选。4. 两条路都绕不开的底层问题邮箱通信与状态管理4.1 邮箱通道的配置一致性不管是FoE还是CoE都跑在EtherCAT的邮箱通道上。邮箱通道的配置在SII EEPROM里定义包括邮箱的起始地址、长度、协议类型。主站启动时读取SII根据里面的信息配置自己的邮箱通信参数。如果主站配置和从站SII不一致邮箱通信根本建立不起来FoE和CoE都无从谈起。我遇到过一种情况从站SII里的邮箱长度写的是128字节但从站固件实际分配的邮箱缓冲区是256字节。这种不一致在正常PDO通信时不会暴露因为PDO走的是过程数据通道不经过邮箱。但一旦发起FoE或CoE请求主站按128字节发从站按256字节收数据错位升级必然失败。排查这种问题需要用EtherCAT主站的诊断工具读取从站的SII内容和从站固件的配置逐字段对比。4.2 状态机切换时的时序陷阱EtherCAT从站的状态机INIT、PREOP、SAFEOP、OP和邮箱通信有紧密关系。FoE和CoE服务在PREOP及以上状态才可用INIT状态下邮箱不工作。所以升级流程通常是先把从站切到PREOP然后发起FoE或CoE请求升级完成后切回OP或者复位。这里有个时序陷阱状态切换和邮箱请求之间需要留够时间。从站从OP切到PREOP时可能需要几十毫秒来停止过程数据处理、清理邮箱缓冲区。如果主站切完状态立刻发FoE请求从站可能还没准备好请求被丢弃。我的做法是在状态切换后加一个100ms的延时或者轮询从站状态直到确认切换完成再发请求。另一个陷阱是看门狗。EtherCAT从站通常有通信看门狗如果邮箱通信期间过程数据停止刷新看门狗可能超时触发从站复位。升级过程中从站复位轻则升级中断重则固件写了一半导致设备变砖。所以升级前要确认看门狗的处理策略要么在升级期间临时禁用看门狗要么确保主站持续发送过程数据维持看门狗。4.3 升级失败后的恢复路径升级失败是必须提前设计好的场景。失败可能发生在传输阶段数据没传完、校验阶段CRC不匹配、写入阶段Flash写失败、跳转阶段新固件启动失败。每种失败的恢复路径不同。传输阶段失败从站应该保持在Bootloader或接收状态等待主站重新发起升级。校验阶段失败从站应该丢弃接收到的数据回到等待状态。写入阶段失败最麻烦因为Flash可能已经被部分擦除旧固件也不完整了。这时候需要从站有一个黄金固件Golden Image机制或者至少保留一个可以通过调试接口恢复的通道。跳转阶段失败通常表现为设备反复重启。好的Bootloader会检测启动失败次数超过阈值就自动回退到Bootloader模式等待重新升级。这个机制叫启动计数器或看门狗回退是工业设备固件升级的标配。提示升级前一定要确认从站有可靠的恢复路径。如果从站没有黄金固件、没有调试接口、没有启动回退机制那升级就是在赌运气。产线上批量升级之前先拿一台设备做完整的失败恢复演练。5. 实战中的参数、工具与验证方法5.1 主站侧工具链的选择做EtherCAT从站固件升级主站侧的工具链选择直接影响调试效率。常见的方案有几种一是用商用EtherCAT主站协议栈自带的FoE/CoE客户端工具比如某些PLC或运动控制器的编程软件里集成了固件升级功能二是用开源的EtherCAT主站比如IgH EtherCAT Master或SOEM自己写升级脚本三是用从站芯片厂商提供的专用升级工具。商用工具的好处是稳定、有技术支持缺点是灵活性差升级流程被封装成黑盒出问题不好排查。开源方案的好处是可控能看到每一帧邮箱数据缺点是需要自己处理状态机、超时、重传这些细节。我的建议是调试阶段用开源方案抓包分析量产阶段用商用工具保证稳定性。两者结合既能搞清楚底层发生了什么又能保证现场操作的可靠性。5.2 关键参数的实测参考值下面这张表是我在实际项目中验证过的一组参数针对的是常见的EtherCAT从站芯片方案邮箱缓冲区256字节Flash扇区擦除时间最大100ms。这些值不是标准规定而是工程实践中的经验值你可以根据自己的硬件调整。参数推荐值说明FoE块大小512字节邮箱256字节时实际有效数据约240字节512是保守值FoE写超时1000ms覆盖Flash擦除时间加余量FoE重传次数3次超过3次失败则终止升级SDO分段超时500msSDO响应通常比FoE快状态切换延时100msOP到PREOP切换后的等待时间升级后复位延时500ms确保Flash写入完成再复位看门狗超时升级期间临时设为最大或持续发送过程数据这些参数在实验室环境下可能显得保守但现场环境的电磁干扰、电源波动、温度变化都会影响通信质量保守一点换来的是升级成功率。我宁愿升级慢10秒也不愿意现场返修一台设备。5.3 升级成功的验证清单升级完成后怎么确认真的成功了不能只看设备能跑起来要做完整的验证。我的验证清单是这样的第一读回从站的固件版本号。大多数从站对象字典里有一个版本对象比如0x100A或厂商自定义对象升级后读这个对象确认版本号和新固件一致。第二检查CRC。如果从站支持读回固件的CRC值和主站侧计算的CRC对比。这一步能发现版本号对了但数据有损坏的情况。第三跑一遍功能测试。至少覆盖PDO通信、SDO参数读写、状态机切换这几个基本功能。有条件的话跑一遍完整的设备功能测试用例。第四观察一段时间。升级后让设备连续运行至少24小时观察有没有偶发异常。有些固件问题不是立刻暴露的而是在特定条件下才触发。第五记录升级日志。包括升级时间、固件版本、操作人、升级前后的CRC值。这些信息在后续排查问题时非常有用。6. 那些文档里不会写的坑6.1 邮箱溢出与数据截断邮箱通信最隐蔽的问题是溢出。主站发送的数据超过从站邮箱缓冲区大小时从站可能直接丢弃整帧也可能截断后处理。两种行为都不报错主站以为发出去了从站实际没收到完整数据。FoE的块大小如果设得比邮箱缓冲区还大就会触发这个问题。排查方法是抓邮箱通信的原始数据看每一帧的实际长度。如果发现主站发出的帧长度超过从站SII里定义的邮箱大小那就是配置不一致。解决方法是统一主站和从站的邮箱配置或者把FoE块大小降到邮箱缓冲区能容纳的范围。6.2 Flash写入的扇区对齐固件写入Flash时如果起始地址没有对齐到扇区边界或者写入长度不是扇区大小的整数倍擦除操作可能会破坏相邻扇区的数据。这个问题在升级部分固件比如只更新应用程序区保留参数区时特别容易发生。我的做法是在Bootloader里做地址对齐检查如果升级数据的起始地址或长度不满足扇区对齐要求要么拒绝升级并报错要么在RAM里做缓冲凑齐一个扇区再写入。这个逻辑必须在Bootloader里实现不能依赖主站保证。6.3 多从站批量升级的节奏控制产线上批量升级时如果同时给多个从站发起升级邮箱通道的带宽会被瓜分每个从站的升级速度都变慢超时风险增加。更糟的是如果某个从站升级失败可能会影响同一网段上其他从站的通信。我的经验是批量升级要串行化一次只升级一个从站。升级完一个确认成功再升级下一个。虽然总时间变长但成功率大幅提高。如果必须并行至少要把并行数量控制在2到3个并且把超时时间相应放大。6.4 固件版本回退的兼容性升级到新固件后如果发现新固件有问题想回退到旧版本这时候要注意新固件可能修改了对象字典、SII配置、或者Flash布局导致旧固件无法直接写回去。回退前要确认旧固件的写入地址和Flash布局和新固件兼容。最稳妥的做法是升级前备份当前固件和SII配置。备份文件保存在主站侧或者从站的外部存储里。回退时先恢复SII配置再写回旧固件。如果从站没有外部存储至少要在主站侧保留一份完整的备份。7. 写在最后升级能力是设备生命周期管理的基础做EtherCAT从站开发这些年我越来越觉得固件升级能力不是锦上添花而是设备生命周期管理的基础设施。一台设备交付到现场可能要运行五年、十年期间难免需要修复bug、增加功能、适配新的主站配置。如果没有可靠的远程升级能力每次都要派人到现场、拆机、接调试器成本高、响应慢、风险大。FoE和CoE这两条路各有各的适用场景。FoE简单直接适合大多数从站方案CoE灵活但复杂适合有特殊需求的场景。不管选哪条路核心都是把状态机、超时、重传、校验、恢复这几个环节做扎实。参数可以调工具可以换但这些基本环节不能省。最后分享一个我自己的习惯每次升级前先在一台 sacrificial 设备上完整跑一遍升级流程包括故意制造失败拔网线、断电、发错误数据验证恢复路径是否可靠。这台设备就是用来牺牲的确认没问题了再上产线批量操作。这个习惯帮我避免了好几次批量事故也让我对从站的Bootloader行为有了更深的了解。升级这件事谨慎永远不亏。
返回列表