EtherCAT状态转换

[cpp]  view plain  copy
  1. /  
  2. /**  
  3.  \param    alStatus: 所需的状态  
  4.  \param    alStatusCode: 应用层状态寄存器的值  
  5.    
  6.  \brief   如果所需要的状态比实际状态要低,这个函数改变EtherCAT从站的状态,否则错误条件将会被重置;做一些出错处理和状态处理  
[cpp]  view plain  copy
  1. *  
  2.   
  3. void ECAT_StateChange(UINT8 alStatus, UINT16 alStatusCode)  
  4. {  
  5.     UINT8 Status = alStatus;  
  6.   
  7.     if(bEcatWaitForAlControlRes)  
  8.     {  
  9.         /*状态转换正被暂停*/  
  10.   
  11.         if(bApplEsmPending)  
  12.         {  
  13.             /*协议栈控制状态的转换,如果ESM超时的本地错误*/  
  14.             if(alStatusCode != 0)  
  15.             {  
  16.                 bLocalErrorFlag = TRUE;  
  17.                 u16LocalErrorCode = alStatusCode;  
  18.                 EsmTimeoutCounter = 0;  
  19.             }  
  20.         }  
  21.         else  
  22.         {  
  23.             /*完成状态的转换*/  
  24.   
  25.             if(alStatusCode != 0)  
  26.             {  
  27.                 bLocalErrorFlag = TRUE;  
  28.                 u16LocalErrorCode = alStatusCode;  
  29.   
  30.                 /*状态转换失败因为本地的应用程序问题*/  
  31.                 switch(nEcatStateTrans)  
  32.                 {  
  33.                     case INIT_2_PREOP:  
  34.                     case INIT_2_BOOT:  
  35.                           APPL_StopMailboxHandler();  
  36.                           MBX_StopMailboxHandler();  
  37.                     break;  
  38.                     case PREOP_2_SAFEOP:  
  39.                           APPL_StopInputHandler();  
  40.                           StopInputHandler();  
  41.                     break;  
  42.                     case SAFEOP_2_OP:  
  43.                           APPL_StopOutputHandler();  
  44.                           StopOutputHandler();  
  45.                     break;  
  46.                 }  
  47.   
  48.                 /*如果一个失败的状态转换 */  
  49.                 Status =  (UINT8)(nEcatStateTrans >> 4);  
  50.             }  
  51.             else  
  52.             {  
  53.                 /*状态转换成功*/  
  54.                    
  55.                 switch(nEcatStateTrans)  
  56.                 {  
  57. #if MAILBOX_SUPPORTED  
  58.                     case INIT_2_PREOP:  
  59.                     case INIT_2_BOOT:  
  60.                         bMbxRunning = TRUE;  
  61.                     break;  
  62. #endif  
  63.                     case PREOP_2_SAFEOP:  
  64.                         bEcatInputUpdateRunning = TRUE;  
  65.                     break;  
  66.                     case SAFEOP_2_OP:  
  67.                           bEcatOutputUpdateRunning = TRUE;  
  68.                     break;  
  69.                 }  
  70.   
  71.                 /*如果一个错误的状态转换 */  
  72.                 Status =  (UINT8)(nEcatStateTrans & STATE_MASK);  
  73.             }  
  74.                 /*推迟状态转换完成,写入AL状态和AL状态码*/  
  75.                 bEcatWaitForAlControlRes = FALSE;  
  76.   
  77.                 if(alStatusCode != 0)  
  78.                     Status |= STATE_CHANGE;  
  79.   
  80.                 SetALStatus(Status,alStatusCode);  
  81.   
  82.         }//状态转换需要在本地应用程序中被完成   
  83.     }//状态转换推迟  
  84.     else  
  85.     {  
  86.         if ( alStatusCode != 0 )  
  87.         {  
  88.             /* 本地错误发生,如果有需要,我们改变状态 */  
  89.             bLocalErrorFlag = TRUE;  
  90.             u16LocalErrorCode = alStatusCode;  
  91.       
  92.             if ( (alStatus & STATE_MASK) < (nAlStatus & STATE_MASK) )  
  93.             {  
  94.                 AL_ControlInd(alStatus, alStatusCode);  
  95.             }  
  96.         }  
  97.         else if (bLocalErrorFlag)  
  98.         {  
  99.             /*一个本地的错误发生 */  
  100.             if ( (nAlStatus & STATE_MASK) == (STATE_SAFEOP | STATE_OP) )  
  101.             {  
  102.                 if(nPdOutputSize > 0)  
  103.                 {  
  104.                     /* 我们需要使能输出过程数据SM(默认是SM2),因为它被禁止,当转换回去SAFE-OP状态 
  105.                      */  
  106.                     HW_EnableSyncManChannel(PROCESS_DATA_OUT);  
  107.                 }  
  108.                 else if (nPdInputSize > 0)  
  109.                 {  
  110.                     /* 我们需要使能输入过程数据SM(默认是SM3),因为它可以被禁止当转换回去SAFE-OP状态的时候 */  
  111.                     HW_EnableSyncManChannel(PROCESS_DATA_IN);  
  112.                 }  
  113.             }  
  114.             bLocalErrorFlag = FALSE;  
  115.             u16LocalErrorCode = 0x00;  
  116.         }  
  117.     }  
  118. }  
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EtherCAT通信状态判断是通过监测EtherCAT网络中各个节点的通信情况来确定的。EtherCAT是一种高性能和实时性的工业以太网通信协议,用于实现工业自动化系统各个节点之间的数据交换和通信。 首先,判断EtherCAT通信状态可以通过检查网络中的EtherCAT从站数量和状态。每个EtherCAT从站都有一个状态字,通过读取该状态字可以判断从站的通信状态。如果从站的状态字显示正常,表示该从站与主站之间的通信正常。如果从站的状态字显示异常或错误,表示从站与主站之间存在通信问题。 其次,EtherCAT通信状态判断还可以通过检测网络中的传输延迟和通信速率来确定。传输延迟是指数据从主站传输到从站所需的时间,通信速率是指数据在通信过程中的传输速率。如果传输延迟超过设定的阈值或通信速率低于期望值,表示通信状态不正常。 此外,EtherCAT通信状态判断还可以通过检测网络中的错误帧数量和重发帧数量来确定。错误帧数量表示在通信过程中发生的错误数据帧的数量,重发帧数量表示需要重发的数据帧数量。如果错误帧数量和重发帧数量超过一定限制,表示通信状态存在问题。 最后,可以通过监测网络中的通信负载和带宽利用率来进行EtherCAT通信状态的判断。通信负载是指网络中的数据交换量,带宽利用率是指网络中实际使用的带宽占总带宽的比例。如果通信负载过高或带宽利用率超过设定的阈值,表示通信状态不佳。 综上所述,通过综合考虑EtherCAT从站的状态、传输延迟、通信速率、错误帧和重发帧数量、通信负载和带宽利用率等因素,可以判断EtherCAT通信状态是否正常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值