ethercat从站mainloop函数

简介: ethercat从站mainloop函数

void MainLoop(void) {

//=======bEscIntEnabled :同步模式    bEcatFirstOutputsReceived:接收和发送数据完成    bDcSyncActive:分布时钟同步====// //=============初始值FAULSE=================初始值FAULSE========================初始值FAULSE=========//

/* 当运行在FreeRun-Mode:  bEscIntEnabled = FALSE, bDcSyncActive = FALSE //未使能中断,自由运行模式
       当运行在Synchron-Mode: bEscIntEnabled = TRUE, bDcSyncActive = FALSE //同步模式使能,同步模式使用中断处理周期性数据
       当运行在DC-Mode:       bEscIntEnabled = FALSE, bDcSyncActive = TRUE */  //分布时钟模式使能*/
if ( (!bEscIntEnabled ||!bEcatFirstOutputsReceived)&& !bDcSyncActive)
  /*  非分布时钟同步模式,且非中断同步模式或SM2、SM3事件未完成 */
    { /* 如果应用程序是运行在ECAT同步模式当中,
      函数ECAT_Application将会在ESC中断里面被调用(在mcihw.c和spihw.c)
      在ECAT同步模式当中,它可以被另外得检查,
      如果SM事件被接受至少一次(bEcatFirstOutputReceived=1),
      否则,没有中断会产生和函数ECAT_Application将会在这里被调用
      (中断禁止,因为当执行ECAT_Application的时候,SM事件可以产生)*/  
        if ( !bEscIntEnabled )                                  /*自由运行模式,中断不使能,使用自有运行模式读取数据*/
        {
         /* 应用程序正在运行在ECAT 自由运行模式,首先,我们需要检查是否有输出被接受 */   
      /*因为其他应用事件也可能发生中断,所以先要判断*/
            UINT16 ALEvent = HW_GetALEventRegister();           /*读取AL状态,判断是否有输出数据,先读低8位后高8位*/
            ALEvent = SWAPWORD(ALEvent);                        /*将ALEvent高低8位互换位置,所以需要交换高低8位*/
            if ( ALEvent & PROCESS_OUTPUT_EVENT )               /*判断ESC是否有数据输出0x0400   检测0X0221地址内的SM2事件*/
            {
                      /*设置状态机的标志,输出或输入成功*/
                bEcatFirstOutputsReceived = TRUE; 
                if ( bEcatOutputUpdateRunning )                 /*检测是否处于运行状态,在startinputhangler中设置*/
                {
                    PDO_OutputMapping();                        /*接收主站发送下来的数值    主要为LED灯状态值*/
                }
            }
            else if ( nPdOutputSize == 0 )                      /*如果输出长度为0,且输入被读取时看门狗必须复位*/
            {
                if ( ALEvent & PROCESS_INPUT_EVENT )            /*判断ESC是否有数据输出0x0800   检测0X0221地址内的SM3事件*/
                {
                    bEcatFirstOutputsReceived = TRUE;           /*置输出接收成功标志位,备看门狗检测复位用*/
                }
            }
        }
        /* 无论自由运行模式还是同步运行模式,都要执行 ECAT_Application() */
        DISABLE_ESC_INT();                     /*关闭中断源INT1*/
        ECAT_Application();                    /*应用外设控制和当Becatinputupdatarunning=1 时执行SM3事件操作*/
        ENABLE_ESC_INT();                      /*使能中断源INT1*/
    }
    //下面因为报错就屏蔽掉了 
复制代码

//      /* 这里没有中断服务程序来处理硬件定时器,所以,检查定时器的寄存器看是否想要的周期已经过了*/

//        { //            UINT16 CurTimer = HW_GetTimer();       /定时器7没有配置中断,通过检测计数器值到达期望值后自动调用相关程序/

//            if(CurTimer>= ECAT_TIMER_INC_P_MS)     /配置的周期为0X0271        625ticks/ms   即每毫秒执行一次/ //            { //                ECAT_CheckTimer();                 /运行状态灯和错误灯情况设置,/

HW_ClearTimer();                   /*定时器7寄存器的计数器值清零*/
复制代码

//            } //        }

/* 调用EtherCAT函数实现非周期性的数据操作:状态机控制和邮箱数据操作*/
    ECAT_Main();                           
    /* 调用低优先级的应用程序部分 */  
复制代码

//        COE_Main(); CheckIfEcatError();// 检查通信和同步,如果发生了一个错误则更新AL状态/AL状态码

}



相关文章
|
4月前
|
Rust 监控 网络协议
EtherCAT主站IgH解析(一)--主站初始化、状态机与EtherCAT报文
本文介绍了IgH EtherCAT Master整体运行原理
372 0
EtherCAT主站IgH解析(一)--主站初始化、状态机与EtherCAT报文
|
4月前
|
Linux
Rockchip系列之LED状态灯 以太网收发数据包流程以及控制状态显示(2)
Rockchip系列之LED状态灯 以太网收发数据包流程以及控制状态显示(2)
57 1
详解CAN总线:CAN总线报文格式—遥控帧
CAN总线上传输的信息称为报文,当总线空闲时任何连接的单元都可以开始发送新的报文。
详解CAN总线:CAN总线报文格式—过载帧
CAN总线上传输的信息称为报文,当总线空闲时任何连接的单元都可以开始发送新的报文。
详解CAN总线:CAN总线报文格式—错误帧
CAN总线上传输的信息称为报文,当总线空闲时任何连接的单元都可以开始发送新的报文。
详解CAN总线:CAN总线报文格式—帧间隔
CAN总线上传输的信息称为报文,当总线空闲时任何连接的单元都可以开始发送新的报文。
详解CAN总线:标准数据帧和扩展数据帧
CAN协议可以接收和发送11位标准数据帧和29位扩展数据帧,CAN标准数据帧和扩展数据帧只是帧ID长度不同,以便可以扩展更多CAN节点。
Beckoff的EtherCAT从站代码架构解析
Beckoff的EtherCAT从站代码架构解析
|
C语言 Perl
西门子S7-1200的MODBUS通信如何组态,通信装载指令、主站设置指令、从站设置指令各参数的含义是什么
本篇我们来学习西门子S7-1200的MODBUS通信如何组态,通信装载指令、主站设置指令、从站设置指令各参数的含义是什么。
西门子S7-1200的MODBUS通信如何组态,通信装载指令、主站设置指令、从站设置指令各参数的含义是什么
二十六、链路层的设备
二十六、链路层的设备
二十六、链路层的设备