EtherCAT使用与解析-从站配置子状态机(init->preop)

从站配置的子状态机是./master/fsm_slave_config.h/ec_fsm_slave_config结构体

struct ec_fsm_slave_config
{
    ec_datagram_t *datagram; /**< Datagram used in the state machine. */

    ec_fsm_change_t *fsm_change; /**< State change state machine. */
    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_slave_t *slave; /**< Slave the FSM runs on. */
    void (*state)(ec_fsm_slave_config_t *); /**< State function. */
    unsigned int retries; /**< Retries on datagram timeout. */
    ec_sdo_request_t *request; /**< SDO request for SDO configuration. */

    ec_sdo_request_t request_copy; /**< Copied SDO request. */
    ec_soe_request_t *soe_request; /**< SDO request for SDO configuration. */
    ec_soe_request_t soe_request_copy; /**< Copied SDO request. */
    unsigned long jiffies_start; /**< For timeout calculations. */
    unsigned int take_time; /**< Store jiffies after datagram reception. */
};

该状态转换机从./master/fsm_slave_config.c/ec_fsm_slave_config_start()函数开始执行,由于从站状态可以从任何状态转换成为init状态,因此起始的时候先将从站申请为init的状态。该处又使用了状态转换的子状态机sc_fsm_change_t,结构内容如下(该结构体是./master/fsm_change.h/ec_fsm_change结构,状态转换本质就是修改从站的0x0120~0x0121寄存器,该寄存器就是从站状态申请的寄存器):

struct ec_fsm_change
{
    ec_slave_t *slave; /**< slave the FSM runs on */
    ec_datagram_t *datagram; /**< datagram used in the state machine */
    unsigned int retries; /**< retries upon datagram timeout */

    void (*state)(ec_fsm_change_t *); /**< slave state change state function */
    ec_fsm_change_mode_t mode; /**< full state change, or ack only. */

    ec_slave_state_t requested_state; /**< input: state */

    ec_slave_state_t old_state; /**< prior slave state */
    unsigned long jiffies_start; /**< change timer */
    uint8_t take_time; /**< take sending timestamp */

    uint8_t spontaneous_change; /**< spontaneous state change detected */
};

修改从站为init状态后,主站对从站进行了以下操作:

1.配置清理方面的工作,主要有三大部分:FMMU、sync、DC;

2.邮箱配置方面,就是负责邮箱通信的同步管理器方面的配置,一般使用同步管理器的前两个;

初始化配置完成后,使用ec_fsm_change_t状态机进行从站init到preop状态的转换;

注:在进行pdo有关的sync的设置过程中,程序只是简单的判断SII信息中sync个数时候满足需要,没有就直接配置FMMU,感觉这地方是个BUG,应该设置状态函数为异常然后报警退出之类的。

另外,个人推测:对于从站来说,SII信息应该保证相关PDO与sync的关系,否则启用了邮箱功能,而后设置PDO关联前两个sync是否会异常,这部分不是太清楚,希望了解相关内容的大佬可以评论一下0.0

posted @ 2020-04-05 20:13  呵哈呵  阅读(738)  评论(0)    收藏  举报