往死里写——mainloop函数

void MainLoop(void)
{
        /* 当运行在FreeRun-Mode:  bEscIntEnabled = FALSE, bDcSyncActive = FALSE
           当运行在Synchron-Mode: bEscIntEnabled = TRUE, bDcSyncActive = FALSE
           当运行在DC-Mode:       bEscIntEnabled = FALSE, bDcSyncActive = TRUE */
        if ( (!bEscIntEnabled || !bEcatFirstOutputsReceived)     /* SM同步方式,但是没有SM事件接收 */
#if DC_SUPPORTED
          && !bDcSyncActive                                               /* DC同步方式 */
#endif
            )
        {
            /* 如果应用程序是运行在ECAT同步模式当中,函数ECAT_Application将会在ESC中断里面被调用(在mcihw.c和spihw.c) 在ECAT同步模式当中,它可以被另外得检查,如果SM事件被接受至少一次(bEcatFirstOutputReceived=1),否则,没有中断会产生和函数ECAT_Application将会在这里被调用(中断禁止,因为当执行ECAT_Application的时候,SM事件可以产生)*/
            if ( !bEscIntEnabled )
            {
                /* 应用程序正在运行在ECAT 自由运行模式,首先,我们需要检查是否有输出被接受 */
                UINT16 ALEvent = HW_GetALEventRegister();
                ALEvent = SWAPWORD(ALEvent);

                if ( ALEvent & PROCESS_OUTPUT_EVENT )
                {
                    /* 设置标志位给状态机处理 */
                    bEcatFirstOutputsReceived = TRUE;
#if !ESC_SM_WD_SUPPORTED
                    /* 重置看门狗计数器 */
                    EcatWdCounter = 0;
#endif
                    if ( bEcatOutputUpdateRunning )
                    {
                        /* 更新输出的状态量 */
                        PDO_OutputMapping();
                    }
                }
                else if ( nPdOutputSize == 0 )
                {
                    /* 如果没有输出被传输,当有输入被读,看门狗需要被重置 */
                    if ( ALEvent & PROCESS_INPUT_EVENT )
                    {
                        /* 输出被更新,设置标志位给看门狗检测 */
                        bEcatFirstOutputsReceived = TRUE;
#if !ESC_SM_WD_SUPPORTED
                        /* 重置看门狗的计数器 */
                        EcatWdCounter = 0;
#endif
                    }
                }
            }

#if AL_EVENT_ENABLED
            DISABLE_ESC_INT();
#endif
            ECAT_Application();
#if AL_EVENT_ENABLED
            ENABLE_ESC_INT();
#endif
        }

#if !ECAT_TIMER_INT
        /* 这里没有中断服务程序来处理硬件定时器,所以,检查定时器的寄存器看是否想要的周期已经过了*/
        {
            UINT32 CurTimer = HW_GetTimer();

            if(CurTimer>= ECAT_TIMER_INC_P_MS)
            {
                ECAT_CheckTimer();

                HW_ClearTimer();
            }
        }
#endif

        /* 调用EtherCAT函数 */
        ECAT_Main();

#if COE_SUPPORTED
        /* 调用低优先级的应用程序部分 */
        COE_Main();
#endif
        CheckIfEcatError();

#if CiA402_DEVICE
    if(bEcatInputUpdateRunning)
    {
        CiA402_StateMachine();//调用CIA402的处理机,来处理COE,这里没有用到
    }
#endif
}




void PDO_OutputMapping()
{

    HW_EscReadIsr(((MEM_ADDR *)aPdOutputData), nEscAddrOutputData, nPdOutputSize );

    APPL_OutputMapping((UINT16*) aPdOutputData);
}



/
/**
\param      指针指向输出处理数据

\brief    这个函数将拷贝输出从ESC内存到本地内存到硬件
*
void APPL_OutputMapping(Uint16* pData)
{
    Uint16 j = 0;
    Uint8 *pTmpData = (Uint8 *)pData;// 允许数据处理

    for (j = 0; j < sRxPDOassign.u16SubIndex0; j++)
    {
        switch (sRxPDOassign.aEntries[j])
        {
        /* RxPDO 2 */
        case 0x1601:
            sDOOutputs.LEDs = *pTmpData++;
            break;
        case 0x1602:
            sDO1Outputs.Count = *pTmpData++;
            sDO1Outputs.Cmd   = *pTmpData++;
            sDO1Outputs.MotorData = *pTmpData++;
            sDO1Outputs.MotorData |= (*pTmpData++ << 8);
            break;
        }
    }
}


void ECAT_Application(void)
{
#if CiA402_DEVICE
    /*轴的配置被写,在状态转换从PREOP到SAFEOP=>触发CiA402应用程序,如果设备是在SAFEOP或者OP状态
    (电机控制器的函数只有被触发,如果DC同步被激活和有效的运行模式被设置)*/
    if(bEcatInputUpdateRunning)
#endif
    {
        APPL_Application();
    }

    if ( bEcatInputUpdateRunning )
    {
        /* EtherCAT 从站是至少在SAFE-OPERATIONAL,更新输入 */
        PDO_InputMapping();
    }

}


/
/**
\brief    这个函数将被调用从同步的中断程序或者从mainloop当中,如果没有同步被支持
*
void APPL_Application(void)
{
    Uint8 LED; 					// 初始化测试数据
    static Uint8 prevState = 55;
    
    LED = sDOOutputs.LEDs;
    
    if(LED != prevState)
        set_led(LED);				//调用底层程序设置LED
    prevState = LED;
    appState = sDO1Outputs.Cmd;			// 设置应用程序的状态
    
    sDIInputs.switchs = (Uint8)Read_HVS2();
    if(appState == 0)
        appState = sDIInputs.switchs;//special mode to control app state by input switchs!
    sAI1Inputs.info1 = 0x12345678;
    sAI1Inputs.info2 = bsp_read_word(0x10);

}



void PDO_InputMapping()
{
    APPL_InputMapping((UINT16*)aPdInputData);
    HW_EscWriteIsr(((MEM_ADDR *) aPdInputData), nEscAddrInputData, nPdInputSize );
}


/
/**
\param      pData 指针指向输入过程数据
\brief      这个函数将会拷贝从本地内存到ESC内存到硬件
*
void APPL_InputMapping(Uint16* pData)
{
    Uint16 j = 0;
    Uint8 *pTmpData = (Uint8 *)pData;


   for (j = 0; j < sTxPDOassign.u16SubIndex0; j++)
   {
      switch (sTxPDOassign.aEntries[j])
      {
      /* TxPDO 1 */
      case 0x1A00:
         *pTmpData++ = sDIInputs.switchs;
         break;

      case 0x1A03: // 注意:可能是不对称的字节接近.
         *pTmpData++ = sAI1Inputs.info1 & 0xFF;
         *pTmpData++ = (sAI1Inputs.info1 & 0xFF00) >> 8;
         *pTmpData++ = (sAI1Inputs.info1 & 0xFF0000) >> 16;
         *pTmpData++ = (sAI1Inputs.info1 & 0xFF000000) >> 24;
         *pTmpData++ = sAI1Inputs.info2 & 0xFF;
         *pTmpData++ = (sAI1Inputs.info2 & 0xFF00) >> 8;
         break;
      }
   }
}


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,可以使用不同的GUI库来进行GUI设计。其中,tkinter是Python自带的标准GUI库,可以直接导入并使用。通过导入tkinter模块,可以创建一个简单的窗口。下面是一个示例代码: ```python from tkinter import * def embedded_function(): # 在这里编你的嵌入函数的代码 pass top = Tk() # 创建一个按钮,并将嵌入函数与按钮的点击事件绑定 button = Button(top, text="点击我", command=embedded_function) button.pack() top.mainloop() ``` 在这个示例中,我们创建了一个窗口,并在窗口中添加了一个按钮。当按钮被点击时,会执行嵌入函数`embedded_function()`。你可以在`embedded_function()`中编你想要执行的功能代码。 #### 引用[.reference_title] - *1* *3* [Python GUI 设计(一)———Tkinter窗口创建、组件布局](https://blog.csdn.net/lyx4949/article/details/123137002)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法](https://blog.csdn.net/weixin_39959298/article/details/111448250)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值