2. EtherCAT从站EEPROM信息读取与解析

EtherCAT从站EEPROM信息读取与解析 学习卡片

EEPROM 里到底存了什么

EtherCAT 从站的 EEPROM(通常为 1 Kbit~16 Kbit 的 I²C 器件)保存了两类关键信息:身份标识区(字地址 0x0000~0x000F)和配置区(字地址 0x0010 起,含 SII 描述、SM/FMMU 配置、PDO 映射、同步管理器参数等)。主站通过 ESC 的寄存器接口(0x0502/0x0503 等)以字为单位间接访问 EEPROM,而不是直接挂 I²C 总线。

身份标识区固定 8 个字(16 字节),字段顺序与含义如下:

字地址字段长度说明
0x0000PDI Control2 B过程数据接口类型与配置
0x0001PDI Config2 BPDI 配置字
0x0002Sync Impulse Length2 B同步脉冲长度
0x0003PDI Config 22 B扩展 PDI 配置
0x0004~0x0007Configured Station Alias8 B站别名(低 2 字节有效)
0x0008Checksum2 B身份区校验和
0x0009Vendor ID2 B厂商 ID(低字)
0x000AVendor ID2 B厂商 ID(高字)
0x000BProduct Code2 B产品码(低字)
0x000CProduct Code2 B产品码(高字)
0x000DRevision Number2 B修订号(低字)
0x000ERevision Number2 B修订号(高字)
0x000FSerial Number2 B序列号(低字)

注意:Vendor ID、Product Code、Revision Number 均为 32 位小端存储,低字在前。序列号在身份区只占 1 个字(低 16 位),完整 32 位序列号需结合配置区中的 SII 通用类别数据读取。

EEPROM 身份标识区读取与解析流程 EtherCAT 主站 寄存器访问接口 0x0502/0x0503 ESC 从站控制器 EEPROM 接口寄存器 I²C EEPROM 身份标识区 0x0000~0x000F 配置区 0x0010 起 1 Kbit ~ 16 Kbit 解析结果与一致性验证 Vendor ID 0x0009~0x000A 32 位小端 Product Code 0x000B~0x000C 32 位小端 Revision Number 0x000D~0x000E 32 位小端 Serial Number 0x000F(低 16 位) 完整值需查 SII Checksum 0x0008 校验身份区 一致性验证:EEPROM 身份字段 ↔ ESI 描述文件(XML) Vendor ID / Product Code / Revision Number 必须匹配,否则从站无法进入 OP 状态 ⚠ 若 Checksum 校验失败或身份字段与 ESI 不匹配,主站将拒绝配置该从站 常见原因:EEPROM 写入错误、ESI 文件版本过旧、从站固件与描述文件不一致

读取操作的关键步骤

主站读取 EEPROM 不是一次读完整片,而是通过 ESC 的 EEPROM 控制/数据寄存器逐字或连续读取。以常见的 Beckhoff ESC 为例,关键寄存器如下:

  • 0x0502:EEPROM 控制寄存器(bit0~7 写命令,bit8~15 写地址高字节)
  • 0x0503:EEPROM 地址寄存器(低字节)
  • 0x0504~0x0507:EEPROM 数据寄存器(32 位,读/写数据)
  • 0x0508:EEPROM 状态寄存器(bit0 忙标志,bit1 读/写方向,bit2~7 错误码)

读取流程:先写地址到 0x0502/0x0503,再写读命令到 0x0502,然后轮询 0x0508 的忙标志,最后从 0x0504 取数据。连续读取时地址自动递增,可一次读取多个字。

解析示例:从原始字节到可读字段

假设从站返回的身份区原始数据(字地址 0x0000~0x000F,共 16 个字,小端字节序)如下:

0x0000: 0x0000 0x0000 0x0000 0x0000
0x0004: 0x0000 0x0000 0x0000 0x0000
0x0008: 0x5A3C 0x0002 0x0000 0x0A1B
0x000C: 0x0000 0x0001 0x0000 0x00C8

解析过程:

  1. Checksum = 0x5A3C(字地址 0x0008),用于校验身份区前 8 个字。
  2. Vendor ID = 低字 0x0002 + 高字 0x0000 → 0x00000002(示例厂商 ID)。
  3. Product Code = 低字 0x0A1B + 高字 0x0000 → 0x00000A1B。
  4. Revision Number = 低字 0x0001 + 高字 0x0000 → 0x00000001。
  5. Serial Number = 0x00C8(低 16 位),完整序列号需从配置区 SII 通用类别读取。

将上述值与 ESI 文件中的 <Vendor>、<ProductCode>、<RevisionNo> 字段比对,若一致则从站身份验证通过。

配置区数据读取要点

配置区从字地址 0x0010 开始,包含 SII(Slave Information Interface)描述。SII 头部结构如下:

字地址字段说明
0x0010SII 类别数量配置区中类别条目总数
0x0011SII 版本通常为 0x0001
0x0012类别 0 类型通常为 0x000A(字符串类别)
0x0013类别 0 长度字符串字节数
0x0014 起类别 0 数据设备名称、硬件版本等字符串

读取配置区时,先读 0x0010 获取类别数量,再按类别逐条读取类型、长度和数据。常见类别包括:0x000A(字符串)、0x001E(通用数据)、0x0028(同步管理器)、0x0029(FMMU)、0x0032(PDO 映射)等。

实操建议:使用 ethercat 命令行工具的 ethercat eeprom 子命令可直接读取指定从站的 EEPROM 内容。例如 ethercat eeprom -p 1 0x0000 0x0010 读取从站 1 的 0x0000~0x000F 共 16 个字。解析时注意字节序:ESC 返回的数据为小端,需按字重组为 32 位值。
常见陷阱:部分从站的 EEPROM 容量较小(如 1 Kbit),配置区可能被截断。读取前应先确认 EEPROM 大小(通过 ESC 寄存器 0x0500 的 bit0~3 或 SII 头部信息),避免越界读取返回 0xFFFF 导致误判。