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 虚拟波形生成器