加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 相关推荐
申请入驻 产业图谱

基于i.MX RT118X开发ethercat从站(四)-状态机

01/03 16:20
157
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

在EtherCAT系统成功搭建且主从站之间建立通信之后,主站会执行扫描过程来检测从站信息并进行初始化。为了确定一个从站是否可以开始正常工作,系统通常会依赖于从站状态机(Slave State Machine)来监控和管理从站的状态转换。

i.MX RT1180这样的设备中,EtherCAT从站控制器集成在芯片内部,负责处理与EtherCAT网络相关的底层通信。应用层控制器(如M7或M33核心)则运行从站EtherCAT协议栈,并通过特定的寄存器访问接口与EtherCAT模块进行交互。

主站通过网络数据包的方式与从站EtherCAT模块进行通信,而应用层控制器(M7或M33)则通过寄存器访问的方式直接访问EtherCAT模块。这种双重访问模式使得EtherCAT模块既能够响应来自主站的网络请求,又能够接受来自内核控制器(M7或M33)的本地指令。

以i.MX RT1180的EtherCAT模块中的Type寄存器为例,该寄存器用于标识EtherCAT控制器的类型。其偏移地址为0,访问方式Bit field access for ECAT :r/-,说明主站可以对该寄存器进行只读访问,Bit field access for PDI :r/-说明M7核或者M33核可以对该寄存器进行只读访问。

回到状态机,在EtherCAT系统中,从站控制器会在一系列预定义的状态之间进行转换,这些状态转换由主站和从站应用控制器共同决定,并通过特定的寄存器访问方式来实现。

状态转换主要涉及以下几个关键寄存器:

AL Control寄存器:主站通过向此寄存器写入不同的值来请求从站进行状态变更。

AL Status寄存器:从站的应用层(如M7或M33核心)通过此寄存器来指示其当前状态。

AL Status Code寄存器:如果发生错误,从站会将错误代码写入此寄存器中,供主站读取。

从站刚上电时,通常会处于Initialization(Init)状态。为了使其能够正常工作,从站必须经历一系列的状态转换,最终进入Operational(OP)状态。这一过程通常包括以下几个步骤:

  1. 从Init状态开始,主站会向从站发送请求,使其进入Pre-Operational(PO)状态。在这个状态下,从站会进行必要的初始化操作,并准备与主站进行通信。
  2. 一旦从站成功进入PO状态,主站会进一步请求从站进入Safe-Operational(SO)状态。在SO状态下,从站会执行一些安全相关的操作,以确保在切换到OP状态之前系统处于安全状态。
  3. 最后,如果所有条件都满足,主站会请求从站进入Operational(OP)状态。在OP状态下,从站将开始处理PDO(过程数据对象)等实时数据,并与主站进行正常的数据交换。

每一步的状态跳转都需要从站先接收到主站的请求,并在满足一定条件后才会执行。这些条件可能包括从站初始化完成、错误恢复、安全条件满足等。

在从站的源代码ecatslv.c文件中,有一个名为AL_ControlInd的函数,该函数负责处理EtherCAT状态机。以下是该函数的详细解释:

void AL_ControlInd(UINT8 alControl, UINT16 alStatusCode)  

{  

    /**  

     * param alControl 请求的新状态  

     * param alStatusCode 请求的状态码  

     *  

     * brief 此函数处理EtherCAT状态机。它在以下情况下被调用:  

     * - 当主站写入AL Control寄存器(位于ECAT_Main模块)时,表示AL Control事件(AL-Event寄存器(Reg 0x220)的第0位被置位),  

     *   alControl参数包含AL Control寄存器(Reg 0x120)的内容。  

     * - 当主站写入Activate SYNCM寄存器(位于ECAT_Main模块)时,表示SM-Change事件(AL-Event寄存器(Reg 0x220)的第4位被置位),  

     *   alControl参数包含AL Status寄存器(Reg 0x130)的当前状态(第0-3位)。  

     * - 当本地看门狗超时时(由ECAT_Main模块触发),alControl参数包含请求的新状态(SAFE_OP)。  

     * - 当应用层触发特定事件以更改EtherCAT状态时(由应用程序调用),alControl参数包含请求的新状态(INIT, PRE_OP 或 SAFE_OP)。  

     */  

}可以看到这个函数在四种情况下会被调用

  • 主站修改AL Control寄存器
  • 主站修改SM-Change寄存器
  • 本地看门狗超时
  • 应用层特殊事件调用

再看AL_ControlInd中的下面这段代码,

/*  

 * 生成状态转换变量  

 * (Bit 0-3: 新状态 (AL Control), Bit 4-7: 旧状态 (AL Status))  

 */  

alControl &= STATE_MASK; // 清除alControl变量中除了状态位(Bit 0-3)以外的其他位  

stateTrans = nAlStatus;  // 将旧状态(AL Status)赋值给stateTrans变量  

stateTrans <<= 4;        // 将stateTrans变量中的旧状态左移4位,以便与新状态合并  

stateTrans += alControl; // 将新状态(alControl)与左移后的旧状态合并,形成完整的状态转换变量  

  

/*  

 * 根据状态转换检查 SYNCM 设置  

 */  

switch (stateTrans) // 使用switch语句根据stateTrans的值检查不同的状态转换  

{  

case INIT_2_PREOP:       // 从INIT状态转换到PREOP状态  

case OP_2_PREOP:         // 从OP状态转换到PREOP状态  

case SAFEOP_2_PREOP:     // 从SAFEOP状态转换到PREOP状态  

case PREOP_2_PREOP:      // PREOP状态内部转换

    /*  

     * 在PREOP状态下,仅检查SYNCM0和SYNCM1(邮箱)的设置  

     * 如果结果不为0,从站将保持在PREOP状态或切换回INIT状态,并设置AL-Status的ErrorInd位(位4)  

     */  

    result = CheckSmSettings(MAILBOX_READ+1); // 调用函数检查SYNCM0和SYNCM1的设置  

    break;  

  

case PREOP_2_SAFEOP:     // 从PREOP状态转换到SAFEOP状态  

{  

    result = APPL_GenerateMapping(&nPdInputSize, &nPdOutputSize); // 调用函数生成或更新数据映射  

  

    if (result != 0) // 如果映射生成失败  

    {  

        break; // 跳出case语句,不再继续执行后续代码  

    }  

}

  

case SAFEOP_2_OP:        // 从SAFEOP状态转换到OP状态  

case OP_2_SAFEOP:        // 从OP状态转换到SAFEOP状态  

case SAFEOP_2_SAFEOP:    // SAFEOP状态内部转换  

case OP_2_OP:            // OP状态内部转换

    /*  

     * 在SAFEOP或OP状态下,检查所有SYNCM的设置  

     * 如果结果不为0,从站将保持在PREOP状态或切换回PREOP状态,并设置AL-Status的ErrorInd位(位4)  

     */  

    result = CheckSmSettings(nMaxSyncMan); // 调用函数检查所有SYNCM的设置  

    break;  

} // switch语句结束  

 

可以看到,当遇到以下四种状态转换请求时:

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状态之后才可以正常工作。

 

 

相关推荐