• LabWindows/CVI(二):基本代码框架函数说明


     1、主函数

    主函数是程序的入口
    包含:初始化运行库、装载用户面板、显示用户面板、删除面板、关闭运行时库等操作

    #include <cvirte.h>        
    #include <userint.h>
    #include "温度2.h"
    
    static int panelHandle;
    
    //主函数
    int main (int argc, char *argv[])
    {
        // 初始化CVI运行时库
        /**
          * InitCVIRTE函数:初始化CVI运行时库
          * 函数原型为:int InitCVIRTE(void *HInstance,char *Argv[],void *Reserved);
          * *HInstance:如果采用main作为主函数,则输入值必须为0
          * *Argv[]:指向调试时生成的可执行文件的文件名
          * *Reserved:保留参数,一般设置为0
          * int:返回值,返回程序初始化运行时库的状态,该数据类型为整型;
                1:运行成功        0:运行失败,可能出现的问题是内存溢出
          **/
        if (InitCVIRTE (0, argv, 0) == 0)                            
            return -1;    /* 若内存溢出,返回-1 */
            
        // 装载面板,返回面板句柄
        /**
          * LoadPanel函数:将用户界面文件载入内存中
          * 函数原型为:int LoadPanel(int Parent_Panel_Handle,char Filename[],int Panel_Resource_ID)
          * Parent_Panel_Handle:父面板句柄,此参数是面板常量名所指代的父面板。如果设置为0,则说明
                该面板就是处在最顶层的面板。
          * Filename[]:文件名,此参数设置的是被载入的用户界面文件的文件名
          * Panel_Resource_ID:面板常量名,此参数是在用户编辑界面文件中定义的常量名
          * int:返回值为面板句柄。设置了这个参数,在以后的函数调用中使用该面板句柄可以指代该面板。
                如果返回正值代表运行成功,返回负值代表运行失败。每个负值代表产生的一个错误类型码。
          **/
        if ((panelHandle = LoadPanel (0, "温度2.uir", PANEL)) < 0)
            
            return -1;
        
        //在屏幕上显示面板    函数原型为:int DisplayPanel(int Panel_Handle);
        DisplayPanel (panelHandle);
        
        //运行用户界面    函数原型为:int RunUserInterface(void);
        RunUserInterface ();
        
        //从内存中删除面板及其子面板,并在屏幕中清除    
        /**
          * 函数原型为:int DiscardPanel(int Panel_Handle);
          * Panel_Handle:面板句柄,此参数是设置所要删除的面板句柄
          **/
        DiscardPanel (panelHandle);
        //若程序成功退出,返回0
        return 0;
        
    }
    主函数

    2、回调函数

    回调函数(1)

    //回调函数,函数功能:当按下该按钮时,退出用户界面
    int CVICALLBACK Quit (int panel, int control, int event,
                          void *callbackData, int eventData1, int eventData2)
    {
        switch (event)
        {
            //控件响应的事件
            case EVENT_COMMIT:
                //在运行用户界面时,执行该函数会退出用户界面
                /**
                  * 函数原型为:int QuitUserInterface(int Return_Code);
                  * Return_Code:返回代码,一般设置为0
                  **/
                QuitUserInterface(0);
                break;
        }
        return 0;
    }
    //回调函数,函数功能:开关控件处于ON时,使LED点亮
    int CVICALLBACK Acquire (int panel, int control, int event,
                             void *callbackData, int eventData1, int eventData2)
    {
        static double max,min;
        static int max_index,min_index;
        int i,j,value;
        //定义信号采样数据点数组
        double datapoints[100];
        
        switch (event)
        {
            //控件响应的事件
            case EVENT_COMMIT:
                /**
                  * 获得控件的值 GetCtrlVal
                  * 函数原型为:int GetCtrlVal(int Panel_Handle,int Control_ID,void *Value);
                  * Panel_Handle:面板句柄,该项是在函数LoadPanel里设置的
                  * Control_ID:控件ID (面板名 + 控件名)
                  * *Value:控件的值,该数据类型与控件本身的数据类型一致
                  **/
                //获得开关控件的状态
                GetCtrlVal(panelHandle,PANEL_BINARYSWITCH,&value);
                //判断开头是否为"开"
                if(value == 1){
                /**
                  * 设置控件的属性值 SetCtrlVal
                  * 函数原型为:int SetCtrlVal(int Panel_Handle,int Control_ID,any type Value);
                  * GetCtrlVal函数Value填写的是变量的地址(需要加上取地址符"&");SetCtrlVal函数Value需要填写的是变量
                  **/
                    //点亮LED,即为状态1
                    SetCtrlVal(panelHandle,PANEL_LED,1);
                /**
                  * 设置控件属性 SetCtrlAttribute
                  * 函数原型为:int SetCtrlAttribute(int Panel_Handle,int Control_ID,int Control_Attribute,any type Attribute); 
                  **/
                    //设置LED的标题变为"开"
                    SetCtrlAttribute(panelHandle,PANEL_LED,ATTR_LABEL_TEXT,"");
                /**
                  * 获取控件属性值 GetCtrlAttribute
                  * 函数原型为:int GetCtrlAttribute(int Panel_Handle,int Control_ID,int Control_Attribute,void *Attribute_Value); 
                  **/
                    for(i = 0 ; i < 100 ; i++) {
                        //编写随机函数
                        datapoints[i] = 100*rand()/32767.0;
                        //延时0.01s
                        Delay(0.01);
                        //设置温度计控件的值
                        SetCtrlVal(panelHandle,PANEL_NUMERICTHERM,datapoints[i]);
                /**
                  * 逐点绘图 PlotStripChartPoint
                  * 函数原型为:int PlotStripChartPoint(int Panel_Handle,int Control_ID,double Y);
                  * Panel_Handle:控件所在的面板句柄
                  * Control_ID:控件ID
                  * double Y:Y轴上的数值
                  **/
                        //在控件 Strip Chart 中滚动显示数据
                        PlotStripChartPoint(panelHandle,PANEL_STRIPCHART,datapoints[i]);
                    }
                /**
                  * 输入数值的最大值和最小值 MaxMin1D 
                  * 函数原型为:AnalysisLibErrType MaxMin1D(const double Input_Array[],int Number_of_Elements,
                                                                  double *Maximum_Value,int *Maximum_Index,
                                                                  double *Minimum_Value,int *Minimum_Index);
                  * Input_Array[]:输入数组名        Number_of_Elements:输入数组元素的个数
                  * *Maximum_Value:输入数组的最大值    *Minimum_Value:输入数组中的最小值
                  * *Maximum_Index:输入数组中的最大值索引    *Minimum_Index:输入数组中的最小值索引
                  **/
                    //找出100个随机数中最大值和最小值
                    MaxMin1D(datapoints,100,&max,&max_index,&min,&min_index);
                    //将最大值最小值设置到控件中
                    SetCtrlVal(panelHandle,PANEL_NUMERIC,max);
                    SetCtrlVal(panelHandle,PANEL_NUMERIC_2,min);
                    //当数据产生完毕后,关闭"开始采样按钮"
                    SetCtrlVal(panelHandle,PANEL_BINARYSWITCH,0);
                    //当数据产生完毕后,关闭LED
                    SetCtrlVal(panelHandle,PANEL_LED,0);
                    //当数据产生完毕后,温度计控件归零
                    SetCtrlVal(panelHandle,PANEL_NUMERICTHERM,0.00);
                    //当数据产生完毕后,设置LED的标题为"关"
                    SetCtrlAttribute(panelHandle,PANEL_LED,ATTR_LABEL_TEXT,"");
                }
                else{
                    //关闭LED,即设置其值为0
                    SetCtrlVal(panelHandle,PANEL_LED,0);
                    //温度计控件值归零
                    SetCtrlVal(panelHandle,PANEL_NUMERICTHERM,0.00);
                    //设置LED的标题为“关”
                    SetCtrlAttribute(panelHandle,PANEL_LED,ATTR_LABEL_TEXT,"");
                }
                break;
        }
        return 0;
    }
    回调函数(2)
  • 相关阅读:
    Oracle SQL Developer 设置自动提示(完成设置)
    访问控制修饰符
    BigDecimal.valueOf
    Use try-with-resources
    python学习之字符编码
    python语法:
    python学习之环境搭建 输入输出
    C51存储的优化
    c51中的bit,SBIT
    关于IO模拟时序(SPI)的注意事项
  • 原文地址:https://www.cnblogs.com/lotuses/p/11425344.html
Copyright © 2020-2023  润新知