1.4 LabWindows/CVI简单程序设计

本节具体介绍如何使用LabWindows/CVI 7.0集成开发环境来设计虚拟波形生成器的具体步骤和有关编程方法。

要求:设计能够产生正弦波、方波、三角波和随机信号的虚拟波形生成器,并显示波形。

1.4.1 工程文件的创建

当LabWindows/CVI 7.0成功地安装在计算机上后,双击桌面CVI的图标,出现如图1.19所示的运行窗口即为工程窗口。

图1.19 LabWindows/CVI的工程窗口

1.4.2 用户界面设计

在工程窗口中选择“File”→“New”→“User Interface(∗.uir)”创建一个用户界面文件,并打开用户界面编辑窗口,如图1.20所示。

图1.20 用户界面文件的创建

该文件中需包含1个仪器面板(ShiBoQi面板)和5个控件,如图1.21所示。其中包含2个按钮控件(Acquire控件和Quit控件),1个循环控件(Waveform Shape控件),1个颜色选择控件(Trace Color控件),1个显示控件(Waveform控件)。

图1.21 bxq.uir文件的用户界面编辑窗口

根据bxq.uir的设计,在新建的用户界面创建控件并修改控件的属性。

1. 创建控件

创建控件就是在仪器面板中添加控件的过程,具体过程如下。

1)仪器面板

在用户新建工程文件后,系统会自动建立一个仪器面板,如图1.22所示。

图1.22 加入仪器面板的用户界面编辑窗口

2)在仪器面板中加入控件

(1)加入命令控件“Creat”→“Command Button”→“Square Command Button”创建用于产生信号和关闭仪器的命令按钮,如图1.23所示。

图1.23 加入命令控件的用户界面编辑窗口

(2)加入循环控件“Creat”→“Ring”→“Vertical Pointer Slide”创建波形类型选择信号,如图1.24所示。

图1.24 加入循环控件的用户界面编辑窗口

(3)加入颜色选择控件“Creat”→“Numeric”→“Color Numeric”创建波形颜色选择数值控件,如图1.25所示。

图1.25 加入颜色选择控件的用户界面编辑窗口

(4)加入图形显示控件“Creat”→“Graph”→“Graph”创建图形显示控件,如图1.26所示。

图1.26 加入图形控件的用户界面编辑窗口

建立好的仪器面板如图1.27所示。

图1.27 建立好的仪器面板

2. 修改用户界面中各控件元素的属性

通过上述步骤建立的控件属性还没有设置,如命令按钮的显示文字为系统默认值“OK”,而要求显示的为“Acquire”和“Quit”。通过控件元素属性的设置,完成所要求的用户界面。

1)修改Panel的属性

双击“Untitled Panel”,弹出“Edit Panel”对话框,如图1.28所示。

图1.28 设置Panel属性的窗口

本例中,仪器面板需要设置的属性为标题文字的设置。在“Panel Title”属性框中输入“ShiBoQi”,这时,右边编辑窗口的标题随之而改变。设置完毕后,单击“OK”按钮,完成Panel控件的设置。

2)命令控件属性的设置

双击面板中的“OK”按钮,弹出如图1.29所示的“Edit Command Button”对话框。命令控件属性的设置包括控件名称、控件回调函数和控件标题属性的设置。

图1.29 设置命令控件Acquire属性的窗口

(1)控件名称的设置:在“Source Code Connection”栏内的控件名称“Constant Name”一栏中输入控件名称“ACQUIRE”,要求必须为大写字母。

(2)控件回调函数的设置:在“Source Code Connection”栏内的回调函数“Callback Function”一栏中输入回调函数名称“AcquireData”。

(3)控件标题属性的设置:在“Label Appearance”栏内的标题“Label”一栏中输入“Acquire”。

根据同样的方法可以设置命令控件Quit的属性,其属性设置窗口如图1.30所示。

图1.30 设置命令控件Quit属性的窗口

3)循环控件的属性设置

双击面板中的“Untitled Control”循环控件按钮,弹出如图1.31所示的“Edit Ring Slide”对话框。循环控件属性的设置包括控件名称、控件标题属性和控件默认标题的设置。

图1.31 设置循环控件Waveform Shape属性的窗口

(1)控件名称的设置:在“Source Code Connection”栏内的控件名称“Constant Name”一栏中输入控件名称“WFM”,要求必须为大写字母。

(2)控件标题属性的设置:在“Label Appearance”栏内的标题“Label”一栏中输入“Waveform Shape”。

(3)控件默认标题的设置:在“Control Settings”栏内的标题“Default Index”一栏中设置4个循环选项。方法:单击“Label/Value Pairs...”按钮,进入如图1.32所示的“Edit Label/Value Pairs”编辑窗口,在“Label”一栏中分别输入:“SINE”、“SQUARE”、“TRI⁃ANGLE”、“RANDOM”,在“Value”一栏中输入相对应的默认值:“0”、“1”、“2”、“3”,编辑完毕后,单击“OK”按钮,退出编辑状态,完成控件默认标题的设置。

图1.32 循环控件默认标题的设置窗口

4)颜色选择数值型控件属性的设置

双击面板中的“Untitled Control”循环控件按钮,弹出如图1.33所示的“Edit Color Nu⁃meric”对话框。数值控件Color Numeric属性的设置包括控件名称和控件标题属性设置。

图1.33 设置数值控件Color Numeric属性的窗口

(1)控件名称的设置:在“Source Code Connection”栏内的控件名称“Constant Name”一栏中输入控件名称“COLOR”,要求必须为大写字母。

(2)控件标题属性的设置:在“Label Appearance”栏内的标题“Label”一栏中输入“Trace Color”。

(3)控件初始颜色的设置:在窗口右半部分的“Quick Edit Window”中,操作“Trace Color”字符串下的颜色控制条,使其初始值设置为红色。

5)图形显示控件属性的设置

双击面板中的“Untitled Control”循环控件按钮,弹出如图1.34所示的“Edit Graph”对话框。图形控件Graph属性的设置包括控件名称和控件标题属性设置。

图1.34 设置图形控件Graph属性的窗口

(1)控件名称的设置:控件名称“Constant Name”设置采用系统默认值。

(2)控件标题属性的设置:在“Label Appearance”栏内的标题“Label”一栏中输入“Waveform”。

(3)控件外形属性的设置:在“Control Appearance”栏内的“Show Legend”选项取消。

6)将Untiled2.uir文件存盘

选择“File”→“Save As”将Untiled2.uir文件另存为bxq.uir。

1.4.3 生成源代码文件

在用户界面编辑窗口中,选择“Code”→“Generate”→“All Code”将显示如图1.35所示的对话框。

图1.35 生成源代码框架的对话框

在该用户对话框中有两栏需要进行选择。

(1)Select panels to load and display at startup:选择虚拟仪器开机时出现的面板,当只有一个面板时,不需要选择,系统默认该面板为开机面板。

(2)Select QuitUserInterface Callbacks:选择退出仪器时的回调函数名称,选择该栏表示当程序执行完选择的回调函数后,将结束程序,并关闭仪器。单击回调函数Shutdown,出现“√”,表示选中。

另外,从“Project Filename”一栏可以改变工程文件的路径,从“Souce Filename”一栏可以改变源文件的路径。

单击“OK”按钮后出现源文件的代码窗口,该窗口为自动生成的源代码框架,如图1.36所示。

图1.36 源代码框架窗口

在源代码框架窗口中,程序代码共有3个函数。

1. Main()函数

Main()函数它是程序的入口。它的功能是初始化程序,装载用户界面面板并显示。

2. CVICALLBACK AcquireData()函数

当单击仪器面板中“Acquire”按钮后,该函数信息被响应。

3. CVICALLBACK Shutdown()函数

当单击仪器面板中“Quit”按钮后,该函数信息被响应。

Main()与CVICALLBACK Shutdown()函数中的代码是计算机自动生成的,计算机只生成CVICALLBACK AcquireData()函数的框架,其内部响应信息的代码需要用户添加。

1.4.4 添加源代码

添加源代码可分为两部分:主程序段及其前缀部分和以CVICALLBACK为标志的控件回调函数部分。

1. 主程序段及其前缀部分

double datapoints [100];用于定义显示波形时变量的个数

2. 以CVICALLBACK为标志的控件回调函数部分

在本程序中需要添加CVICALLBACK AcquireData()函数的信息代码,完成波形的选择并绘制相关图形。完整的CVICALLBACK AcquireData()函数代码如下所示。

            int CVICALLBACK AcquireData(int panel,int control,int event,void ∗callbackData,int eventData1,int
            eventData2)
            {   int i;
                int trace color,shape;
                if(event==EVENT COMMIT){
                        GetCtrlVal(panelHandle,PANEL WFM,&shape);
                      switch(shape){
                        case 0:      /∗正弦波∗/
                          for(i=0;i<100;i++)
                          datapoints[i]=50 ∗ sin((((2∗3.1415926536)/100)∗ i))+50;
                          break;
                        case 1:      /∗方波∗/
                          for(i=0;i<33;i++)
                          datapoints[i]=33.0;
                          for(i=33;i<67;i++)
                          datapoints[i]=67.0;
                          for(i=67;i<100;i++)
                          datapoints[i]=33.0;
                          break;
                        case 2:      /∗三角波∗/
                          for(i=0;i<25;i++){
                          datapoints[i]=i∗4;
                          datapoints[i+25]=100-(i∗4);
                          datapoints[i+50]=i∗4;
                          datapoints[i+75]=100-(i∗4);
                        }
                          break;
                        case 3:      /∗随机数据∗/
                          for(i=0;i<100;i++)
                          datapoints[i]=rand()/32767.0 ∗100.0;
                          break;
                        }
                      GetCtrlVal(panelHandle,PANEL COLOR,&trace color);
                      DeleteGraphPlot(panelHandle,PANEL GRAPH,-1,1);
                      PlotY(panelHandle,PANEL GRAPH,datapoints,100,VAL DOUBLE,
                        VAL THIN LINE,VAL EMPTY SQUARE,VAL SOLID,1,trace color);
                  }
              return(0);
            }

在程序代码添加完毕后,在C文件的菜单栏选择保存。

1.4.5 程序的执行

选择“Run”→“Debug bxq dbg.exe”来运行该程序示例,运行结果如图1.37所示。

图1.37 虚拟波形生成器