標籤:
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狀態代碼}
ethercat從站mainloop函數