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,用于故障恢复或重新配置。

EtherCAT 从站状态机(ESM)状态迁移与通信能力 Init 仅ESC寄存器可访问 邮箱/PDO均未建立 Pre-Op 邮箱通信可用(CoE) PDO未交换 Safe-Op TxPDO可用(输入) RxPDO禁止(输出) Op TxPDO + RxPDO 均可用 正常实时控制 请求Pre-Op 邮箱初始化完成 请求Safe-Op SM/PDO映射配置完成 请求Op DC同步建立、输入数据有效 故障回退 配置错误回退 复位/重新初始化 状态请求与错误处理机制 AL Control (0x0120) 主站写入请求状态码 AL Status (0x0130) 从站反馈当前状态+错误码 AL Status Code 错误原因(如0x0011无效请求) 迁移条件:主站请求 + 从站内部条件满足(硬件就绪、配置完成、同步建立) 错误处理:从站拒绝迁移时,AL Status保持原状态并置位错误码,主站需读取并处理 状态请求超时:主站轮询AL Status,若超时未达目标状态则判定迁移失败

状态迁移条件详解

每个状态迁移都有明确的触发条件和从站内部检查项。主站通过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无效状态请求检查请求顺序,确认从站支持该迁移路径
0x0016EEPROM错误检查EEPROM内容、校验和,必要时重新烧录
0x0024SM配置错误检查SM2/SM3长度、方向、看门狗配置
0x0032DC同步错误检查DC参考时钟、同步窗口、漂移补偿参数
0x0035PDO看门狗超时检查主站周期、网络负载、从站看门狗时间
调试建议:使用Wireshark抓取EtherCAT帧,过滤AL Control/Status寄存器读写,可以直观看到主站请求与从站响应的时序关系。若从站一直停留在Pre-Op,优先检查PDO映射和SM配置是否与ESI文件一致。
注意:从Op回退到Safe-Op或Pre-Op时,从站会立即停止输出,执行器可能因失去控制信号而进入安全状态。在运动控制场景中,应确保回退前已通过应用层将轴减速停止,避免机械冲击。

状态请求的另一个关键点是状态请求超时。主站不能无限等待,通常设置100ms~1s的超时窗口。若超时未达目标状态,主站应读取AL Status Code并记录日志,然后决定重试或报错。对于多从站系统,建议逐个从站迁移,避免同时请求导致网络拥塞和诊断困难。

最后,ESM状态迁移与从站的应用层状态紧密相关。例如,一个伺服从站在Safe-Op下可以上传位置反馈,但只有进入Op后才会响应控制字。若应用层检测到故障(如过流、编码器错误),从站可以主动从Op回退到Safe-Op,并通过AL Status Code通知主站。主站应周期性读取AL Status,及时发现从站主动回退事件。