ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

EtherCAT从站控制器FCE1353/1354实战:硬件与固件初始化要点

EtherCAT从站控制器FCE1353/1354实战:硬件与固件初始化要点 前阵子帮朋友调一套高速分拣线主站用的是CODESYS从站是一块国产EtherCAT从站控制器卡在OP状态切换那一步整整两天。后来查出来问题不在主站配置而是从站固件初始化顺序没做对ESC一直拒绝进入安全运行模式。那次之后我就意识到EtherCAT项目里真正决定成败的往往不是主站怎么配而是从站控制器这一侧能不能扛住。这篇文章要聊的FCE1353和FCE1354就是这么一类属于“从站侧”的控制器芯片。它们主要用在伺服驱动器、步进驱动器、远程IO、阀岛、数控系统这些设备里负责把设备接入EtherCAT网络并在硬件层面完成数据帧的接收、解析、再转发。对正在选型或者调试从站的工程师来说这篇会把我实际用下来的理解、硬件设计上容易踩的坑、固件初始化的顺序、同步管理器的配置时机以及主站配合的那点事一次讲清楚。内容不堆术语尽量按我真实调试的顺序来有些细节可能是数据手册里不会明说的。1. FCE1353与FCE1354的定位差异选型前先把角色分清1.1 从站控制器不是“CPU”是通信协处理器很多人刚开始接触EtherCAT从站时容易把FCE1353这类芯片当成一个“能跑程序的单片机”来理解这是方向性错误。从站控制器ESC在系统里的角色更像一个通信协处理器它不运行你的业务逻辑不计算运动轨迹它的唯一核心职责是把网线上跑过的EtherCAT数据帧在硬件层处理掉——该转发的转发、该取出的取出、该写入的写入整个过程不经过主控CPU。我打个比方。EtherCAT网络就像一条流水线数据帧是一个装着很多小格子的托盘从主站出发依次经过每一个从站。托盘经过你面前时你不用把整个托盘搬走只需要把属于你这格的东西拿走把你这格的新东西放回去然后传给下一个工位。FCE1353做的就是“搬格子”这件事而且是在硬件里完成的速度极快。那主控MCU干什么主控MCU比如常见的STM32、PIC32、国产ARM通过SPI或并行接口和FCE1353通信从站控制器收到主站数据后会通过中断告诉MCU“有新数据了”MCU读走MCU要发给主站的数据也通过接口写入从站控制器等下一帧经过时自动带走。这种设计的好处是EtherCAT通信的实时性由硬件保证MCU只需要按自己的节奏处理应用逻辑两边不会互相拖累。1.2 FCE1353和FCE1354怎么选从我们拿到的样品和项目反馈来看FCE1353和FCE1354属于同一个系列核心的ESC功能基本一致区别集中在端口数量、从站接口方式、以及集成外设的丰富程度上。FCE1353更偏向标准通用型从站。它集成两个以太网PHY意味着一个设备上只需要两个网口即可完成EtherCAT的IN和OUT级联绝大多数IO从站、通信网关、小型驱动器用这个配置就足够了。从站接口提供SPI模式适合和常见MCU快速对接固件开发量相对小。FCE1354是增强型面向更高集成度的运动控制从站。它提供的端口更多可以支持四端口扩展从站接口除了SPI之外还提供并行接口选项满足大数据量交换的场景同时芯片内部集成了更多应用外设比如正交编码器接口、PWM生成器、扩展IO等。这就意味着如果做的是带编码器反馈的伺服驱动器或者需要本地PWM输出的设备选FCE1354可以把很多外围逻辑收进一颗芯片里硬件设计能简化不少。选型那点事我的建议是三步走。先看端口数需求设备本体只有一根进线一根出线FCE1353足够如果你希望设备同时向下扩展两条支线或者做了冗余环网设计但不想外接交换机就考虑四端口型号。再看主控接口SPI简单适合大多数MCU并行接口吞吐高适合主站刷新周期极短、过程数据量大的场合但占用MCU引脚较多。最后看集成外设如果编码器、PWM这些模块本来就要在MCU里实现用哪个型号差别不大如果想把它们从MCU侧挪走FCE1354更合适。1.3 主流ESC芯片横向对比为了让你定位更清楚我把常见ESC方案放在一起比较了一下。注意芯片型号的具体规格以官方最新手册为准这里给的是选型时的横向参考。芯片集成PHY端口数主控接口DC支持典型场景FCE1353集成双PHY2SPI支持通用IO从站、步进驱动、小型伺服FCE1354集成多PHY2/4SPI/并行支持高集成运动控制、带编码器反馈的驱动器LAN9252集成双PHY2SPI支持成熟方案进口芯片供应链稳定时可选ET1100外置PHY4并行/SPI支持传统高性能从站需外接PHY芯片这里多说一句。国产CC-Link等总线也有一批低成本方案但EtherCAT从站芯片的核心在于ESC寄存器实现是否符合规范。FCE1353/FCE1354的优势一方面是集成度高省掉了外置PHYBOM成本和PCB面积都降下来了另一方面是国内技术支持响应快遇到问题可以直接找原厂FAE这对量产项目很有价值。2. 硬件设计里最容易翻车的几个点PHY、时钟和隔离2.1 端口拓扑2端口与4端口的实际接线差异EtherCAT拓扑和普通以太网不一样从站网口有严格的IN/OUT之分。数据帧从主站出发进入第一个从站的IN口经过内部处理后从OUT口出去接到下一个从站的IN口就这样一个个串下去形成菊花链。所以2端口的从站设备在链路上就是一个“直通”节点。用FCE1353做设备时两个PHY分别对应IN和OUT内部已经把数据流方向处理好了你只需要在硬件上把RJ45和变压器接对软件上不用管哪个口是IN哪个是OUT协议栈会自己协商。真正容易出问题的是链路两端的终端处理——EtherCAT仍然基于以太网物理层最后一个从站后面如果还想接入非EtherCAT设备就需要考虑通信结束后的处理但大多数从站场景直接到底就行。选4端口型号时要克制一点。四端口不是说你有四个自由网口可以随便接设备它的意义在于一个从站节点可以同时向两个方向扩展支线拓扑上形成分支。这会让网络结构灵活很多但对应的主站侧的拓扑配置也要把所有分支关系梳理清楚。对绝大多数项目2端口链条已经够用不要为了“多两个口”多花钱。2.2 时钟与DC为什么“能用”和“同步精度高”是两回事EtherCAT分布式时钟DC是它相比其他实时以太网协议最核心的优势之一。主站会定期把参考时钟广播给所有从站每个从站基于自己的本地时钟做漂移补偿最终实现整个网络上所有从站的SYNC信号对齐到微秒甚至亚微秒级。这个精度听起来很美好但真正落地时从站本地时钟的硬件质量会直接决定DC补偿的效果。FCE1353/FCE1354的时钟输入我建议用高精度晶振而不是凑合的无源晶体。晶体crystal和晶振oscillator的区别在于晶体需要外部起振电路频率精度容易受负载电容匹配和温度影响晶振内部集成振荡电路输出的是干净的时钟信号稳定性更好。如果你做的是普通IO从站用精度50ppm左右的晶体问题不大。但做伺服驱动、希望同步抖动控制在1微秒以内的建议选温漂更小的方案并且让晶振尽量靠近芯片的时钟引脚走线要短远离开关电源区域。时钟这块还有一个隐蔽问题。很多人布局时喜欢把PHY变压器放在网口旁边这是对的但要注意变压器下面不要铺完整的参考地平面否则共模噪声会耦合进信号通道严重的会造成断线或者错帧。我见过一个案子从站偶发掉线最后用示波器量PHY差分线发现噪声超标把变压器下方的地平面挖掉就好了。2.3 从站接口与主控MCU的连接细节不管用SPI还是并行接口有几个信号是必须认真对待的。IRQ是ESC告诉MCU“有事件发生”的引脚必须接而且推荐接到MCU的硬件中断引脚上不能用轮询代替。SYNC信号是DC同步事件输出运动控制场景下需要用示波器确认它的周期和抖动。RESET引脚不要直接浮空要接上拉电阻确保上电时ESC处于确定状态。主控MCU侧最好加一个硬件看门狗周期性读ESC的AL Event寄存器发现异常及时复位。SPI接口的速率建议从ESC支持的较低速率起步调试稳定后再拉高。很多初学者上来就按芯片手册里的最大SPI速率跑结果波形变形读回来的寄存器全是错的还以为是芯片坏了。实际上SPI总线上串联33欧姆左右电阻、拉长CS保持时间这些常规手段就能解决大多数通信不稳定问题。3. 从站固件初始化的主次顺序从EEPROM到状态机3.1 SII EEPROM里到底该写什么每个EtherCAT从站都有一块SII EEPROM相当于从站的“身份证”。里面存着Vendor ID厂商编号、Product Code产品编号、Revision Number版本号、Serial Number序列号以及SM和FMMU的初始配置。主站扫描总线时会读取这些信息来识别设备并决定加载哪个ESI文件。我调试时遇到最多的奇怪问题都是SII EEPROM没写对引发的。比如主站扫描能看到设备但加载设备描述文件时报错“版本不匹配”或者设备识别出来了但过程数据映射完全错乱因为EEPROM里的PDO配置和实际固件不一致。所以SII EEPROM的写入工具、写入流程、校验方式要在项目初期就定下来最好用原厂提供的上位机工具生成二进制文件再烧录不要人工手改。EEPROM烧录完成后上电先别急着接主站用主站软件的扫描功能或EtherCAT诊断工具读一遍所有从站信息确认Vendor ID、Product Code能和实际设备对应上再继续后面的调试。3.2 上电后固件的标准初始化顺序从站MCU上电后的初始化顺序我总结成下面几条顺序很重要。复位ESC等待复位完成读取ESC的DL Control等寄存器确认硬件就绪。检查SII EEPROM是否加载完成必要时主动读取或校验关键字段。初始化MCU自己的SPI/并行外设建立和ESC的通信链路。配置ESC中断打开需要的AL Event事件位。确保ESC处于INIT状态等主站发起状态切换。点一下第四步的问题。很多从站开发者在初始化阶段习惯把中断全部打开结果主站还没来得及配置SMAL Event寄存器就开始频繁上报各种事件MCU被中断淹没主站读状态时读到一堆垃圾数据。按需使能事件位比一股脑全开要稳得多。3.3 状态机切换的两个坑EtherCAT从站状态机是INIT、PRE-OP、SAFE-OP、OP四态递进。主站请求切换状态时会往从站的AL Control寄存器写请求值从站处理完成后要把AL Status寄存器更新为当前状态。如果从站认为条件不满足比如SM配置没就绪就要求进SAFE-OPAL Status会写入一个错误码同时AL Event寄存器会置位。这里有两个坑。第一个坑是不读AL Status错误码。状态切换失败时AL Status里会带错误码比如0x0001表示未知错误0x0004表示非法状态切换请求0x001C表示FMMU配置无效等。排查时第一件事就是读出这个错误码而不是盲目怀疑主站。第二个坑是状态切换确认过慢。EtherCAT规定从站收到状态切换请求后必须在指定时间内响应如果主控MCU处理逻辑太慢或者频繁调用阻塞式延时从站就会超时。我建议状态切换响应放在中断或高优先级任务里做业务逻辑代码不要阻塞在切换路径上。4. 同步管理器SM的配置逻辑与修改时机4.1 SM到底在管什么同步管理器Sync Manager简称SM是ESC内部用来管理数据通道的机制。EtherCAT从站的数据交换不是随意的主站和从站之间通过SM划分出若干条通道每条通道有自己的起始地址、数据长度、方向、同步方式。SM的使用分两大类。一类是邮箱通信对应CoE、FoE、EoE这些应用协议特点是数据不连续、长度可变主要用于参数读写、固件升级、非实时数据交互。另一类是过程数据特点是固定长度、每个周期都要交换对应运动控制里的位置指令、状态字、模式字等实时数据。FCE1353/FCE1354内部提供多个SM通道实际用几个、怎么分配由主站加载的ESI文件决定。4.2 “从站在什么状态下可以改同步类型”——完整答案这个问题是社区里问得比较多的一个SM3同步类型要改成0x0001SM-Sync从站在什么状态下可以做答案很直接必须在非OP状态下修改最稳妥的是INIT或PRE-OP阶段。EtherCAT规范里SM配置寄存器的写入并不是任何状态下都被允许的尤其是过程数据相关的SM配置一旦进入OP状态主站和从站都在按固定的周期交换数据这时去改SM同步类型轻则导致这个周期数据收发错乱重则触发看门狗超时、从站直接掉线。实际项目里SM和FMMU的配置通常由主站在PRE-OP阶段写入写完之后主站会校验返回状态确认无误后再切到SAFE-OP。所以你在从站固件里一般不需要手动去改SM只要保证ESC寄存器映射正确、SII EEPROM里的初始值合理就行。如果是调试阶段确实要改正确流程是先把从站状态切回PRE-OP或者更低修改SM同步类型确认配置已生效再重新走PRE-OP→SAFE-OP→OP。不少人在这里抱着侥幸心理觉得“我改了之后再切回OP也许没事”实测大概率会出问题。我在现场遇到过两次都是因为从站固件的在线调试工具允许在OP状态直接写SM配置结果设备看似正常但过几分钟就报同步错误把锅甩给主站最后定位到是OP下改SM导致的。这个习惯一定要改。4.3 实际配置示例假设我们要把SM3配置为过程数据输出方向并且设置同步类型为SM-Sync对应的ESC寄存器写入顺序类似于下面这段伪代码寄存器地址基于通用ESC寄存器布局// 以SM3为例基地址为0x0800 3 * 8 0x0818 // 寄存器偏移参考ET1100/LAN9252类似的ESC布局 esc_write(0x0818, 0x1000); // SM3起始地址过程数据输出缓冲 esc_write(0x081A, 0x0040); // SM3长度64字节 esc_write(0x081B, 0x26); // SM3控制寄存器使能方向/中断 esc_write(0x081C, 0x0001); // SM3同步类型0x0001 SM-Sync esc_write(0x081D, 0x0000); // SM3状态寄存器清0这段写法的重点是先配置起始地址和长度最后写同步类型同步类型写入后SM的状态才会刷新。实际寄存器位定义以FCE1353/FCE1354手册为准但思路是通用的。改完SM后记得读一遍SM状态寄存器确认进入预期状态。5. 一次真实的编译错误复盘PIC32从站工程中struct字段访问失败5.1 报错现场还原有段时间接手了一个基于PIC32的从站项目工程里引用了第三方的EtherCAT从站协议栈编译时报了这么一条错误pic32 ethercat slave.c(197): error: #136: struct unnamed has no field xxx第一次看到这个错误大多数人第一反应是字段拼写错了。我对照源代码来回看了好几遍字段名完全一致头文件也包含了但编译器就是报“找不到这个字段”。这个报错格式很有迷惑性它提示的是一个匿名结构体说明编译器在那一行解析到的struct类型根本不是你以为的那个结构体。5.2 排查链路我当时按下面的顺序排的没走弯路。确认报错行附近的代码看看最近有没有改动过结构体定义。打开完整的预处理输出查看197行展开后到底引用了哪种类型。检查结构体定义所在的头文件是否被某个宏开关包住。结果问题就出在这里协议栈为了兼容不同MCU平台用宏控制了结构体的一个匿名联合体成员在PIC32平台下这个宏默认关闭导致那个字段不存在于编译可见的类型里。找到对应宏开关在编译选项里定义宏重新编译错误消失。注意看第三步这类问题的根源很少是“编译器坏了”而是“编译器看到的代码和你以为的代码不一样”。Keil的#136错误在从站工程里出现频率不低基本都跟结构体成员可见性有关比如头文件包含顺序不对、宏开关控制、字节对齐指令把结构体重新定义了。5.3 给所有从站开发者的排查清单借这个例子我把从站工程里遇到struct类编译错误的排查清单整理如下。优先看预处理输出确认类型真实定义。检查结构体定义所在头文件是否被条件编译块包裹。确认是用了#pragma pack之类的对齐指令防止编译器重新解释结构体布局。检查多个头文件是否定义了同名结构体优先级存在冲突。最后才是检查字段拼写和大小写。从站工程跨平台移植时这类问题尤其多。FCE1353/FCE1354的协议栈如果同时适配STM32、PIC32、国产ARM建议把寄存器操作封装成独立模块MCU相关的宏定义集中到一个头文件里不要散落到各处否则换个平台编译就是一场灾难。6. 主站侧的配合工作从免费开源到商用CODESYS6.1 免费主站方案横评从站控制器再强也得有主站配合才能转起来。主站侧方案大概分三类免费开源、基础商用、高端商用。我列个表给你参考。主站方案价格实时性适用场景IgH (EtherCAT Master)免费依赖Linux RT补丁抖动可达几十微秒级自研控制器、实验平台SOEM免费依赖Windows/Linux用户态调度抖动较大学习验证、原型开发CODESYS Control RTE SL商业授权但可申请试用良好支持RT调度软PLC项目、中小型设备TwinCAT商业授权优秀大型自动化项目如果你的目标是快速验证FCE1353/FCE1354从站是否正常SOEM是最快上手的编译简单、文档也好找。如果要做正式项目预算有限又熟悉LinuxIgH是社区用得最多的选择。想省事一点CODESYS的RTE版本可以直接在普通PC上跑软PLC配EtherCAT主站组件图形化配置对调试阶段非常友好。6.2 Linux实时内核与网卡的组合Linux下用IgH跑EtherCAT主站一个经典组合是RT-Preempt补丁的实时内核加Intel网卡。6.6稳定分支的版本比如6.6.119对igc网卡驱动支持完善I210/I211这类Intel千兆网卡在EtherCAT主站场景里很常见因为IgH对Intel网卡的专用驱动支持最好帧时间戳精度比通用驱动更高。编译步骤大致如下下载6.6.119内核源码打上对应版本的RT-Preempt补丁。内核配置里启用igc驱动关闭无关的网络协议栈功能。编译并安装实时内核重启进入。下载IgH主站源码编译安装到系统。用ethercat命令工具绑定指定网卡启动主站。用ethercat slaves命令扫描总线确认从站连接正常。用IgH调试时我最常用的两个命令是ethercat slaves -v查看从站详细信息和ethercat states查看从站状态。6.3 CODESYS里配置EtherCAT主站如果你走CODESYS路线配置流程大概是安装CODESYS Control RTE SL和EtherCAT主站组件→打开设备工程→添加EtherCAT主站设备→扫描网络→导入从站ESI文件→配置过程数据变量→下载运行。这里最容易卡住的环节是扫描不到从站。原因90%出在SII EEPROM写入的Vendor ID和Product Code跟ESI文件里的不一致。FCE1353/FCE1354的ESI文件在联调前就要确保和芯片实际配置匹配尤其是PDO映射和SM配置否则即使扫描到了过程数据也可能全是0。CODESYS里强烈建议开启实时任务并把EtherCAT主站的任务周期设置为和从站DC周期一致。任务周期不匹配是“SYNC丢失”警告的常见来源。7. 运动控制场景下的实际调参脉冲当量、同步周期与CiA4027.1 脉冲当量的计算方法FCE1353/FCE1354大量用在步进和伺服驱动器上。这类从站本身不直接算运动轨迹但主控MCU侧必须把“用户期望的位置”换算成“电机转动的步数”。换算的基础就是脉冲当量。以步进电机为例两相步进电机基本步距角是1.8度对应200脉冲每转。如果驱动器做了16细分那么电机转一圈需要200×163200个脉冲。如果电机通过一个5:1的减速机带动输出轴那么输出轴转一圈需要3200×516000个脉冲。这里的脉冲当量就是1/16000圈也就是每个脉冲对应的输出轴角位移为0.0225度。电机每转脉冲数 200 × 细分倍数 输出轴每转脉冲数 电机每转脉冲数 × 减速比 脉冲当量 1 / 输出轴每转脉冲数换算到直线运动还要再除以丝杆导程。举个例子导程为10mm的丝杆加上16细分、5:1减速那么输出轴转一圈走10mm对应的脉冲当量是16000个脉冲/10mm也就是1600脉冲/mm1个脉冲对应的位移是0.000625mm。把这些数写进上位机参数和对象字典时一定要两边统一否则就会出现“指令走了100mm实际只走90mm”这种经典的比例偏差。7.2 125μs同步周期下的DC与SM事件处理运动控制项目里125μs或250μs的同步周期越来越常见。这个周期下每个周期主站都会发一帧过程数据从站在DC同步事件触发时把最新数据锁存、把输出数据更新到端口。从站主控MCU能用来处理数据的时间窗口非常窄。FCE1353/FCE1354的SYNC中断通常在DC事件到达时产生MCU的中断服务程序里要做的事尽量精简读入过程数据、更新输出、必要时置一个标志位让后台任务做重量级运算。如果在中断里做浮点运算、大数组拷贝很容易超过周期预算导致下一帧数据还没准备好看门狗就会超时。实测时用示波器抓SYNC引脚正常情况下脉冲间隔抖动应该在微秒级以内。如果抖动明显偏大先查晶振精度和DC补偿是否开启再查MCU侧是否有其他高优先级中断在抢时间。7.3 稳定性的三个长期指标设备连上、能跑起来只是第一步。真正体现FCE1353/FCE1354方案可靠性的是长期运行后的稳定性。我建议量产前至少关注下面三个指标。第一个是丢帧和错误帧计数。ESC内部有很多统计寄存器比如CRC错误计数、物理层错误计数。如果这些数字在增长说明网络物理层或电磁环境有问题要从变压器、PCB布局、接地上去查而不是怪芯片。第二个是看门狗超时次数。过程数据看门狗超时后从站应按照安全设计做出动作保持最后的输出、清零输出还是切换到安全状态。这个策略要明确写进固件里不能指望主站介入。第三个是断线重连行为。工业现场插拔网线不可避免链路恢复后从站是自动重新进入OP还是停在SAFE-OP等待主站确认需要在设计阶段就想清楚。自动恢复省事但自动化程度高要求主站侧也支持自动重启手动恢复安全但需要专人到现场处理。在我个人看来FCE1353和FCE1354这类国产从站控制器已经在很多场景下做到了和进口芯片同等的通信稳定度。调试时遇到的大部分“掉线”“同步丢失”真正原因都出在周边电路、EEPROM配置、主从站状态机协同这些基本功上。把基本功打扎实比纠结选哪颗芯片更重要。
返回列表