4. 从站状态机ESM
EtherCAT从站状态机(EtherCAT State Machine,ESM)是每个从站控制器内部必须实现的核心机制,它规定了从站在不同通信能力等级之间迁移的规则。主站通过读写从站寄存器0x0120(AL Control)和0x0130(AL Status)来请求和监视状态,从站则根据自身硬件初始化结果、邮箱配置、过程数据配置以及应用层就绪情况,决定是否接受迁移请求。理解ESM,是排查“从站不进入OP”“PDO不更新”“初始化失败”等问题的关键。
四个基本状态及其通信能力
ESM定义了四个基本状态,每个状态对应不同的通信能力:
- Init(初始化):从站上电后的初始状态。此时只有ESC寄存器可访问,邮箱通信和过程数据通信均未建立。从站在此状态完成硬件自检、EEPROM读取、ESC配置加载等基础工作。
- Pre-Op(预运行):邮箱通信可用,主站可以通过CoE(CANopen over EtherCAT)读写对象字典,完成PDO映射、同步管理器配置、DC参数设置等。但过程数据尚未交换。
- Safe-Op(安全运行):过程数据输入(TxPDO)可用,从站可以上传实际位置、状态字等输入数据,但输出(RxPDO)仍被禁止,执行器不会动作。此状态用于验证输入数据正确性、检查DC同步质量。
- Op(运行):过程数据输入和输出均可用,从站正常参与实时控制。此时主站可以下发控制字、目标位置等输出数据,从站执行相应动作。
状态迁移不是单向的,从站可以在任意状态间根据主站请求和自身条件进行迁移,但必须遵循ESM规定的合法路径。例如,从Init不能直接跳到Safe-Op,必须先经过Pre-Op;从Op可以回退到Safe-Op或Pre-Op,用于故障恢复或重新配置。
状态迁移条件详解
每个状态迁移都有明确的触发条件和从站内部检查项。主站通过AL Control寄存器写入目标状态码(Init=0x01,Pre-Op=0x02,Safe-Op=0x04,Op=0x08),从站收到请求后执行内部检查,若通过则更新AL Status并完成迁移,否则保持原状态并在AL Status Code中记录错误原因。
Init → Pre-Op:从站需要完成ESC寄存器初始化、EEPROM加载、邮箱配置(SM0/SM1)。如果EEPROM校验失败或邮箱配置无效,从站会拒绝迁移,AL Status Code可能为0x0011(无效请求)或0x0016(EEPROM错误)。
Pre-Op → Safe-Op:主站必须已完成PDO映射配置(通过CoE写入0x1C12/0x1C13)、同步管理器配置(SM2/SM3)、DC参数设置(若使用分布式时钟)。从站检查这些配置是否合法,例如PDO映射长度是否与SM长度匹配、SM看门狗是否使能。若配置不完整,从站返回0x0011或0x0024(SM配置错误)。
Safe-Op → Op:这是最严格的迁移。从站需要确认:输入数据已有效(TxPDO数据稳定)、DC同步已建立(若使能)、输出数据已收到有效值(RxPDO至少收到一帧有效数据)。在伺服驱动器中,通常还要求驱动器使能、无故障。若DC同步未建立,从站可能返回0x0032(DC同步错误)。
错误处理与状态请求实践
实际工程中,主站通常按以下流程请求状态迁移:
// 示例:主站请求从站进入Pre-Op(伪代码)
writeRegister(slave, 0x0120, 0x02); // 请求Pre-Op
timeout = 1000; // 1s超时
while (timeout--) {
status = readRegister(slave, 0x0130);
if ((status & 0x0F) == 0x02) { // 低4位为当前状态
printf("已进入Pre-Op\n");
break;
}
if (status & 0x10) { // bit4为错误标志
errorCode = readRegister(slave, 0x0134); // AL Status Code
printf("迁移失败,错误码:0x%04X\n", errorCode);
break;
}
delay(1);
}
常见错误码及处理建议:
| 错误码 | 含义 | 处理建议 |
|---|---|---|
| 0x0011 | 无效状态请求 | 检查请求顺序,确认从站支持该迁移路径 |
| 0x0016 | EEPROM错误 | 检查EEPROM内容、校验和,必要时重新烧录 |
| 0x0024 | SM配置错误 | 检查SM2/SM3长度、方向、看门狗配置 |
| 0x0032 | DC同步错误 | 检查DC参考时钟、同步窗口、漂移补偿参数 |
| 0x0035 | PDO看门狗超时 | 检查主站周期、网络负载、从站看门狗时间 |
状态请求的另一个关键点是状态请求超时。主站不能无限等待,通常设置100ms~1s的超时窗口。若超时未达目标状态,主站应读取AL Status Code并记录日志,然后决定重试或报错。对于多从站系统,建议逐个从站迁移,避免同时请求导致网络拥塞和诊断困难。
最后,ESM状态迁移与从站的应用层状态紧密相关。例如,一个伺服从站在Safe-Op下可以上传位置反馈,但只有进入Op后才会响应控制字。若应用层检测到故障(如过流、编码器错误),从站可以主动从Op回退到Safe-Op,并通过AL Status Code通知主站。主站应周期性读取AL Status,及时发现从站主动回退事件。