ECAT_StateChange——EtherCAT状态转换

/
/**
 \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;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值