您的当前位置:首页正文

ethercat idle_thread流程图

2024-11-22 来源:个人技术集锦

2 状态机

以IDLE为例,状态机周期调用关系如下图所示:

//send interval in IDLE phase
ec_master_set_send_interval(master, 1000000/HZ);

ec_fsm_master 状态机的种类(查看结构体ec_fsm_master):

	/* 各个不同的状态机,每个状态机都有对应的不同的源码文件,如fsm_coe对应源码实现为/master/fsm_coe.h和/master/fsm_coe.c文件中 */
    ec_fsm_coe_t fsm_coe; /**< CoE state machine */
    ec_fsm_soe_t fsm_soe; /**< SoE state machine */
    ec_fsm_pdo_t fsm_pdo; /**< PDO configuration state machine. */
    ec_fsm_change_t fsm_change; /**< State change state machine */
    ec_fsm_slave_config_t fsm_slave_config; /**< slave state machine */
 
	/* 从站扫描状态机,主站状态机中的子状态机 */
    ec_fsm_slave_scan_t fsm_slave_scan; /**< slave state machine */

查看完毕该结构体可以看到主站状态机中还存在一些子状态机,如fsm_coe,fsm_soe,fsm_pdo,fsm_change,fsm_slave_config,基本的模式就是主站状态机在需要执行子状态机的时候,会一直等待子状态机完成相应工作,然后再执行之后的程序转入下一状态

那么继续看主站状态机,主站状态机的状态函数会在初始化的时候初始化到./master/fsm_master.c/ec_fsm_master_state_start()函数,该函数中会对状态机子报文进行填充,进行本周期的子报文数据发送,在此使用了BRD类型子报文(关于BRD子报文的作用可以查看这部分内容)进行数据发送,通过BRD类型子报文获取从站个数,然后进入下一个状态函数,也就是./master/fsm_master.c/ec_fsm_master_state_broadcast()中进行解析。由于使用的是BRD,对应的返回的子报文的WKC(WKC计算公式参考)也就是主站连接的从站的个数,这样通过判断与之前存储的从站个数时候一致就可以判断主站连接的从站有无变化,如果判断发生变化,那么就需要进行主站对从站的重新扫描过程

struct ec_fsm_slave_scan
{
    ec_slave_t *slave; /**< Slave the FSM runs on. */
 
    ec_datagram_t *datagram; /**< Datagram used in the state machine. */
    ec_fsm_slave_config_t *fsm_slave_config; /**< Slave configuration state machine to use. */
    ec_fsm_pdo_t *fsm_pdo; /**< PDO configuration state machine to use. */
    unsigned int retries; /**< Retries on datagram timeout. */
 
    void (*state)(ec_fsm_slave_scan_t *); /**< State function. */
 
    uint16_t sii_offset; /**< SII offset in words. */
    ec_fsm_sii_t fsm_sii; /**< SII state machine. */
};

6.ec_fsm_slave_scan_state_base()函数用于获取从站基础信息,主要包括FMMU个数、sync个数,FMMU是否支持位操作,从在哪是否支持DC,从站DC时间范围等信息。如果从站支持DC系统,那么就先进行DC的一些设置

7.获取DL状态:DL也就Data link,表示数据链路状态。他在0x0110~0x0111寄存器中存放。分别针对从站4个端口有无连接,有无回路闭合和信号是否有检测到进行信息获取。

8.获取SII信息,SII信息存放在EEPROM中,且第一个SII信息存放在EEPROM的0x40位置,然后利用SII信息获取子状态机对SII信息进行获取,大体来说就是根据SII每个项的存储格式可以获取到最终存储SII信息占据的空间大小,而后根据该空间大小将所有的SII信息获取复制到内存中,之后再进行SII信息的提取解析(./master/fsm_slave_scan.c/ec_fsm_slave_scan_state_sii_data())。

9.提取完毕SII信息后,如果支持从站COE协议,那么就继续执行./master/fsm_slave_scan.c/ec_fsm_slave_scan_enter_preop()状态函数,该状态函数中启用了从站配置子状态机,该状态机器会进行从站状态转换过程中一系列配置设置以及设置从站状态向目标设置状态变更。

10.大体上一个从站的由init状态转变向preop状态的流程如上,之后就是依次将主站连接的每个从站都执行一次上述流程。之后不断做从站的重新扫描。

显示全文