继上一期 基于SEED-RT118X套件开发EtherCat从站(三)通信机制,这期为您带来该系列的第四篇。
在EtherCAT系统成功搭建且主从站之间建立通信之后,主站会执行扫描过程来检测从站信息并进行初始化。为了确定一个从站是否可以开始正常工作,系统通常会依赖于从站状态机(Slave State Machine)来监控和管理从站的状态转换。
在i.MX RT1180这样的设备中,EtherCAT从站控制器集成在芯片内部,负责处理与EtherCAT网络相关的底层通信。应用层控制器(如M7或M33核心)则运行从站EtherCAT协议栈,并通过特定的寄存器访问接口与EtherCAT模块进行交互。
回到状态机,在EtherCAT系统中,从站控制器会在一系列预定义的状态之间进行转换,这些状态转换由主站和从站应用控制器共同决定,并通过特定的寄存器访问方式来实现。
AL Control寄存器:主站通过向此寄存器写入不同的值来请求从站进行状态变更。
AL Status寄存器:从站的应用层(如M7或M33核心)通过此寄存器来指示其当前状态。
AL Status Code寄存器:如果发生错误,从站会将错误代码写入此寄存器中,供主站读取。
从站刚上电时,通常会处于Initialization(Init)状态。为了使其能够正常工作,从站必须经历一系列的状态转换,最终进入Operational(OP)状态。这一过程通常包括以下几个步骤:
从Init状态开始,主站会向从站发送请求,使其进入Pre-Operational(PO)状态。在这个状态下,从站会进行必要的初始化操作,并准备与主站进行通信。
在SEED-RT118X从站的源代码ecatslv.c文件中,有一个名为AL_ControlInd的函数,该函数负责处理EtherCAT状态机。以下是该函数的详细解释:
可以看到这个函数在四种情况下会被调用
主站修改AL Control寄存器
主站修改SM-Change寄存器
本地看门狗超时
应用层特殊事件调用
再看AL_ControlInd中的下面这段代码:
可以看到,当遇到以下四种状态转换请求时:
case INIT_2_PREOP:
case OP_2_PREOP:
case SAFEOP_2_PREOP:
case PREOP_2_PREOP:
系统会调用CheckSmSettings(MAILBOX_READ+1)函数来检查同步管理器SYNCM0和SYNCM1的设置是否与本地资源匹配。如果检查结果正常,状态转换将继续进行;如果检查结果异常,状态转换将停止,并在AL-Status中设置错误标志。
在case PREOP_2_SAFEOP:状态转换请求时,系统会调用APPL_GenerateMapping (&nPdInputSize, &nPdOutputSize) 函数来生成PDO映射。该函数会根据需要调整输入数据 (nPdInputSize) 和输出数据 (nPdOutputSize) 的预期长度,这通常涉及到PDO分配和/或PDO映射的更改。如果映射生成成功,系统将继续执行后续的状态转换逻辑;如果映射生成失败,系统将保持在PREOP状态,并在AL-Status中设置错误标志。
在以下状态转换请求时:
case SAFEOP_2_OP:
case OP_2_SAFEOP:
case SAFEOP_2_SAFEOP:
case OP_2_OP:
系统会调用CheckSmSettings(nMaxSyncMan)函数来检查所有四个同步管理器(SYNCM0 到 SYNCM3)的设置是否与本地资源匹配。如果检查结果正常,系统将使能同步管理器并进入OP模式;如果检查结果异常,系统将从OP或SAFEOP状态回退到PREOP状态,并在AL-Status中设置错误标志。
我们看一下TwinCAT主站关于从站状态机的部分。
主站可以控制从站进入不同的状态,只有当从站进入OP状态之后才可以正常工作。
相关阅读