ECAT_StateChange——EtherCAT状态转换
来源:互联网 发布:淘宝网长袖围裙 编辑:程序博客网 时间:2024/06/05 15:08
//////////////////////////////////////////////////////////////////////////////////////////** \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; } }}