跳到主要内容

EtherCAT 状态机 (ESM)

状态机概述

每个 EtherCAT 从站都有状态机,控制其运行状态:

EtherCAT 状态机转换图

各状态说明

状态英文功能
INITInit0x01仅寄存器访问,无通信
PREOPPre-Operational0x02Mailbox 通信可用,可配置
SAFEOPSafe-Operational0x04输入有效,输出为安全值
OPOperational0x08完全运行,正常数据交换
BOOTBootstrap0x03特殊模式,用于固件更新

状态详解与转换

INIT 状态

功能:

  • 主站可读写 ESC 寄存器(端口状态、SII 信息等)
  • 可识别从站身份(厂商 ID、产品代码)
  • 应用层无通信

转换到 PREOP:

  • 主站配置 DL 寄存器和配置地址(0x0010)
  • 配置邮箱 SyncManager(SM0/SM1)
  • 若使用 DC,同步系统时间到参考时钟

PREOP 状态

功能:

  • 邮箱通信可用,可通过 SDO 读写参数
  • 配置过程数据映射
  • 无过程数据通信

转换到 SAFEOP:

  • 下载启动命令和过程数据配置
  • 配置过程数据 SyncManager(SM2 输出/SM3 输入)
  • 配置 FMMU 通道
  • 配置 DC 参数(周期、启动时间等)
  • 主站开始发送过程数据帧
  • 从站开始更新输入数据

SAFEOP 状态

功能:

  • 邮箱通信和过程数据通信都运行
  • 从站提供有效输入数据
  • 输出保持安全值(如 0V,而非 24V)

转换到 OP:

  • 若使用 DC,从站检查 DC 设置并锁定 PLL
  • 监控输出数据是否在 DC Sync 事件前到达
  • 主站开始发送有效输出值
  • 从站确认 OP 后,将输出设置为接收值

OP 状态

功能:

  • 输入和输出都有效
  • 与 DC 精确同步(若使用)
  • 邮箱通信可用
  • 正常周期性数据交换

错误处理:

  • 若 OP 状态发生错误,从站自动回退到较低状态
  • 设置错误标志并提供 AL 状态码
  • 主站可读取错误码进行诊断

状态转换流程

状态转换代码示例

方法一:直接赋值

// 逐步切换到 OP 状态
// 库完全内置逐级切换功能, 自动配置功能, 可以自由切换状态机
master.State = EcState.Init;
master.State = EcState.PreOp;
master.State = EcState.SafeOp;
master.State = EcState.OP;

// 检查当前状态
Console.WriteLine($"当前状态: {master.State}");

方法二:使用 SetState 方法

// SetState 返回 (成功, 消息) 元组
var (success, message) = master.SetState(EcState.PreOp);
if (!success)
{
Console.WriteLine($"状态切换失败: {message}");
return;
}

// 继续切换到 OP
master.SetState(EcState.OP);

错误检测与恢复

// 实际操作中建议使用内置事件处理降级事件
// 检查状态
if (master.State != EcState.OP)
{
Console.WriteLine($"状态异常: {master.State}");

// 尝试重新启动
try
{
var (success, message) = master.SetState(EcState.PreOp);
if (!success)
{
Console.WriteLine($"状态恢复失败: {message}");
return;
}
Console.WriteLine("状态恢复成功");
}
catch (Exception ex)
{
Console.WriteLine($"恢复失败: {ex.Message}");
}
}