多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

基于AX58100的EtherCAT从站设备仿真设计与实操

基于AX58100的EtherCAT从站设备仿真设计与实操 做EtherCAT从站设备开发最烦的不是写从站代码而是每次联调都要等硬件、等固件、等队友。我相信不少团队都经历过这种场景主站工程师已经抱着TwinCAT或者IgH环境在等了说我的主站侧完全没问题你们从站什么时候能上这时候你手里可能连一块像样的从站样板都没有更尴尬的是即便从站板子能跑应用层逻辑还没写完也没法验证主站周期通信是不是对的。我在伺服驱动项目里就吃过这个亏后来专门花时间把AX58100的从站设备仿真功能吃透了用一块AX58100板卡在主站面前“扮演”一个真实从站设备通信链路、XML描述、PDO映射、DC同步全部提前验完。这套方法无论对主站侧调试还是从站侧协议栈开发都特别实用。这篇文章就把我从原理到实操的完整设计流程整理出来希望能帮到正在做EtherCAT从站或者主站联调的兄弟。1. EtherCAT主从通信机制不搞懂这几个底层原理后面全白搭1.1 报文如何穿过所有从站用“快递分拣”看懂EtherCATEtherCAT从站设备仿真功能能不能设计好前提是你对EtherCAT通信机制有足够清楚的认识。这个协议最大的特点就是它在数据链路层非常“硬核”——主站发出的报文本质是一个标准以太网帧但帧里能塞进多个子报文每个子报文对应不同的从站地址和操作指令。整个过程很像一条快递分拣线上的工人接力传送带以太网帧上放着装满包裹的箱子子报文每个从站就是流水线上的一个工人。箱子到达你面前时你只拿走写着自己编号的那部分把自己要写的回执也塞进去然后把箱子原封不动地推给下一个工位。这个“拿走和塞入”的动作在EtherCAT从站控制器里是在硬件层面完成的所以单个从站的处理延迟只有几百纳秒级别一个百个从站的网络整帧响应时间也就几十微秒。这也是EtherCAT敢叫板其他工业以太网的根本原因——它没有让数据经过协议栈软件走一遍而是让数据在报文经过时“顺路”被读写。从主站角度看它往网络上发一帧这一帧从第一个从站开始依次穿过所有从站最后由最后一个从站返回主站。主站只需要维护这一份帧的收发就能同时控制所有从站。这意味着从站仿真功能设计的核心就是让AX58100这颗从站控制器在收到报文、处理子报文、写入响应数据的过程中表现得跟一个真实设备完全一致。1.2 从站控制器内部的三块基石DPRAM、FMMU与SyncManager如果说报文是外部世界看到的样子那从站控制器ESCEtherCAT Slave Controller内部就是另外一个微型世界。以AX58100为例它内部有一块双端口RAMDPRAM这是主站和从站本地MCU交换数据的“中转仓库”。主站通过EtherCAT帧直接读写这块DPRAM的某些区域从站MCU则通过SPI等接口访问同一块DPRAM两边各写各的靠硬件仲裁保证不出错。光有DPRAM还不够主站怎么知道该往DPRAM的哪个地址读写这就轮到FMMUFieldbus Memory Management Unit现场总线存储管理单元出场了。FMMU负责把EtherCAT报文里的逻辑地址映射到DPRAM里的物理地址。你可以把它理解成一个“快递分拣清单”报文里写的逻辑地址是“张三收”FMMU比对之后发现“张三”对应的物理位置是DPRAM偏移0x1000于是数据就被精确投递到这个位置。还有一个关键角色是SyncManager同步管理器它负责管理DPRAM中每个存储区的工作模式控制什么条件下数据能被外部访问、什么条件下能被主站访问。简单来说SyncManager既做了数据方向的交通管制又负责生成中断或事件信号通知从站MCU“有数据来了”。一个典型从站至少需要两组SM通道一组跑邮箱通信Mailbox对应CoE等应用层协议一组跑过程数据Process Data周期性的实时IO数据。这三块机制配合起来主站才能做到“看不见从站MCU的存在”它认为自己就是在直接读写一个外部设备的内存。这个特性恰恰是从站设备仿真功能最该利用的地方。1.3 从站设备仿真功能的本质把“假设备”演到主站看不出破绽很多刚接触EtherCAT的同学会问从站设备仿真到底是在仿什么是把EtherCAT协议报文仿真一遍吗其实不是。EtherCAT协议栈本身是固化的只要AX58100上电、EEPROM配置正确它就能响应主站的扫描和读写这部分根本不需要“仿真”。真正需要“设计”的是设备行为。一个伺服驱动器从站除了周期性接收目标位置、速度指令还要在对象字典里维护状态字、实际位置、报警信息等一堆数据。一个IO模块从站则要实时更新数字量输入输出状态。主站侧则会根据从站的XML设备描述文件去读取、配置这些对象并且在OP运行模式下周期性地交换过程数据。所以从站设备仿真功能要做的就是让AX58100背后的控制逻辑MCU固件或独立模式下的IO映射把“设备行为”演出来收到主站的PDO指令后该如何更新状态周期的输入数据从哪里来要不要模拟故障报警这些都是你在设计仿真功能时需要仔细定义的内容。仿真做得好的话主站完全无感知它以为自己在控制一台几千万的伺服驱动器实际上另一边只是一块运行着仿真逻辑的AX58100板卡。这种“黑盒替换”的思路让我在项目早期就能把主站侧的逻辑跑通把ECAT通信链路的坑全部排干净等真实的驱动器固件写完再联调时基本一次过。2. AX58100从站仿真功能的设计思路与硬件方案2.1 AX58100为什么适合做从站仿真自带PHY、双模式、SSC生态先说说我为什么选AX58100来做从站设备仿真而不是其他方案。AX58100这颗芯片最省心的地方在于它内部直接集成了两个百兆以太网PHYEtherCAT网络的两个RJ45口IN和OUT只需要外接网络变压器就能工作不用再额外搭配PHY芯片。相比早年用FPGA自己抠EtherCAT从站协议或者用LAN9252外接PHY的方案AX58100的硬件设计门槛低了不少。它还有一个非常实用的特性支持SPI模式与独立模式两种工作方式。SPI模式下外部MCU通过SPI接口访问AX58100内部的DPRAM和寄存器适合做更复杂、更可控的仿真设备独立模式下AX58100无需外部MCU可以直接把过程数据映射到自身的IO引脚上对于单纯的数字量IO从站仿真来说连固件都不用写就能跑。我这次做的仿真环境用的就是SPI模式加外部STM32 MCU因为灵活度高能模拟的对象更多。AX58100本身还带了8KB的DPRAM、8个FMMU通道、8个SyncManager通道并且支持分布式时钟DC。这些参数对于绝大多数从站仿真场景都绰绰有余。就算你想模拟带多轴同步的伺服系统DC功能也足够支撑测试。再加上亚信官方有配套的SSCSlave Stack Code从站代码生成工具只要配置好对象字典和PDO映射就能自动生成从站协议栈代码省去大量手工写Mailbox和过程数据处理的精力。2.2 从站设备仿真功能的层次拆解从需求到数据映射在动手写代码之前我习惯先把仿真功能拆成三个层次来设计这样后面编码、调试都更有条理。第一层是通信层。这一层由AX58100硬件和官方ESC驱动代码搞定包括EtherCAT状态机切换Init、Pre-Op、Safe-Op、Op、邮箱通信、过程数据通信等。仿真设计里不需要改动这层的核心逻辑但你要清楚ESC驱动里哪些函数是入口。第二层是对象字典层。每个EtherCAT从站都有一张对象字典里面定义了这个从站支持的CoE对象例如0x1000设备类型、0x1001错误寄存器、0x1018标识信息、0x1600/0x1A00这类PDO映射对象以及0x6040控制字、0x6041状态字这类应用对象。做仿真功能设计时这张对象字典表就是你给“虚拟设备”写的户口本主站会按照这个表来访问你的从站。SSC工具里可以很直观地添加自定义对象和映射。第三层是应用层行为层。这层是用来“演戏”的也是仿真的灵魂。比如你要模拟一个伺服从站应用层就要在收到0x6040控制字后更新0x6041状态字让主站看到“电机使能成功”的效果你还要周期性地更新0x6064实际位置让它按照某个设定的速度曲线“动”起来。应用层的数据既可以是纯算法生成的假数据也可以来自实际传感器甚至可以把AX58100的部分IO用作开关量输入输出模拟一个现场IO设备。三层各自独立、又通过DPRAM和PDO映射连成一条完整的数据通路。设计时先明确你要模拟什么设备再决定对象字典里放哪些对象、PDO映射到哪些地址最后把应用层行为写出来。这套流程跟我做真实从站固件开发的流程完全一致只是把设备主体换成了仿真数据而已。2.3 硬件电路设计要点AX58100最小系统怎么做从站仿真板卡的硬件设计并不复杂但有几个细节值得特别注意。我给这套仿真环境做过一版小核心板方案如下电源部分AX58100要求3.3V供电整板用一颗3.3V LDO稳压即可电流需求不算大。如果后续要驱动外部IO再单独加IO电源。时钟部分AX58100需要一颗25MHz晶振注意晶振的负载电容要按手册给的推荐值来选。我在第一版板子上就因为负载电容不匹配导致时钟起振异常排查了很久。网络接口两个RJ45口各配一颗百兆网络变压器变压器中心抽头处理要严格按参考电路来这直接影响链路稳定性和信号质量。状态指示至少留两个LED接ESC的状态输出引脚分别指示RUN状态和LINK/ACT状态。调试EtherCAT主站通信时状态灯能帮你一眼判断从站有没有真正进入Op模式作用非常大。SPI接口AX58100在SPI模式下作为从设备最高支持较高速率的SPI时钟与MCU连接时注意引脚电平匹配。我这边用的是STM32F103的SPI1时钟配置在APB外设允许范围内实测通信稳定。网络变压器的选型不需要太贵常见的HR911105A这类带变压器的RJ45座也能用。但是元器件到手后最好先测一下绕组连通性我之前遇到过杂牌变压器引脚不一致导致网口不通的情况。3. 手把手实操从零搭建一套AX58100从站仿真环境3.1 硬件准备与接线清单实际操作前先把清单列清楚AX58100从站板卡一块。可以用亚信官方的评估板也可以自己按参考电路做核心板关键是把SPI接口、两个网口和状态LED引出来。主控MCU板一块。我用的是STM32F103系列SWD下载口引出来方便烧录调试SPI1接AX58100从站接口。EtherCAT主站设备。这里我用正点原子RK3568开发板作为主站平台通过有线网卡连接AX58100板卡的IN口。网线两条。一条接主站到从站IN口另一条接从站OUT口到PC或者直接让OUT口空着只在链路末端接一个终端电阻或空置视主站配置而定。USB转串口模块备用方便打印调试日志。电源方面我给STM32和AX58100都是3.3V/5V适配分开供电或者共用一组DC-DC都没问题注意地线要共地。上电之后先用万用表确认各路电压正常再用示波器看一眼25MHz晶振波形没问题再往下走。3.2 使用SSC工具生成从站工程并完成PDO映射配置AX58100配套的SSC工具Slave Stack Code Tool是我见过最省心的从站代码生成工具之一。操作流程看着复杂其实核心就几步打开SSC工具新建工程选择目标芯片类型为AX58100。接着选择附件配置一般选“EtherCAT Slave”基础模板SSC会生成一个包含ESC驱动、Mailbox处理、PDO映射处理和状态机切换的完整工程。这个工程可以直接导入到STM32的IDE里编译。接下来是关键一步配置对象字典和PDO。我这次仿真模拟的是一个带数字量输入输出的简易IO从站。对象字典里我加了0x1600接收PDO映射包含一个16位数字量输出对象。0x1A00发送PDO映射包含一个16位数字量输入对象。0x6000数字量输出读写属性初始值0。0x6100数字量输入只读属性由应用层周期更新。在SSC里配好这些对象后重新生成代码SSC会自动在对象字典初始化和PDO映射表里生成对应的代码段。这个环节最怕的就是“漏了某个对象没过映射”主站扫描时一切正常但Op模式下就是收不到数据。所以生成代码后我建议打开esi文件EtherCAT Slave Information检查一遍PDO映射是否跟对象字典一致。3.3 Linux主站环境搭建正点原子RK3568跑IgH主站主站侧我这次用的是Linux环境下的IgH EtherCAT Master开源EtherCAT主站。正点原子RK3568开发板性能足够跑实时主站没压力。硬件上要确认EtherCAT主站使用的网卡是IgH官方支持列表里的型号这样驱动匹配会更顺利。Linux内核我选的是6.6.119版本这是6.6稳定分支的最新维护版本内核里已经包含了对EtherCAT和网卡驱动相关的支持。为了让周期通信更稳定我还打上了RT实时补丁PREEMPT_RT实测抖动比普通内核好不少。安装IgH主站时有个顺序问题需要注意要先编译安装IgH内核模块再加载到系统里。具体步骤大致是下载IgH源码、配置运行configure脚本并指定网卡驱动类型对应参数、编译安装然后通过modprobe加载ec_master模块。加载完成后用ethercat命令行工具就能看到主站状态。登录主站后执行# 查看主站是否识别到从站 ethercat slaves # 查看拓扑 ethercat graph # 查看从站信息 ethercat cstruct如果一切正常ethercat slaves会列出你仿真板卡对应的从站编号、产品码和名字。这一步看到从站出现说明EtherCAT链路已经通了接下来就可以配置PDO映射和周期参数了。3.4 联调验证让主站和仿真从站真正“跑起来”从站和主站都准备好之后真正关键的验证环节开始了。主站侧我用的是ethercat命令行和简单的C语言测试程序来模拟实际控制流程。EtherCAT从站状态机有Init、Pre-Op、Safe-Op、Op这几个状态要让从站进入Op模式并交换过程数据通常是一个逐步“提升状态”的过程主站先把从站设为Init态读取从站SII EEPROM获取设备信息。切换到Pre-Op态通过邮箱通信配置PDO映射下发同步管理器参数。切换到Safe-Op态从站开始接收过程数据帧但只做输入巡检不输出控制。最后切到Op态过程数据正常交换从站开始执行仿真逻辑。我在编写主站测试程序时用通用EtherCAT库把状态机切换封装好执行顺序类似下面这样// 伪代码主站切换到OP ec_master_request_reg(0); ecrt_master_activate(master); // 等待从站进入OP while (slave_state ! EC_SLAVE_STATE_OP) { ecrt_master_sync(master, 0); }从站这边在STM32固件里会把仿真逻辑放在周期任务中每次过程数据中断到来时从DPRAM中读取主站下发的数字量输出更新到本地的仿真变量同时把仿真变量里的数字量输入值写回发送PDO。为了让主站能直观看到“从站在动”我让仿真输入值在每次周期里按一个递增计数器的规律变化主站读到的数据就会一跳一跳地增长非常直观。实际联调时从站能稳定进入Op模式、主站能周期性读到变化的输入数据、而且SVIO信号不丢帧这套AX58100从站设备仿真环境就算完全跑通了。整个过程从硬件上电到联调完成我一个人半天内就能搞定这在以前没有仿真环境时根本不敢想。4. 实际调试中的问题与排查技巧那些文档里不写的事4.1 常见问题速查表我把这段时间用AX58100做从站设备仿真时踩过的坑整理成了一张家常表按“现象—原因—解法”的格式来写方便大家直接对照排查。现象可能原因排查与处理办法主站ethercat slaves扫描不到从站网线接错口接了OUT口从站未上电网络变压器焊反确认主站接从站IN口用万用表查供电用示波器看PHY的TX/RX波形扫描能看到从站但设备名字和描述不对SII EEPROM内容与SSC配置不一致重新烧写EEPROM用ethercat sii_read读取EEPROM内容核对从站一直卡在Pre-Op无法进Safe-Op邮箱通信异常常见是SM0/SM1配置不一致检查主站配置的邮箱SM地址与从站对象字典是否匹配打开主站调试日志Safe-Op能进但Op模式一进就掉过程数据长度或PDO映射与主站不匹配核对SM2/SM3配置确认FMMU映射逻辑地址与从站DPRAM物理地址对应正确主站周期读到数据为0或不变仿真应用层没有更新发送PDO数据在STM32固件里打断点检查中断标志确认PDO写入函数是否在周期任务中被调用SPI通信不稳定偶发数据错位SPI时钟太快、线太长、电平不匹配降低SPI时钟至AX58100文档推荐范围缩短杜邦线建议使用等长短接线或四层板这张表覆盖了从链路层到应用层的大部分问题实际遇到新问题时我建议优先打开三处信息主站侧ethercat命令的调试输出、从站MCU的串口日志、以及AX58100 RUN/LINK状态LED。这三处信息同时看基本能定位九成问题。4.2 提高仿真可信度的三个技巧如果你不只是想把从站“点亮”还想让仿真结果真正指导后续主站与真实设备的联调我建议在基础仿真之上再加三招。第一招让仿真数据“动起来”。不要让输入PDO数据一直是一个恒定值最好周期性地按一定规律变化比如正弦波、斜坡或者随机序列。这样在主站侧画趋势图时能看到平滑的波形跟真实传感器输出的感觉一样。我在伺服仿真里就让位置反馈按一个梯形加减速曲线变化主站侧的速度环调试代码就按这个假位置来预演效果非常接近真实电机运动。第二招加入故障注入机制。在仿真板卡上预留几个GPIO按钮或者串口命令用来在运行中实时修改对象字典里的报警对象、错误寄存器。主站侧的故障处理逻辑比如紧急停车、报警上报就能提前得到验证。我遇到过一次主站报警处理代码缺陷就是在仿真阶段发现的当时在真实设备上恐怕要烧一个电机才能暴露这个问题。第三招接入分布式时钟DC。打开AX58100的DC功能让主站和从站建立分布式时钟同步主站可以测量每个从站的传播延迟和时钟偏差。这个能力在单站仿真时好像用处不大但如果你未来要接多个从站做同步运动控制DC功能是必须提前验证的。仿真阶段就能把DC同步建好后面扩展真实多轴系统时会省很多事。这三个技巧做好之后你的AX58100从站仿真环境就不只是一个通信测试工具了它几乎就是一个可控的、带故障注入能力的“设备模拟训练场”主站侧所有逻辑都能在这里提前跑出结论。4.3 如果不想写MCU代码怎么办最后补充一个偷懒方案。如果你的仿真目标碰巧就是数字量IO类从站而且不想在STM32里写任何应用逻辑AX58100的独立模式可以帮你省掉MCU这个环节。在独立模式下AX58100的IO引脚直接和PDO过程数据映射主站发送的PDO输出数据会直接反映到芯片引脚上引脚电平写入发送PDO后主站也能读到。这种硬连线式的仿真方式在IO模块项目里非常好用配合SSC生成的默认IO从站固件几分钟就能让主站看到一个活的从站。唯一的限制是它只能仿真数字量IO行为没法模拟复杂的伺服运动、编码器反馈这类带算法逻辑的设备。对更复杂的需求老老实实回到SPI模式配MCU利用仿真函数库来实现设备模型随意性更大。写在最后的一点心得我现在已经把“先做从站设备仿真、再写真实设备固件”当成了项目默认流程。原因很简单EtherCAT链路本身坑很多但很多坑跟具体的设备逻辑没有关系纯属协议配置和主从配合问题。先用AX58100仿真环境把所有通信相关的坑趟平后面做真实硬件时就能把注意力集中在设备本身的控制逻辑上联调效率拉满。最后再分享一个小技巧在仿真固件里把AX58100的RUN状态灯和MCU的一个定时器绑定周期闪烁频率设为1Hz每次状态机切换后又能看到灯在加速闪烁或停止闪烁。这个小细节看起来不起眼但我在现场排查时无数次靠它判断从站有没有真的进入Op模式。调试EtherCAT这类实时工业总线状态的可视化比什么日志都来得直接。
返回列表