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;        }    }}

原创粉丝点击