您的位置:首页 > 其它

EtherCAT状态转换

2016-06-23 17:47 741 查看
原文地址:http://blog.csdn.net/huangxianxinalice/article/details/9896953

[cpp] view
plain copy

/////////////////////////////////////////////////////////////////////////////////////////  

/**  

 \param    alStatus: 所需的状态  

 \param    alStatusCode: 应用层状态寄存器的值  

   

 \brief   如果所需要的状态比实际状态要低,这个函数改变EtherCAT从站的状态,否则错误条件将会被重置;做一些出错处理和状态处理  

[cpp] view
plain copy

*////////////////////////////////////////////////////////////////////////////////////////  

  

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;  

        }  

    }  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: