ARTICLE DETAIL

资讯详情

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

AX58100 EtherCAT从站XML配置与PDO映射避坑指南

AX58100 EtherCAT从站XML配置与PDO映射避坑指南 接到一个用AX58100做EtherCAT从站的项目时我本来信心满满毕竟硬件参考设计都是现成的固件也按SDK移植好了。结果卡在了一个谁都没想到的地方TwinCAT怎么都扫不出设备就算手动加载XML文件进OP状态时也总是报错偶尔能跑起来PDO映射的数据又对不上。后来把问题一个个剥开看几乎所有坑都集中在AX58100的从站XML文件ESI文件和PDO映射上。这篇文章就把我从零配置AX58100从站XML的完整过程以及踩过的PDO大坑整理出来给后面做EtherCAT从站的朋友当个参考。1. 没有XML文件AX58100在EtherCAT网里就是个“透明人”1.1 AX58100在从站里的分工直接决定XML怎么写AX58100是亚信电子ASIX推出的EtherCAT从站控制器ESC内部集成了两个以太网PHY和完整的EtherCAT从站协议处理逻辑。注意它只是一颗ESC芯片不是类似MCU那样跑应用代码的主控所以实际项目中都需要外部再挂一颗MCU通常用SPI接口或8/16位并行接口和AX58100通信由MCU负责应用层逻辑比如读取传感器、控制电机、处理对象字典等。这颗芯片能帮你做的事很多EtherCAT数据帧的转发、CRC校验、同步管理器SM、FMMU、分布式时钟DC等底层操作都由AX58100里的硬件逻辑完成不占用MCU资源。MCU要做的是通过PDIProcess Data Interface接口把过程数据读出来或者写进去。而这个过程中主站比如倍福TwinCAT、Codesys或者IgH开源主站是不知道你的从站设备里到底有哪些数据的。它唯一的信息来源就是你提供的那份XML文件。这也是为什么说没有XML文件AX58100在EtherCAT网络里就是个“透明人”——它能收到数据帧硬件层面也能正常应答但主站层面无法识别你的设备类型、不支持任何SDO对象、不知道你的过程数据是什么结构自然也就没法配置PDO映射后续OP状态就更别谈了。1.2 XML是“身份证”SII EEPROM是“户口底档”很多第一次做EtherCAT从站的工程师会搞混一个概念以为把XML文件做好了、发给客户从站就一定能被识别。实际不是的。EtherCAT从站的工作机密分两部分一个是XML文件也叫ESI文件EtherCAT Slave Information是给人工程师和主站组态软件看的里面描述了从站的厂商ID、产品代码、对象字典、PDO定义、SM配置等。另一个是挂在AX58100上的那颗EEPROMSII里面存放的是ESC寄存器初始化信息、厂商ID、产品代码以及部分默认的PDO配置和SM配置。主站扫描时可以直接通过ESC的SII接口读取EEPROM内容识别出从站的基本身份。这两部分如果不一致就会出现怪事。比如你的XML里写了厂商ID是0x1234但EEPROM里面写的厂商ID是0x5678那么TwinCAT加载XML后扫描到的从站实际ID对不上可能出现设备显示问号或者识别成未知设备。所以正确的做法是先通过AX58100的SII访问工具一般SDK里会带或者用TwinCAT的ESC工具把EEPROM里的厂商ID、产品代码、修订号等写正确再让XML文件和EEPROM保持同步。PDO映射也一样AX58100在启动时会从EEPROM读取默认的PDO配置写入到过程数据RAM区而XML中的PDO定义用于主站后续覆盖配置。两者不一致时主站会优先按自己的逻辑配置但如果从站不从就可能导致配置失败。1.3 PDO映射为啥是重灾区PDO映射通俗讲就是“主站如何把要发送的数据塞到从站的内存地址里以及如何从从站内存里取出要接收的数据”。它牵扯到三层PDO分配对象比如0x1600、0x1A00、PDO映射条目比如某个对象字0x6040子索引00、以及实际对象字典中的索引和子索引。任何一层不小心写错主站解析出来的过程数据就会错位甚至直接拒绝配置。更坑的是PDO映射错误不像语法错误那样有明确的报错提示。很多情况下主站报了一个莫名其妙的“Frm FMMU0 length error”或者“Slot overflow”最后查出来只是因为映射条目里的BitLen写错了。所以这篇文章后面会花大篇幅专门说PDO映射的问题。2. 动手配置XML之前先把这些协议细节琢磨透2.1 AX58100的接口方式决定了你的XML怎么写在开始写XML之前先明确你的AX58100是怎么和MCU连接的。AX58100支持SPI Slave模式、8位并行模式、16位并行模式以及异步总线模式。这直接影响你如何在XML中声明过程数据接口PDI相关参数吗严格来说XML文件里并不会直接写“SPI”或“并行”但它会影响你整个从站的同步性能以及过程数据的更新方式。举个例子SPI模式时MCU通过中断AX58100的IRQ引脚来感知新数据到来然后通过SPI读取某段同步管理器的数据。这种情况下你的固件代码处理周期通常为几百微秒到毫秒级。而并行接口模式数据吞吐更大响应更及时适合对同步性能要求高的运动控制从站。XML中SM的同步模式SM Event、DC Event等需要和这个实际处理机制匹配否则主站配置的周期与从站实际刷新不对齐会出现数据抖动甚至看门狗超时。另外AX58100的EEPROM通过SII接口连接一般用Microchip的93LC66B之类的1024字节EEPROM。在XML中虽然没有直接的EEPROM字段但主站会通过SII读取到一些默认配置比如频率、扩展标志等。所以务必在写XML前把AX58100的EEPROM读写测试通过否则后面验证PDO时看不到效果你会以为代码有问题其实只是EEPROM里没有初始化数据。2.2 同步管理器SM、FMMU、邮箱、过程数据XML里每一段都在给主站交代EtherCAT的核心是同步管理器SyncManager。主站通过SM来管理邮箱Mailbox和过程数据Process Data的内存区域。在从站侧AX58100内部有多个SM通道典型通道分配如下SM通道方向用途SM0Write主站到从站Mailbox 写SM1Read从站到主站Mailbox 读SM2Write主站到从站过程数据输出对应从站RxPDOSM3Read从站到主站过程数据输入对应从站TxPDO在XML文件中你需要明确声明这些SM的存在、类型、方向以及默认大小。主站加载XML后就是根据这些描述去配置AX58100的SM寄存器。如果XML里SM2声明为Read而实际固件中AX58100的SM2被初始化为Write主站在配置时就会出现错误甚至无法切换到OP。FMMUFieldbus Memory Management Unit同样重要。它的作用是把逻辑地址映射到物理地址主站使用FMMU来将PDO数据映射到过程数据RAM的对应位置。你的XML里通常不会直接定义FMMU参数因为那是主站根据PDO映射自动生成的。但前提是PDO映射正确否则主站生成的FMMU配置就会指向错误的位置。邮箱通信也一样。如果你的从站需要SDO访问、紧急报错、参数上传下载就必须在XML中声明Mailbox为CoE类型并且把SM0/SM1的邮箱大小配置对。AX58100在裸机模式下如果不开邮箱很多主站工具无法读取对象字典会给你调试带来巨大麻烦。所以我一律建议无论你的应用用不用SDO都把CoE邮箱打开至少方便调试。2.3 从站状态机与PDO映射的生效时机EtherCAT从站有四种主状态INIT初始化、PRE-OP预运行、SAFE-OP安全运行、OP运行。状态切换需要逐级进行并且每一步都可能失败。PDO映射的作用时机要清楚在INIT阶段主站会配置邮箱和SM随后进入PRE-OP通过CoE SDO来对从站对象字典进行配置其中就包括PDO映射对象0x1600、0x1A00等以及PDO分配对象0x1C12、0x1C13配置完成后主站会设置SM2/SM3的通道方向、缓存模式和触发方式进入SAFE-OP最后在OP状态启动周期数据交换。如果你在XML中定义的PDO映射与实际固件初始化的对象字典不一致那么进入PRE-OP时主站写入0x1600等对象的数值可能被从站拒绝或者写入成功但对应映射的子索引无效。更麻烦的是有的从站固件实现了“重新映射后需要重启SM才能生效”的逻辑如果你没有响应主站的映射写入那即使XML正确也进不了OP。所以写XML之前先确认你的AX58100从站固件是否支持CoE参数在线配置如果不支持那你的XML必须和EEPROM中的默认PDO完全一致主站才能顺利配置。3. 手把手写出一个能用的AX58100从站XML3.1 原厂模板去哪找以及需要哪些准备工作最省事的办法是用原厂提供的SDK里的示例XML作为基础。AX58100官方SDK中会附带一个从站工程里面已经包含了基本的ESI模板你可以直接用记事本打开或者用XML工具进行编辑。如果没有也可以用倍福官网提供的某个标准从站XML作为起点或者找一份比较通用的EtherCAT XML模板来改。准备工作方面你需要一台装有TwinCAT或者Codesys的开发电脑用于后期验证。AX58100的从站板卡最好是自带EEPROM芯片的参考设计。能读写AX58100 EEPROM的工具比如TwinCAT中自带的ESC调试工具或者ASIX提供的EEPROM编程工具。文本编辑器推荐带有XML语法高亮的比如VS Code或Notepad用于避免低级符号错误。还有一个容易忽略的准备确认你的AX58100硬件上那颗EEPROM已经焊好而且SCL/SDA上拉电阻正确。如果EEPROM没焊好主站可能能识别到从站但无法读取到有效配置最终无法进入OP。3.2 XML骨架头部、厂商信息和设备声明完整的EtherCAT XML是一个巨大的树形结构。但核心骨架并不复杂一个最小可用文件如下?xml version1.0 encodingUTF-8? EtherCATInfo Version1.2 Vendor Id0x000009C9/Id NameASIX/Name /Vendor Descriptions Devices Device TypeInfo TypeAX58100 Motor Driver/Type NameAX58100 Demo/Name /TypeInfo GroupTypeMotion/GroupType NameAX58100 Demo Device/Name Rev1/Rev ProductCode0x00000100/ProductCode RxPdo.../RxPdo TxPdo.../TxPdo Mailbox CoE SdoInfotrue/SdoInfo /CoE /Mailbox CoEDetails CompleteAccessfalse/CompleteAccess /CoEDetails Profile Dictionary ... /Dictionary ProcessData ... /ProcessData /Profile /Device /Devices /Descriptions /EtherCATInfo注意 的 要和你EEPROM里烧录的厂商ID一致。ASIX的厂商EtherCAT ID是0x000009C9如果你用的是其它厂商的AX58100模块可能需要改成模块厂商提供的ID。 是设备产品代码也是全局唯一的主站会用它来区分同一厂商下的不同设备。里的 是设备类型名主站会显示这个名称。 对主站来说更多只是分类参考不影响实际通信。最关键的是 和 这里声明了从站支持CoE邮箱协议。如果你的从站不需要SDO那可以省略但后面调试会很痛苦所以强烈建议保留。3.3 通信参数邮箱、SM、FMMU定义在XML中通信参数主要放在 标签下但不同版本的XML位置略有差异。ESCAT XML标准中SM和FMMU通常在 下面的 标签内。一个典型定义如下Communication SyncManager Sm Index0/Index NameMailbox Write/Name TypeMailbox/Type DirectionWrite/Direction DefaultSize128/DefaultSize /Sm Sm Index1/Index NameMailbox Read/Name TypeMailbox/Type DirectionRead/Direction DefaultSize128/DefaultSize /Sm Sm Index2/Index NameOutputs/Name TypeProcessData/Type DirectionWrite/Direction DefaultSize32/DefaultSize /Sm Sm Index3/Index NameInputs/Name TypeProcessData/Type DirectionRead/Direction DefaultSize32/DefaultSize /Sm /SyncManager FmmuConfig Sm2/Sm Sm3/Sm /FmmuConfig /Communication这里最需要注意的是 中的“Write”和“Read”是站在主站角度看还是从站角度看在EtherCAT XML标准中Direction是指主站写入从站Write还是主站从从站读出Read。SM0和SM2是主站写入所以是WriteSM1和SM3是主站读取所以是Read。这和很多工程师的直觉刚好相反。我见过好几个项目把SM2和SM3的方向写反结果主站配置SM时直接报错。是默认字节数必须和你的实际过程数据长度对应不能随意写。如果数据超过SM缓冲区大小主站配置时就会报“SM size too small”。如果写大于实际也有可能导致主站以该大小初始化SM区域后续在FMMU映射时产生多余字节影响主站逻辑框图的展示但一般不会导致致命错误不过为了严谨还是尽量准确。3.4 对象字典与PDO定义这是整个文件的核心对象字典是CoE的核心如果你需要主站通过SDO读写参数就得在XML里把对象定义出来。在这里我以一个简单的速度控制从站为例定义两个对象控制字0x6040和状态字0x6041以及一个目标速度0x6060和一个实际位置0x6064。一个最简对象定义如下Profile Dictionary DataTypes DataType NameUNSIGNED16/Name BitSize16/BitSize /DataType /DataTypes Objects Object Index0x6040/Index NameControlword/Name TypeUNSIGNED16/Type BitSize16/BitSize Flags AccessRead Write/Access /Flags SubIndex SubIndex Index00/Index NameControlword/Name TypeUNSIGNED16/Type BitSize16/BitSize /SubIndex /SubIndex /Object !-- 其他对象类似 -- /Objects /Dictionary ProcessData RxPdo Index0x1600/Index NameRxPDO1/Name Entry Index0x6040/Index SubIndex0x00/SubIndex BitLen16/BitLen /Entry Entry Index0x6060/Index SubIndex0x00/SubIndex BitLen16/BitLen /Entry /RxPdo TxPdo Index0x1A00/Index NameTxPDO1/Name Entry Index0x6041/Index SubIndex0x00/SubIndex BitLen16/BitLen /Entry Entry Index0x6064/Index SubIndex0x00/SubIndex BitLen32/BitLen /Entry /TxPdo /ProcessData /Profile注意PDO映射中的 默认写0x00表示映射对象本身。这在大多数情况下是正确的但如果你要映射的是对象内部某个子索引例如0x2000下面有多个数组元素那么这里的 要对应对象的子索引并且 必须与该子索引定义的位长度完全一致。一旦不一致主站解析PDO时就会出现长度错误。还有一点很多从站的PDO映射对象0x1600/0x1A00还需要在对象字典中明确声明为VAR或RECORD类型并在ProcessData中引用。如果你的XML没有把0x1600定义在对象字典中TwinCAT在读写PDO赋值时也会出现奇怪的问题。所以一个稳妥的做法是把 中使用的每一个PDO对象0x1600、0x1A00同时在对象字典中定义出来。4. PDO映射避坑指南——我的排查链路与典型错误4.1 三个看似无关其实同源的PDO错误在实际调试中PDO映射错误的表现千奇百怪但总结起来主要有三类一是主站在SAFE-OP切换时卡住报“Check SM2 mapping”或“FMMU”相关错误二是OP能进去但DXM输入/输出数据全部为零或乱码三是TwinCAT报“0x1A00 TypeError: Index not found”。这三种问题大部分根子都在XML里的PDO映射定义上。举个例子你在XML里写了映射条目 0x6060 但你对象字典里实际对象是0x60FF那么主站在配置FMMU时找不到0x6060就会报索引不存在。有时候主站不会直接说“找不到0x6060”而是模棱两可报一个地址错误这个排查起来很费劲。另外一类常见的同源错误是映射条目的 和对象类型不一致。比如你把一个32位的位置值如0x6064在映射里写成16位主站不会认为这是错误它会真的只映射16位数据量这样从站收到的数据被截断位置值永远是低16位看起来就是数据不对。这类错误靠主站表面现象很难定位必须回到XML里逐条比对。4.2 一次完整排查从“OP进不去”到“映射字段反了”我一次调试AX58100时遇到了一个诡异的现象把从站接入TwinCAT扫描正常XML加载正常SM配置也正常但一切换到SAFE-OP就从站报错。TwinCAT给出的提示是“Init PreOp CoE failed: SDO Info SDO Access Error”。刚开始我以为是邮箱通信没配置好来回检查SM0和SM1的收发方向、邮箱大小都没有问题。后来打开主站的Device Manager日志发现它尝试写0x1600对象时从站回复Abort Code 0x06090030意思是“对象字典不存在”。查了一圈终于发现我在XML的 中定义了 但对象字典里没有把0x1600这个索引定义为对象。也就是说PDO分配对象本身在从站固件和对象字典中是不存在的主站自然写不进去。补齐0x1600和0x1A00的对象定义后SAFE-OP能进了。由此我总结出一个经验PDO映射的定义要在三个位置保持一致缺一不可——对象字典 或 、以及从站固件里实际实现的对象字典。如果你用的是现成的EtherCAT从站协议栈那么固件里往往已经定义了标准PDO对象你需要让XML和固件对齐而不是只改XML。4.3 SM方向、缓存模式、同步模式配置不对同样让PDO失灵PDO映射不只是把数据对应起来就完事它还依赖正确SM配置。前面说过SM的方向容易搞反这里再说一个不那么明显的问题SM的缓存模式Buffered和邮箱模式。在EtherCAT协议中SM可以工作在两种模式Buffered Mode缓存模式和Mailbox Mode邮箱模式。过程数据通常用Buffered Mode邮箱通常用Mailbox Mode。在XML的 配置中模式不是显式写“Buffered”的而是通过 来区分Mailbox对应邮箱ProcessData对应缓存。如果你的 写成了Mailbox主站就会用邮箱协议来操作过程数据导致交换失败。另一个容易忽视的是同步模式。AX58100支持FreeRun、SM Synchron、DC Synchron三种模式。在XML的 或 里可以声明从站支持的同步模式。如果不声明主站可能默认FreeRun但你的从站固件只支持DC那就会出现在OP状态下数据不同步、抖动的现象。我一般在XML中声明支持SM2和SM3同步事件同时允许FreeRun这样在测试时比较灵活。4.4 XML与EEPROM不一致引起的“幽灵故障”还有一种最让人抓狂的故障XML文件看起来完美主站加载也正常但一运行PDO数据总是错位过一会儿还可能看门狗超时。这种故障往往不是XML的语法问题而是EEPROM里的初始配置与XML不一致。很多AX58100开发板上EEPROM里预烧录了某个示例的PDO配置比如默认映射了4个16位变量。而你新写的XML可能是8个变量。主站加载XML后试图按XML中的8个变量去配置PDO但AX58100在启动时已经从EEPROM读取了旧的SM长度和PDO映射固件里的对象字典默认值还是旧的。如果固件不响应主站的配置请求或者响应了但实际内存布局没变那么FMMU映射就错位了。解决的办法是先把EEPROM清成默认空白的SII数据或者烧录一份与你的XML匹配的初值。AX58100的SDK里一般有SII配置例程你可以在初始化时让固件忽略EEPROM中的PDO设置全部采用代码中定义的对象字典。我在实际项目中就吃过这个亏当时一度以为AX58100坏了后来通过SII工具读出EEPROM比对才发现里面根本是另一个项目的配置。5. 用TwinCAT实测XML和PDO映射5.1 加载XML、扫描从站注意看哪些字段在TwinCAT中如果你的XML文件放在指定目录那么扫描在线设备时主站会通过EEPROM识别设备并自动匹配到下位机上的XML。如果匹配不上你需要手动“Edit Device”加载XML。加载后重点看设备名称、ProductCode、Revision是否和你的实际硬件一致。TwinCAT的树形结构中每个从站下面会显示“Process Data”、“State”、“CoE Online”等节点。先看Process Data展开后会列出所有RxPDO和TxPDO以及每个PDO下的映射条目。这一步可以快速确认主站是否成功解析了你的PDO定义。如果看到映射条目中的变量名不对或者数量不对那大概率是XML加载错误或缓存了旧的XML。此时可以清一下TwinCAT的IO设备配置重新扫描。5.2 在Process Data窗口核对映射与寄存器数据在TwinCAT的IO设备界面的“Process Data”选项卡里主站会为每个PDO生成一个“输出”或“输入”的变量列表。你可以通过“Online”模式实时观察这些变量值。我一般会把AX58100的固件做一个简单循环把RxPDO中收到的第一个字目标速度写到TxPDO的第一个字实际速度这样只要主站往目标速度写一个值实际速度立刻变相同值就能判断双向PDO链路是否打通。还可以在状态切换到OP后直接在TwinCAT里看从站状态显示为“OP”再看SM的CRC、计数器是否增长。如果CRC在跳变、或状态不停切换说明数据帧不正常这时候要检查SM方向和FMMU映射。5.3 实测中高频报错的处理对照表我在实测中积累了一些高频报错的解决经验整理成表格方便排查现象可能的根因检查方法加载XML后设备名称为问号厂商ID/ProductCode不匹配检查XML和EEPROM中的ID进入SAFE-OP失败报SDO错误对象字典缺失PDO分配对象检查0x1600/0x1A00在Dictionary中定义进入OP失败报FMMU错误PDO映射BitLen与对象类型不符核对映射条目BitLen数据全为0从站固件没有正确更新过程数据RAM检查SPI中断处理、SM方向数据错位映射顺序/长度有误或EEPROM旧配置干扰清空EEPROM重新烧写频繁看门狗SM同步模式不匹配在XML中声明合适的同步模式如果你的AX58100从站使用IgH开源主站调试还可以在终端中通过ethercat pdos命令查看当前PDO映射是否已经加载以及通过ethercat debug查看FMMU分配情况。原理和TwinCAT一致但命令行的提示往往更直接能加速定位问题。6. 最后分享几点经验调EtherCAT从站说穿了就是“趁早验证”和“两边对齐”。我个人的实操习惯是每次改完XML先做两件事——第一用XML校验工具过一遍格式避免低级错误第二TwinCAT重新扫描后先不着急进OP先在CoE Online里读一下0x1600、0x1A00这些映射对象内容确认主站写入的值和你XML里定义的一致。只要这一步对上了后面90%的问题都不会出现。另外强烈建议在AX58100的固件中增加一个调试用的邮箱对象比如0x2000然后把这个对象也映射到一个PDO里。这样在验证PDO时你可以通过主站直接写入一个调试值再从从站读回来能快速判断是哪一层出了问题。遇到疑难杂症时直接的寄存器级比对远比看现象猜问题高效。最后要说的是AX58100的XML文件虽然不是代码但对EtherCAT从站而言它和固件同等重要。别在EEPROM和XML一致性问题省时间这一项没做好后面调试花的精力会成倍增加。希望这篇文章能让你少走一些弯路。
返回列表