图1
瀑布型的理解思路;
当MailLoop在task1中,被周期性调用的时候。
首先判断从站的工作状态是在FreeRun_mode,Synchron_mode还是DC_Mode
我们今天来讨论最简单的情况,FreeRun_mode,它是通过
bEscIntEnabled和bEcatFirstOutputsReceived来判断的
在FreeRun_mode当中并不涉及到分布时钟。
当ESC没有使能中断的时候,我们采用轮询的方式判断输入事件是否接收,采用函数HW_GetALEventRegister();
置位,bEcatFirstOutputsReceived给状态机表示输入事件已经接收。
如果bEcatOutputUpdateRunning是1,则调用函数PDO_OutputMapping();更新输出,(如上图1)
如果没有输出事件被传输,当输入已经被读了之后,看门狗必须被重置
然后,停止ESC中断,执行ECAT_Application()(如上图1)
在ECAT_Application()里面调用APPL_Application()函数,APPL_Application()函数,是在应用层上面对对象字典进行操作。对输出的对象字典进行操作。
如果输入更新使能,则更新PDO的输入对象字典(如上图1)
然后,检查定时器,判断预先设定的周期是否超时
如果超时则清楚定时器,并开始第二个周期。