2. 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 字节),字段顺序与含义如下:
| 字地址 | 字段 | 长度 | 说明 |
|---|---|---|---|
| 0x0000 | PDI Control | 2 B | 过程数据接口类型与配置 |
| 0x0001 | PDI Config | 2 B | PDI 配置字 |
| 0x0002 | Sync Impulse Length | 2 B | 同步脉冲长度 |
| 0x0003 | PDI Config 2 | 2 B | 扩展 PDI 配置 |
| 0x0004~0x0007 | Configured Station Alias | 8 B | 站别名(低 2 字节有效) |
| 0x0008 | Checksum | 2 B | 身份区校验和 |
| 0x0009 | Vendor ID | 2 B | 厂商 ID(低字) |
| 0x000A | Vendor ID | 2 B | 厂商 ID(高字) |
| 0x000B | Product Code | 2 B | 产品码(低字) |
| 0x000C | Product Code | 2 B | 产品码(高字) |
| 0x000D | Revision Number | 2 B | 修订号(低字) |
| 0x000E | Revision Number | 2 B | 修订号(高字) |
| 0x000F | Serial Number | 2 B | 序列号(低字) |
注意:Vendor ID、Product Code、Revision Number 均为 32 位小端存储,低字在前。序列号在身份区只占 1 个字(低 16 位),完整 32 位序列号需结合配置区中的 SII 通用类别数据读取。
读取操作的关键步骤
主站读取 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
解析过程:
- Checksum = 0x5A3C(字地址 0x0008),用于校验身份区前 8 个字。
- Vendor ID = 低字 0x0002 + 高字 0x0000 → 0x00000002(示例厂商 ID)。
- Product Code = 低字 0x0A1B + 高字 0x0000 → 0x00000A1B。
- Revision Number = 低字 0x0001 + 高字 0x0000 → 0x00000001。
- Serial Number = 0x00C8(低 16 位),完整序列号需从配置区 SII 通用类别读取。
将上述值与 ESI 文件中的 <Vendor>、<ProductCode>、<RevisionNo> 字段比对,若一致则从站身份验证通过。
配置区数据读取要点
配置区从字地址 0x0010 开始,包含 SII(Slave Information Interface)描述。SII 头部结构如下:
| 字地址 | 字段 | 说明 |
|---|---|---|
| 0x0010 | SII 类别数量 | 配置区中类别条目总数 |
| 0x0011 | SII 版本 | 通常为 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 位值。