EtherCAT State Transition

来源:互联网 发布:如何提高淘宝宝贝排名 编辑:程序博客网 时间:2024/06/08 14:23

EtherCAT状态机
EtherCAT有如下几种状态,Init、PreOP、SafeOP、OP和bootstrap。

EtherCAT状态机模块负责控制EtherCAT状态机在以上几种状态间跳转。EtherCAT主函数名称为ECAT_Main(),可以在定时器中断函数或程序主函数,周期性运行。

该函数主要包含以下功能:

1、读取中断标志寄存器ALEventReg的值,根据值来判断是什么触发的中断,中断类型包括EEPROM_CMD_PENDING(EEPROM命令)、SM_CHANGE(SM寄存器被重新配置)、AL_CONTROL_EVENT(AL_CONTROL寄存器被写入数值)、MAILBOX_READ等事件。

2、根据不同事件,分别作出不同处理。就AL_CONTROL_EVENT而言,则调用AL_ControlInd(状态机状态, 0)来处理。就SM_CHANGE事件,则使用AL_ControlInd(自身原来的状态, 0)来重新对SM的设置进行检查。

3、​​由于状态机的转换需要考虑的应用层的情况,有可能应用层处理较慢而导致超时,因此设置变量bEcatWaitForAlControlRes来标志程序进入等待状态。进入等待状态的状态机调用AL_ControlRes()函数处理。

关于​AL_ControlInd()函数:

1、先处理AL_STATUS寄存器的错误位(bit4),如果有错误位并且目标不是Init状态,则退出函数,否则消除错误位。对AL_CONTROL错误位处理,则存储起来。

2、生成一个16位变量​statetrans,高8位用来存储原始状态AL_STATUS,低8位用来存储转换的目标状态AL_CONTROL。

3、根据不同的状态转换,检查SM寄存器的配置。对于PreOP,检查SM0和SM1的配置;对于SafeOP,检查应用层输入和输出数据映射(还不太明白为啥不检查SM2);对于OP,则检查SM0-SM3。

4、如果第三步没问题,则启动相应状态机对应的服务。

 对于PreOP,检查EEPROM的加载是否正确,​打开邮箱通信服务MBX_StartMailboxHandler()和应用层的APPL_StartMailboxHandler(),如果打开失败,则关闭。MBX_StopMailboxHandler()和APPL_StopMailboxHandler(),并保存错误Code。对于SafeOP,APPL_StartInputHandler​()和StartInputHandler​(),打开失败则关闭,保存错误Code。对于OP, APPL_StartOutputHandler()​和StartOutputHandler(),打开失败则关闭,并回退到PreOP状态,保存错误Code。对于OP2OP、SafeOP2SafeOP、PreOP2PreOP​,则处理错误位,并重新使能SM。

5、如果返回状态为NOERROR_INWORK,标记bEcatWaitForAlControlRes,设置超时计数器等待。​

6、如果有错误,则设置错误位(bit4),同时修改AL_STATUS,否则直接修改AL_STATUS。​

关于​AL_ControlRes()函数:​

1、如果已经超时。​

Init2PreOP或Init2Bootstrap,关闭MailboxHandler,并输出localerror本地错误或者EtherCAT错误码。PreOP2SafeOP,关闭InputHandler,输出本地错误或者EtherCAT错误码。SafeOP2OP,如果DC时钟使能但没有收到SYNC信号中断,同步错误;如果没有接收到输出数据,看门狗错误。其他,同步错误。如果DC时钟没有使能,并且没有输出数据,也让它进入OP。有错误则关闭OutputHandler,输出SafeOP和错误码。

2、如果没有超时。

重试。​
原创粉丝点击