AL_ControlRes

原文地址:http://blog.csdn.net/huangxianxinalice/article/details/9919967

另外,这里有一个应用程序特别的检查(在ecatappl.c里面),如果状态转换从INIT到BOOT应该被完成,如果结果是NOERROR_INWORK,从站应该停留在INIT状态直到超时或者转换应该在AL_ControlRes里面完成

[cpp]  view plain  copy
  1. /  
  2. /** 
  3.  \brief    应用程序控制响应 
  4.  \brief    这个函数被周期性调用,如果状态转换暂停(bEcatWaitForAlControlRes == TRUE) 
  5.  \brief    如果ESM超时,状态转换将被拒绝。否则,应用程序特殊的状态转换函数将会被调用 
  6.  \brief    如果暂停状态转换被应用程序触发,状态转换将被应用程序(ECAT_StateChange)中完成 
  7.   *////  
  8. void AL_ControlRes(void)  
  9. {  
  10.     if(bEcatWaitForAlControlRes)  
  11.     {  
  12.         UINT16 result = 0;  
  13.         UINT8 Status = 0;  
  14.         UINT16 StatusCode = 0;  
  15.   
  16.         if(EsmTimeoutCounter == 0)  
  17.         {  
  18.             Status =  (UINT8)(nEcatStateTrans >> 4);  
  19.   
  20.   
  21.             /* ESM 超时*/  
  22.             switch(nEcatStateTrans)  
  23.             {  
  24.                 case INIT_2_PREOP:  
  25.                 case INIT_2_BOOT:  
  26.   
  27.   
  28. #if MAILBOX_SUPPORTED  
  29.                     if(!bApplEsmPending)  
  30.                         APPL_StopMailboxHandler();  
  31.   
  32.   
  33.                     MBX_StopMailboxHandler();  
  34. #endif  
  35.                     if(bLocalErrorFlag)  
  36.                     {  
  37.                         /*设置应用程序特殊的错误*/  
  38.                         StatusCode = u16LocalErrorCode;  
  39.                     }  
  40.                     else  
  41.                     {  
  42.                         /*设置非特殊的错误*/  
  43.                         StatusCode = ALSTATUSCODE_UNSPECIFIEDERROR;  
  44.                     }  
  45.                 break;  
  46.                 case PREOP_2_SAFEOP:  
  47.                     if(!bApplEsmPending)  
  48.                         APPL_StopInputHandler();  
  49.   
  50.   
  51.                     StopInputHandler();  
  52.                       
  53.                     if(bLocalErrorFlag)  
  54.                     {  
  55.                         /*设置应用程序的特殊错误*/  
  56.                         StatusCode = u16LocalErrorCode;  
  57.                     }  
  58.                     else  
  59.                     {  
  60.                         /*设置非特殊错误*/  
  61.                         StatusCode = ALSTATUSCODE_UNSPECIFIEDERROR;  
  62.                     }  
  63.                 break;  
  64.                 case SAFEOP_2_OP:  
  65. #if DC_SUPPORTED  
  66.                     if(bDcSyncActive)  
  67.                     {  
  68.                         /*SafeOP to OP 超时溢出检查,当应用状态码需要被写入*/  
  69.                         if(!bDcRunning)  
  70.                         {  
  71.                             /*没有Sync0信号被接受*/  
  72.                             StatusCode = ALSTATUSCODE_NOSYNCERROR;  
  73.                         }  
  74.                         else if(!bEcatFirstOutputsReceived)  
  75.                         {  
  76.                             /*没有过程数据被接受*/  
  77.                             StatusCode = ALSTATUSCODE_SMWATCHDOG;  
  78.                         }  
  79.                         else  
  80.                         {  
  81.                             /*Pll 没有使能*/  
  82.                             StatusCode = ALSTATUSCODE_DCPLLSYNCERROR;  
  83.                         }  
  84.                     }  
  85.                     else  
  86. #endif  
  87.                     {  
  88. #if !OP_PD_REQUIRED  
  89.                         /*设置有效的状态转换即使超时产生*/  
  90.                         Status = STATE_OP;  
  91.                         StatusCode = 0;  
  92.                         /* 从站是在可运行状态 */  
  93.                         bEcatOutputUpdateRunning = TRUE;  
  94. #else  
  95.                         StatusCode = ALSTATUSCODE_SMWATCHDOG;  
  96. #endif  
  97.                     }  
  98.   
  99.   
  100.                     /*停止操作在一个错误的转换*/  
  101.                     if(StatusCode != 0)  
  102.                     {  
  103.                         if(!bApplEsmPending)  
  104.                             APPL_StopOutputHandler();  
  105.   
  106.   
  107.                         StopOutputHandler();  
  108.                     }  
  109.                 break;  
  110.             }  
  111.         } //ESM timeout  
  112.         else  
  113.         {  
  114.             /*调用应用程序特殊的转换函数和如果完成转换的话,函数将返回0*/  
  115.             switch(nEcatStateTrans)  
  116.             {  
  117.                 case INIT_2_PREOP:  
  118.                 case INIT_2_BOOT:  
  119.                     if(bApplEsmPending)  
  120.                     {  
  121.                         bApplEsmPending = FALSE;  
  122. #if MAILBOX_SUPPORTED  
  123.                         /*APPL_StartMailboxHandler()需要被调用 */  
  124.                         result = APPL_StartMailboxHandler();  
  125.   
  126.   
  127.                         if(result == 0)  
  128.                         {  
  129.                             /*应用程序特殊的转换成功,设置激活的邮箱操作*/  
  130.                             bMbxRunning = TRUE;  
  131.                             Status =  (UINT8)(nEcatStateTrans & STATE_MASK);  
  132.                         }  
  133.                         else  
  134.                         {  
  135.                             /*应用程序特殊的转换失败。(在pending中,应用程序需要完成它的转换) 
  136.                             */  
  137.                            if(result != NOERROR_INWORK)  
  138.                             {  
  139.                                 APPL_StopMailboxHandler();  
  140.                                 MBX_StopMailboxHandler();  
  141.                             }  
  142.                         }  
  143. #endif  
  144.                     }  
  145.                 break;  
  146.                 case PREOP_2_SAFEOP:  
  147.                     if(bApplEsmPending)  
  148.                     {  
  149.                         bApplEsmPending = FALSE;  
  150.                         result = APPL_StartInputHandler(&u16ALEventMask);  
  151.                         if(result == 0)  
  152.                         {  
  153.                             bEcatInputUpdateRunning = TRUE;  
  154.                             Status = STATE_SAFEOP;  
  155.                         }  
  156.                         else  
  157.                         {  
  158.                             /*The application specific transition failed. 
  159.                             (In pending case the application need to complete the transition)*/  
  160.   
  161.   
  162.                             if(result != NOERROR_INWORK)  
  163.                             {  
  164.                                 APPL_StopInputHandler();  
  165.                                 StopInputHandler();  
  166.                             }  
  167.                         }  
  168.                     }  
  169.                 break;  
  170.                 case SAFEOP_2_OP:  
  171.                    if(bApplEsmPending)  
  172.                     {  
  173. #if DC_SUPPORTED  
  174.                         if(bDcSyncActive)  
  175.                         {  
  176.                             if(i16WaitForPllRunningTimeout > 0 && i16WaitForPllRunningTimeout <= i16WaitForPllRunningCnt)  
  177.                             {  
  178.                                 /*PLL队列的有效时间是200ms(由APPL_StartOutputHandler()函数设置) 
  179.                                 默认状态转换到OP状态 */  
  180.   
  181.   
  182.                                 i16WaitForPllRunningTimeout = 0;  
  183.                                 i16WaitForPllRunningCnt = 0;  
  184.   
  185.   
  186.                                 result = APPL_StartOutputHandler();  
  187.   
  188.   
  189.                                 if(result == 0)  
  190.                                 {  
  191.                                     /* 从站是在OPERATIONAL的状态 */  
  192.                                     bEcatOutputUpdateRunning = TRUE;  
  193.                                     Status = STATE_OP;  
  194.                                 }  
  195.                                 else  
  196.                                 {  
  197.                                     if(result != NOERROR_INWORK)  
  198.                                     {  
  199.                                         APPL_StopOutputHandler();  
  200.                                         StopOutputHandler();  
  201.                                     }  
  202.                                 }  
  203.                             }  
  204.                         }  
  205.                         else  
  206. #endif  
  207.                         {  
  208. #if OP_PD_REQUIRED  
  209.                             if(nPdOutputSize == 0 || bEcatFirstOutputsReceived)  
  210. #endif  
  211.                             {  
  212.                                 result = APPL_StartOutputHandler();  
  213.   
  214.   
  215.                                 if(result == 0)  
  216.                                 {  
  217.                                     /* Slave is OPERATIONAL */  
  218.                                     bEcatOutputUpdateRunning = TRUE;  
  219.                                     Status = STATE_OP;  
  220.                                 }  
  221.                                 else  
  222.                                 {  
  223.                                     if(result != NOERROR_INWORK)  
  224.                                     {  
  225.                                         APPL_StopOutputHandler();  
  226.                                         StopOutputHandler();  
  227.                                     }  
  228.                                 }  
  229.                             }  
  230.                         }         
  231.                     }               
  232.                 break;  
  233.             }//Switch - transition  
  234.         }  
  235.   
  236.   
  237.         if(Status != 0)  
  238.         {  
  239.             /*暂停状态转换停止=>写入AL的状态和状态码*/  
  240.             bEcatWaitForAlControlRes = FALSE;  
  241.   
  242.   
  243.             if(StatusCode != 0)  
  244.                 Status |= STATE_CHANGE;  
  245.   
  246.   
  247.             SetALStatus(Status,StatusCode);  
  248.         }  
  249.     }// Pending state transition (bEcatWaitForAlControlRes == true)  
  250. }  



[cpp]  view plain  copy
  1. /  
  2. /** 
  3.  \param alStatus        新的AL状态(写到寄存器0x130) 
  4.  \param alStatusCode    新的AL状态码(写到寄存器0x134) 
  5.  
  6.  \brief  这个函数改变EtherCAT ASIC芯片的状态到所求的状态 
  7. *////  
  8. void SetALStatus(UINT8 alStatus, UINT16 alStatusCode)  
  9. {  
  10.     UINT16 Value = alStatusCode;  
  11.   
  12.     /*更新所需要的全局状态变量*/  
  13.     if(nAlStatus != alStatus)  
  14.     {  
  15.         nAlStatus = alStatus;  
  16.     }  
  17.   
  18.         nAlStatus &= ~STATE_DEVID;  
  19.   
  20.     if (alStatusCode != 0xFFFF)  
  21.     {  
  22.         Value = SWAPWORD(Value);  
  23.   
  24.         HW_EscWriteWord(Value,ESC_AL_STATUS_CODE_OFFSET);  
  25.     }  
  26.   
  27.     Value = nAlStatus;  
  28.     Value = SWAPWORD(Value);  
  29.     HW_EscWriteWord(Value,ESC_AL_STATUS_OFFSET);  
  30.   
  31. #if LEDS_SUPPORTED || ESC_SUPPORT_ECAT_LED  
  32.     /*The Run LED state is set in Set LED Indication, only the Error LED blink code is set here*/  
  33.   
  34.     /*set Error blink code*/  
  35.     if(alStatusCode == 0x00 || !(alStatus & STATE_CHANGE))  
  36.     {  
  37.         u8EcatErrorLed = LED_OFF;  
  38.     }  
  39.     else if((alStatusCode == ALSTATUSCODE_NOSYNCERROR) ||  
  40.         (alStatusCode == ALSTATUSCODE_DCPLLSYNCERROR))  
  41.     {  
  42.         u8EcatErrorLed = LED_SINGLEFLASH;  
  43.     }  
  44.     else if((alStatusCode == ALSTATUSCODE_SMWATCHDOG))  
  45.     {  
  46. /* ECATCHANGE_START(V5.01) HW3*/  
  47.         u8EcatErrorLed = LED_DOUBLEFLASH;  
  48. /* ECATCHANGE_END(V5.01) HW3*/  
  49.     }  
  50.     else  
  51.     {  
  52.         u8EcatErrorLed = LED_BLINKING;  
  53.     }  
  54. #if ESC_SUPPORT_ECAT_LED  
  55.     u8EcatErrorLed |= LED_OVERRIDE;  
  56.   
  57. #if ESC_32BIT_ACCESS || ESC_16BIT_ACCESS  
  58.     /*The Run LED registers are also written in 16 or 32 Bit access => calculate value*/  
  59.     switch((alStatus & STATE_CHANGE))  
  60.     {  
  61.     case STATE_INIT:  
  62.         u8EcatRunLed = LED_OFF;  
  63.         break;  
  64.     case STATE_PREOP:  
  65.         u8EcatRunLed = LED_BLINKING;  
  66.         break;  
  67.     case STATE_SAFEOP:  
  68.         u8EcatRunLed = LED_SINGLEFLASH;  
  69.         break;  
  70.     case STATE_OP:  
  71.         u8EcatRunLed = LED_ON;  
  72.         break;  
  73.     case STATE_BOOT:  
  74.         u8EcatRunLed = LED_FLICKERING;  
  75.         break;  
  76.     }  
  77.   
  78.     u8EcatRunLed |= LED_OVERRIDE;  
  79.   
  80. #if ESC_32BIT_ACCESS  
  81.     {  
  82.     UINT32 TmpVar = 0;  
  83.     TmpVar = SWAPDWORD((((UINT32)u8EcatRunLed) | (((UINT32)u8EcatErrorLed)>>8)));  
  84.     HW_EscWriteDWord(TmpVar,ESC_RUN_LED_OVERRIDE);  
  85.     }  
  86. #else  
  87.     {  
  88.     UINT16 TmpVar = 0;  
  89.     TmpVar = SWAPWORD((((UINT16)u8EcatRunLed) | (((UINT16)u8EcatErrorLed)>>8)));  
  90.     HW_EscWriteWord(TmpVar,ESC_RUN_LED_OVERRIDE);  
  91.     }  
  92. #endif  
  93. #else  
  94.     HW_EscWriteByte(u8EcatErrorLed,ESC_ERROR_LED_OVERRIDE);  
  95. #endif //#if ESC_32BIT_ACCESS || ESC_16BIT_ACCESS  
  96. #endif // #if ESC_SUPPORT_ECAT_LED  
  97. #endif //#if LEDS_SUPPORTED || ESC_SUPPORT_ECAT_LED  
  98. }  
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值