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;
}
}
}
[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;
}
}
}
相关文章推荐
- Log4j.properties配置详解
- 五个知识体系之-SQL学习-第四天
- 2.7、Android Studio使用翻译编辑器本地化UI
- 2.7、Android Studio使用翻译编辑器本地化UI
- iOSview整体上移下移(点击键盘)
- 使用Apk动态加载框架(dynamic-load-apk)进行插件开发之环境搭建篇
- 操作系统精髓与设计原理(原书第6版)——学习笔记(1)
- lua 读取lua文件
- 总结
- 三个基本设计模式
- Python基础学习代码之函数和函数式编程
- cordova android (一)
- UILongPressGestureRecognizer长按手势
- 拦截导弹=最小路径覆盖+DP+水
- 类的 与自定义事件
- iOS 检查本地是否存在某个文件
- 《C++ Primer Plus》学习笔记——C++程序创建到运行的整个过程
- Python2与Python3的区别(五):range
- 地鼠的困境 最大匹配
- android -解压和压缩zip