2. CoE对象字典架构解析
在EtherCAT的CoE(CANopen over EtherCAT)协议中,对象字典(Object Dictionary,OD)是设备通信的“数据契约”。主站要读写任何一个参数,都必须通过索引(Index)、子索引(SubIndex)定位到具体对象,再依据该对象的数据类型和访问权限决定用SDO还是PDO、以什么长度和方向访问。ETG.1000规范把对象字典定义为16位索引加8位子索引的两级寻址空间,这一结构直接决定了设备固件中参数表、过程数据映射和诊断信息的组织方式。
索引与子索引:两级寻址空间
索引是16位无符号数,范围0x0000~0xFFFF,按功能划分为若干区段。0x0000~0x0FFF为数据类型区,描述BOOL、INT16、UNSIGNED32、VISIBLE_STRING等基本类型;0x1000~0x1FFF为通信参数区,集中了设备类型、错误寄存器、同步管理参数、PDO映射与SDO参数;0x2000~0x5FFF为制造商特定参数区;0x6000~0x9FFF为标准设备子协议区,例如0x6000起为输入过程数据、0x7000起为输出过程数据;0xA000~0xFFFF为保留或厂商扩展区。子索引是8位无符号数,用于在一个索引下组织数组或记录。子索引0通常表示该索引下有效子索引的个数,子索引1~N才是实际数据项。例如0x1C12(RxPDO映射)的子索引0表示映射对象个数,子索引1~n分别指向被映射的PDO映射对象。
理解这一点的工程意义在于:当主站报出“SDO abort 0x06020000”时,通常意味着索引不存在;报出“0x06090011”则往往指向子索引不存在。定位问题时先确认索引区段,再确认子索引0的计数是否与实际访问的子索引一致,能快速缩小排查范围。
数据类型与访问权限
每个对象条目至少包含数据类型、访问权限和默认值三项属性。数据类型决定SDO传输时的字节长度和编码方式,常见的有BOOLEAN(1字节)、INTEGER8/16/32、UNSIGNED8/16/32、REAL32、VISIBLE_STRING、OCTET_STRING以及DOMAIN。DOMAIN类型没有固定长度,常用于固件升级或大块数据,SDO传输时需要分段(Segmented SDO)。访问权限用ro、rw、wo、const表示:ro只读,rw可读可写,wo只写,const为常量。权限与通信方向强相关——PDO映射的对象必须是可映射的(通常要求rw或ro且支持PDO映射),而SDO可以访问绝大多数对象,但受权限约束。
在设备固件中,对象字典通常以结构体数组实现,每个条目包含索引、子索引、数据类型、权限、指向实际变量的指针和长度。主站通过SDO读取0x1000(设备类型)可确认设备剖面,读取0x1018(身份对象)可获取厂商ID、产品代码、修订号和序列号,这些是组态前的必读项。
PDO与SDO映射机制
SDO是请求—响应式通信,适合参数配置、诊断读取等非周期性访问,每次传输都有协议开销,但可靠且可访问任意对象。PDO是过程数据对象,采用生产者—消费者模型,周期性传输,不带协议确认,适合实时性要求高的过程数据。PDO本身不直接指向应用变量,而是通过“映射”机制把若干对象条目打包进一个PDO。映射过程分两步:先配置映射对象(如0x1A00),把需要传输的对象索引、子索引和位长度写入映射条目;再把该映射对象挂到同步管理器通道(如0x1C13)上。每个映射条目为32位,格式为“索引16位 + 子索引8位 + 位长度8位”。
例如把0x6000:01(16位输入)和0x6000:02(8位输入)映射到TxPDO,映射条目分别为0x60000110和0x60000208,位长度合计24位,PDO数据区按小端序排列。主站解析时按映射顺序逐字段截取,因此映射顺序必须与从站固件中的打包顺序一致,否则会出现数据错位。
典型设备对象字典结构分析
以一个16位数字量输入从站为例,其对象字典通常包含以下关键条目:0x1000设备类型(ro,UNSIGNED32,示例值0x00020192表示数字量输入剖面);0x1008设备名称(ro,VISIBLE_STRING);0x1018身份对象(ro,含厂商ID、产品代码、修订号、序列号四个子索引);0x1C00同步管理器类型(ro,UNSIGNED8数组);0x1C12/0x1C13同步管理器PDO分配(rw,UNSIGNED16数组);0x1A00/0x1600映射对象(rw,UNSIGNED32数组);0x6000输入过程数据(ro,数组,子索引0为通道数,子索引1~n为各通道值);0x7000输出过程数据(rw,数组)。
组态时,主站先通过SDO读取0x1018确认设备身份,再写0x1C13:00=1、0x1C13:01=0x1A00使能TxPDO,然后写0x1A00:00=2、0x1A00:01=0x60000110、0x1A00:02=0x60000208完成映射。注意映射对象在PDO使能状态下通常不可写,因此顺序必须是先禁用PDO(0x1C13:00=0),再改映射,最后重新使能。若顺序颠倒,SDO会返回0x06010000或0x08000022等错误码。
工程实现中的关键约束
对象字典的访问权限和映射能力必须在固件中显式声明。一个对象即使可读写,若未标记为可映射,也不能放入PDO。位长度必须与数据类型匹配:UNSIGNED8对应8位,UNSIGNED16对应16位,UNSIGNED32对应32位,BOOLEAN通常为1位但实际映射中常按8位对齐。映射总位长不能超过同步管理器通道的PDO长度上限,该上限由0x1C00中的同步管理器类型和从站硬件决定。主站解析PDO时,必须严格按照映射顺序和位长度截取,任何顺序或长度偏差都会导致后续字段全部错位。
掌握索引区段、子索引计数、数据类型、访问权限和映射条目格式这五个要素,就能在CoE开发中快速定位对象、正确配置PDO,并在SDO异常时依据错误码判断是索引、子索引、权限还是映射状态的问题。