4. EtherCAT过程数据对象映射配置

PDO 映射的本质:把对象字典条目“搬进”过程数据帧

EtherCAT 从站的过程数据对象(PDO)映射,本质是告诉从站:每个通信周期交换的过程数据帧里,哪几个字节对应对象字典中的哪个条目。对于数字量输出从站,典型映射对象包括控制字(Control Word,0x6040)和输出数据(如 0x7000:01 的数字量输出)。映射关系通过 0x1C12(SyncManager 2 输出 PDO 分配)和 0x1600(输出 PDO 映射参数)配置。

配置流程遵循“先写映射内容,再写分配,最后切状态生效”的顺序:在 PREOP 状态下写入 0x1600 子索引,声明映射的条目与位长;再写 0x1C12 把该 PDO 分配给 SyncManager 2;随后请求 SAFEOP/OP,从站才会按新映射组装过程数据帧。

从站对象字典 0x6040 控制字 16 bit · 使能/启动/停止 0x7000:01 数字量输出 8 bit · DO0~DO7 0x7000:02 输出使能 8 bit · 通道使能位 0x1A00 输入 PDO 映射 状态字/输入数据 0x1600 输出 PDO 映射 映射条目列表 0x1C12 SM2 分配 PDO 映射配置 0x1600:00 = 2 映射条目数量 (控制字 + 输出数据) 0x1600:01 = 0x60400010 索引 0x6040 · 子索引 00 位长 16 bit 0x1600:02 = 0x70000108 索引 0x7000 · 子索引 01 位长 8 bit 0x1C12:01 = 0x1600 分配给 SyncManager 2 0x1C12:00 = 1(分配数量) 过程数据帧(SM2 输出) Byte 0~1 控制字 0x6040 Byte 2 数字量输出 0x7000:01 Byte 3 输出使能 0x7000:02 Byte 4~5 预留 / 填充 总长度:6 Byte 每周期刷新 配置需在 PREOP 状态完成,切 OP 后生效

关键配置步骤与写入验证

以下以 IgH EtherCAT Master 为例,展示通过命令行工具配置 PDO 映射并验证的完整过程。假设从站位置为 0,输出 PDO 映射对象为 0x1600,SyncManager 2 分配对象为 0x1C12。

  1. 确认从站处于 PREOP 状态:ethercat states 查看从站状态,确保为 PREOP。若在 OP 状态,需先切回 PREOP。
  2. 写入映射条目数量:ethercat download -p 0 0x1600 0x00 -t uint8 2,声明有 2 个映射条目。
  3. 写入第 1 个映射条目(控制字):ethercat download -p 0 0x1600 0x01 -t uint32 0x60400010。其中 0x6040 为索引,00 为子索引,0x10 表示 16 位长度。
  4. 写入第 2 个映射条目(数字量输出):ethercat download -p 0 0x1600 0x02 -t uint32 0x70000108。0x7000 索引,01 子索引,0x08 表示 8 位长度。
  5. 将 PDO 分配给 SyncManager 2:ethercat download -p 0 0x1C12 0x01 -t uint16 0x1600,然后 ethercat download -p 0 0x1C12 0x00 -t uint8 1 设置分配数量为 1。
  6. 切换到 OP 状态:ethercat states -p 0 OP,从站按新映射组装过程数据帧。

写入验证方法:在 OP 状态下,使用 ethercat upload -p 0 0x1600 0x01 -t uint32 回读映射条目,确认返回值为 0x60400010。再通过 ethercat upload -p 0 0x1C12 0x01 -t uint16 确认返回 0x1600。若回读值与写入值一致,说明映射已生效。

映射条目编码规则

位段含义示例值说明
31~16对象索引0x6040控制字对象索引
15~8子索引0x00控制字子索引
7~0位长度0x1016 位,即 2 字节

映射条目中的位长度必须与对象字典中该条目的实际数据类型一致。若控制字为 16 位无符号整数,位长度写 0x10;若数字量输出为 8 位,写 0x08。位长度错误会导致从站拒绝进入 OP 状态或过程数据错位。

修改 PDO 映射后,必须重新触发从站状态转换(PREOP → SAFEOP → OP)才能生效。仅在 PREOP 写入而不切换状态,过程数据帧仍按旧映射组装。此外,部分从站要求先清除 0x1C12:00 再重新写入,否则可能返回 0x06010002(对象不可写)错误。