原文地址:http://blog.csdn.net/huangxianxinalice/article/details/9896953
- /
- /**
- \param alStatus: 所需的状态
- \param alStatusCode: 应用层状态寄存器的值
- \brief 如果所需要的状态比实际状态要低,这个函数改变EtherCAT从站的状态,否则错误条件将会被重置;做一些出错处理和状态处理
- *
- void ECAT_StateChange(UINT8 alStatus, UINT16 alStatusCode)
- {
- UINT8 Status = alStatus;
- if(bEcatWaitForAlControlRes)
- {
- /*状态转换正被暂停*/
- if(bApplEsmPending)
- {
- /*协议栈控制状态的转换,如果ESM超时的本地错误*/
- if(alStatusCode != 0)
- {
- bLocalErrorFlag = TRUE;
- u16LocalErrorCode = alStatusCode;
- EsmTimeoutCounter = 0;
- }
- }
- else
- {
- /*完成状态的转换*/
- if(alStatusCode != 0)
- {
- bLocalErrorFlag = TRUE;
- u16LocalErrorCode = alStatusCode;
- /*状态转换失败因为本地的应用程序问题*/
- switch(nEcatStateTrans)
- {
- case INIT_2_PREOP:
- case INIT_2_BOOT:
- APPL_StopMailboxHandler();
- MBX_StopMailboxHandler();
- break;
- case PREOP_2_SAFEOP:
- APPL_StopInputHandler();
- StopInputHandler();
- break;
- case SAFEOP_2_OP:
- APPL_StopOutputHandler();
- StopOutputHandler();
- break;
- }
- /*如果一个失败的状态转换 */
- Status = (UINT8)(nEcatStateTrans >> 4);
- }
- else
- {
- /*状态转换成功*/
- switch(nEcatStateTrans)
- {
- #if MAILBOX_SUPPORTED
- case INIT_2_PREOP:
- case INIT_2_BOOT:
- bMbxRunning = TRUE;
- break;
- #endif
- case PREOP_2_SAFEOP:
- bEcatInputUpdateRunning = TRUE;
- break;
- case SAFEOP_2_OP:
- bEcatOutputUpdateRunning = TRUE;
- break;
- }
- /*如果一个错误的状态转换 */
- Status = (UINT8)(nEcatStateTrans & STATE_MASK);
- }
- /*推迟状态转换完成,写入AL状态和AL状态码*/
- bEcatWaitForAlControlRes = FALSE;
- if(alStatusCode != 0)
- Status |= STATE_CHANGE;
- SetALStatus(Status,alStatusCode);
- }//状态转换需要在本地应用程序中被完成
- }//状态转换推迟
- else
- {
- if ( alStatusCode != 0 )
- {
- /* 本地错误发生,如果有需要,我们改变状态 */
- bLocalErrorFlag = TRUE;
- u16LocalErrorCode = alStatusCode;
- if ( (alStatus & STATE_MASK) < (nAlStatus & STATE_MASK) )
- {
- AL_ControlInd(alStatus, alStatusCode);
- }
- }
- else if (bLocalErrorFlag)
- {
- /*一个本地的错误发生 */
- if ( (nAlStatus & STATE_MASK) == (STATE_SAFEOP | STATE_OP) )
- {
- if(nPdOutputSize > 0)
- {
- /* 我们需要使能输出过程数据SM(默认是SM2),因为它被禁止,当转换回去SAFE-OP状态
- */
- HW_EnableSyncManChannel(PROCESS_DATA_OUT);
- }
- else if (nPdInputSize > 0)
- {
- /* 我们需要使能输入过程数据SM(默认是SM3),因为它可以被禁止当转换回去SAFE-OP状态的时候 */
- HW_EnableSyncManChannel(PROCESS_DATA_IN);
- }
- }
- bLocalErrorFlag = FALSE;
- u16LocalErrorCode = 0x00;
- }
- }
- }