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

浙公网安备 33010602011771号