1. EtherCAT状态机控制函数解析
在EtherCAT从站开发中,AL_ControlInd函数是状态机控制的核心枢纽。这个函数负责处理从站设备的各种状态转换逻辑,相当于EtherCAT从站的"交通指挥中心"。当我在实际项目中第一次接触这个函数时,花了整整两周时间才完全理解其运作机制。
1.1 函数基本结构与调用场景
AL_ControlInd函数的原型如下:
c复制void AL_ControlInd(UINT8 alControl, UINT16 alStatusCode)
这个函数会在四种典型场景下被调用:
- 主站写AL控制寄存器(0x220的位0触发):此时alControl参数包含AL控制寄存器(0x120)的内容
- SM改变事件(0x220的第4位触发):当主站写入激活的SYNCM寄存器时,alControl包含实际状态(0x130的位0-3)
- 本地看门狗溢出:从ECAT_Main函数调用,alControl包含SAFE_OP状态请求
- 应用程序特殊事件:从应用层调用,alControl包含INIT/PRE_OP/SAFE_OP状态请求
1.2 状态转换处理流程
函数内部的处理流程可以概括为以下几个关键步骤:
-
初始化处理:
- 停用ESM超时计数器(EsmTimeoutCounter = -1)
- 设置应用ESM挂起标志(bApplEsmPending = TRUE)
-
错误确认处理:
c复制if (alControl & STATE_CHANGE) { bErrAck = 1; nAlStatus &= ~STATE_CHANGE; }这段代码处理主站对错误状态的确认,重置错误指示标志。
-
状态转换变量准备:
c复制alControl &= STATE_MASK; stateTrans = nAlStatus; stateTrans <<= 4; stateTrans += alControl;这里将新旧状态组合成一个8位变量(高4位旧状态,低4位新状态),便于后续s
