第一讲 虚拟仪器及其开发语言工具
学时分配:共32,2学时考试,4学时大作业,26学时共13讲 1.1什么是虚拟仪器? 一、引言
随着计算机技术、大规模集成电铬技木和通信技术的飞速发展,仪器技术领域发生了 巨大的变化,美国国家仪器公司(National Instruments, 简称NI)于20世纪80年代中期首先提出基于计算机技术的虚拟仪器的概念,把虚拟测试技术带入新的发展时期,随后研制和推出了基于多种总线系统的虚拟仪器。经过十几年的发展,虚拟仪器技术将高速发展的计算机技、电子技术、通信技术和测试技术结合起来,开创了个人计算机仪器时代,是测量仪器工 业发展的一个里程碑。
传统仪器:由电子电路+调节按钮组成,一旦仪器做好,功能很难改变。
1.1传统的示波器 1.2万用表
1.3频率计
虚拟仪器:虚拟仪器就是在通用计算机上加上一组软件和硬件,使用者在操作这台计算机时,就象是在操作一台他自己设计的专用电子仪器。
其优势在于可由用户自己定义通用仪器系统,且功能灵活,容易构建,因此应用广泛。用户可将各种计算机平台、硬件、软件和各种附备件结合起来,形成自己所需要的各种特定设备。可以是一台数字多用表,也可以是一台示波器,还有可能是一台信号源,或者它同时具有这些设备的所有功能甚至于更多的功能。
1
1.4虚拟仪器电表 1.5虚拟示波器
1.6虚拟温度测量仪
“虚拟”主要包含以下两方面的含义。 • 虚拟的虚拟仪器的面板
1、虚拟仪器面板上的各种“控件”与传统仪器面板上的各种“器件”所完成的功能是相同的。 如由各种开关、按键、显示器等实现仪器电源的“通”、“断”,被测信号“输入通道”、“放大倍数”等参数设置,测量结果的“数值显示”、“波形显示”等。
2、传统仪器面板上的器件都是实物,而且是用手动和触摸进行操作的,而虚拟仪器面板控件是外形与实物相像的图标,通、断、放大等对应着相应的软件程序。
3、这些控件已经设计好了,用户不必设计,只需选用代表该种软件程序的图形控件即可,由计算机的鼠标来对其进行操作。 二、虚拟仪器的组成结构
1、按照结构来说
虚拟仪器由仪器硬件平台和应用软件两大部分构成。
硬件平台由计算机+各种数据采集卡和总线仪器组成。虚拟仪器组成结构如1.7图所示。
2
1.7虚拟仪器组成结构
应用软件是利用虚拟仪器的软件开发工具,如LabWindows/CVI, LabVIEW等编程语言工具在计算机上编写的应用软件。
2、按照功能来说
如下图所示,虚拟仪器具有数据采集、数据分析和结果显示的功能,
3
图1.8虚拟仪器的内部功能划分
用户利用虚拟仪器的软件开发工具编写的应用软件具有数据采集、数据处理、数据分析、数据存储和显示输出等功能,是虚拟仪器的关键。 三、虚拟仪器的特点 1.2 Labwindows/CVI简介
虚拟仪器编程语言LabWindows/CVI是NI公司幵发的Measurement Studio软件组中的 一员。它是32位的面向计算机测控领域的虚拟仪器软件开发平台,可以在多操作系统下运 行。LabWindows/CVI是以ANSI C为核心的交互式虚拟仪器开发环境,它将功能强大的C 语为开发人员建立检测言与测控技术有机结合,具有灵活的交互式编程方法和丰富的库函数,系统、自动测试环境、数据釆集系统、过程监控系统等提供了理想的软件开发环境,是实现虚拟仪器及网络化仪器的快速途径。
使用LabWindows/CVI设计的应用程序可脱离LabWindows/CVI开发环境运行,并可以打包生成.msi安装文件。LabWindows/CVI主要采用事件驱动与回调函数方式。 一、 LabWindows/CVI的特点
1、与传统仪器相比,虚拟仪器有以下几个特点: (1)功能由用户自己定义;
(2)面向应用的系统结构,可方便地与网络外设、应用程序等连接; (3)展开图形操作界面,由计算机完成读数并分析处理; (4)数据可编辑、存储、打印;
(5)价格低廉(是传统仪器价格的五至十分之一?); (6)基于计算机技术开放的功能模块可构成多种仪器; (7)技术更新快(周期为1~2年);
(8)基于软件体系的结构,大大节省开发维护费用; (9)个人可以拥有一个实验室。
2、LabWindows/CVI作为一个优秀的软件幵发平台,和其他虚拟仪器开发工具相比,具有 如下特点。
1、交互式的程序幵发
LabWindows/CVI将源码编程、32位ANSI C编译、链接、调试及标准ANSI C库等集成在一个交互式开发平台中,釆用简单直观图形用户界面设计,利用函数面板输入函数的参数,釆用事件驱动方式和回调函数方式的编程技术,有效地提髙了工程设计的效率和可靠性。
4
2、功能强大的函数库
如接口函数库、信号处理函数库、Windows SDK等,利用这些函数库可轻松实现复杂的数据采集和仪器控制系统的开发。同时,LabWindows/CVI附加了各种功能的软件开发包,如数据库软件包、Internet软件包、小波分析软件包等,大大增强了LabWindows /CVI 的性能。
3、灵活的程序调试手段
LabWindows/CVI提供了单步执行、断点执行、过程跟踪、参数检查、运行时内存检查等多种调试手段。 4、高效的编程环境
LabWindows/CVI以其面向虚拟仪器的交互式幵发环境,满足了用户对软件不断变化的 要求,在产品设计中,可以快速创建、配置并显示测量。LabWindows/CVI可以自动生成代码、编译和链接,省去了手工编写,更有利于系统的开发。 5、开放式的框架结构
在LabWindows/CVI环境中,可以结合使用标准的ANSI C源文件、obj文件和动态链接库(DLL)。还可以将软件中的仪器驱动库与其他标准C编译器结合使用,无需更改开发工具。同时,可以在不同的工作小组之间共享函数模块和虚拟仪器程序。 6、集成式的开发环境
LabWindows/CVI是集成式的幵发环境,可用于创建基于DAQ、GPIB、PXI、VXI串口和以太网的虚拟仪器系统。这一开发方式结合了交互式、简单易用的开发方式与ANSI C代码的强大编写功能和灵活性。LabWindows/CVI中的交互式开发工具和函数库可以轻松实现自动化测试系统、实验室研发、数据釆集监视项目、验证测试和控制系统的设计。 二、 LabWindows/GVI 的应用范围
LabWindows/CVI主要应用在各种测试、控制、故障分析及信息处理软件的开发中,与 NI公司开发的另一个虚拟仪器开发工具LabView相比,其更适合中,大型复杂测试软件的开发。基于LabWindows/CVI设计的虚拟仪器,在无损检测、电力仪表系统、温控系统、流程控制系统、故障诊断和医疗等领域中发挥着重要作用,LabWindows/CVI已经成为测控领域最受欢迎的开发平台之一,并且已得到较为广泛的应用。 1.3 Labwindows/CVI开发环境
(软件安装略)
5
1.4、Labwindows/CVI运行环境 一、程序结构
测控软件一般包括:用户界面、程序控制、数据采集和数据分析4部分
图1.9虚拟仪器的程序结构
二、文件类型
*.cws: 工程组文件
*.prj: 工程文件 *.c: C源代码文件
*.fp: 函数库(函数数和函数面板)文件
*.uir: 用户界面资源文件 *.h :用户界面资源头文件 *.dll 动态链接库文件
*.lib: 动态链接库导入库文件,还可以是外部静态库模块文件
===============================================================================
*_dbg.exe: 调试状态执行文件 *.obj: 三、CVI的工作空间
1、工程目录区:包含当前工作空间中所有工程的目录,粗体的工程名表示该工程当前为激活状态,用户可以对该工程进行构建、调试和修改。
2、函数目录区:包括CVI的函数库和仪器库目录,双击目录中的函数名,即可打开相关的函数面板。
3、窗口区:在此区可以打开源代码编辑器、用户界面编辑器、函数面板编辑器,当打开某一窗口时,菜单栏和工具栏会随着编辑界面的不同而发生相应的改变。
4、输出区:包括编译错误、运行时错误和源代码错误信息窗口。
5、运行区:包括变量、内存、监视和堆栈窗口,可以在该窗口中编辑变量和观察程序运行状况。
6
目标文件 *.exe: 可执行文件
四、LabWindows/CVI中的对象编程
对象编程是LabWindows/CVI编程的核心概念。虚拟仪器的面板和面板中的控件都是对象。对象有两个基本元素:属性和事件。在编程时,就是通过对象的这两个元素来控制和操作对象的。
1、对象的属性:是反映对象特征的参数,如仪器面板中控件的大小、位置等等。可以通过属性对话框来设置属性。多数控件需要设置如下属性:
控件的常量名称 事件的响应函数名称 控件外观 文字标签 2、对象的事件和回调函数
每一个控件对象都有其相应的响应事件,如双击鼠标、拖动窗口、点击按钮等。在CVI
中,每个事件对应一个回调函数,当事件发生时,相应的回调函数被激活,由回调函数来完成控件相应的功能。
五、LabWindows/CVI的基本编程窗口
LabWindows/CVI开发平台是交互式集成开发平台,图形化用户界面。其编程环境主要由:源代码窗口、用户界面编辑窗口、函数面板三部分组成如图1.10所示。
图1.10
1、用户界面编辑窗口
用来创建、编辑GUI(用户界面)的面板、控件和菜单,并且设置各种属性,一般情况
下,一个用户界面至少要有一个面板,如图1.11所示
7
图1.11
在用户界面编辑窗口,右击鼠标将出现弹出式菜单,则弹出式菜单中包含创建面板和面板菜单的菜单项,如图1.12所示。
图1.12
当鼠标点击在面板背景上时,弹出式菜单将出现创建控件的菜单项。如图1.13所示。
8
图1.13
当鼠标点击控件上时,将出现生成和查看回调函数的菜单项,如图1.14所示。
图1.14
2、工作区窗口
工作区窗口包括:File、Edit、View、Create、Arrange、Code、Build、Run、Instrument、Library、Tools、Windows、Options、Help共14个菜单项。
File菜单。用于完成对工作空间文件、工程文件、C源代码文件、头文件、用户界面文件及函数面板文件的新建、打开、保存、另存为等功能,同时还具有保存全部文件、自动保存工作空间、设置当前工程、最近打开文件、退出环境的功能,如图1.15所示。
9
图1.15 用户界面窗口File菜单
Edit菜单。用于完成对工作空间的编辑、工程编辑、向当前工程添加文件、撤销操作、重复操作、剪切、复制、粘贴、删除/剪切/复制面板、面板编辑、菜单编辑等。如图1.16所示。
图1.16 用户界面窗口Edit菜单
View菜单。用于定制是否显示工程目录区、函数目录区、工具栏及窗口排列方式,对于不同的编辑窗口,菜单项会有所不同。在用户界面编辑窗口为当前激活窗口的状态下,其
10
菜单如图1.17所示。
图1.18 用户界面窗口View菜单
Creat菜单。用于创建面板、菜单、控件。
图1.19 用户界面窗口Creat菜单
Arrange菜单。用于控件位置、大小、对齐方式、控件叠放顺序的调节,能实现控件前后排序、标签居中、对齐控件的功能。
11
图1.20 用户界面窗口Arrange菜单
Code菜单。用于程序源代码的产生,选择所需的事件消息类型,查看控件的回调函数及事件设置。
图1.21 用户界面窗口Code菜单
Build菜单。用于完成相关的编译操作,进行编译文件、配置编译文件、配置编译类型、导入外部编译器、标记编译文件。
图1.22 用户界面窗口Build菜单
Run菜单。用于执行程序、调试程序、设置断点、单步执行、终止执行、设置错误的中断方式。
12
图 1.23 用户界面窗口Run菜单
Instrument菜单。是一个动态菜单,包含已载入的仪器驱动目录和载入、卸载及编辑仪器驱动文件的菜单项。
图1.24 用户界面窗口Instrument菜单
Library菜单。提供了丰富的函数库,用于完成用户界面函数、I/O接口,信号分析及各类驱动器函数面板的设置。
Tools菜单。用于创建、编辑ActiveX控制器与服务器、建立IVI驱动、源代码控制、UI代码转换以及定制菜单功能。
Window菜单。用于各种编辑窗口的排列、最小化、关闭等功能,同时可实现打开内存、变量、查看窗口来观察程序在运行时变量的状态参数。
13
图1.25 用户界面窗口Library菜单、Tools菜单、Window菜单
Options菜单。用于系统开发环境、编译参数、颜色、工具栏、字体等相关信息设置。 Help菜单。
14
图1.26用户界面窗口Options菜单、Help菜单
3、源代码编辑窗口
显示了程序的源代码,用于编辑C语言代码文件。其窗口菜单与用户界面窗口菜单相类
似,
图1.27 源代码编辑窗口
4、函数面板窗口
在CVI编程环境下,当在源程序某处插入标准函数时,只需找出所对应的函数库,在从
15
库中选择所需函数,便会弹出一个与之对应的函数面板,填入相应的参数,便可完成函数的插入。
在函数面上或面板的控件中右击鼠标,可以弹出相应的帮助窗口。有关于函数属性设置的详细说明。
图1.28函数面板窗口
在函数面板中常用到的工具栏中的几个按钮,如图1.29所示。
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ 图1.29 与函数面板相关的几个按钮
①→将函数插入到源代码文件的鼠标位置上;
②→声明变量名,按下该按钮会弹出声明变量对话框,如图1.30所示。
16
图1.30 声明变量窗口
③→选择目标文件,一般默认为当前工程中的源文件,如图1.31所示。
图1.31目标文件选择窗口
④→选择属性或UIR常量。将鼠标放置在需要添加控件常量名文本框内,选择该按钮,则弹出界面如图1.32所示。
⑤→选择变量,其弹出窗口会显示当前源文件中出现的所有变量,如图1.33所示。
图1.32属性或UIR常量选择窗口 图1.33变量选择窗口
17
⑥→显示当前函数树。 ⑦→显示前一函数面板窗口。 ⑧→显示后一函数面板窗口。 1.5 构建一个简单程序
通过本节学习,可以基本掌握CVI的基本编程方法,了解CVI编程的基础知识。 Labwindows/CVI编程的基本步骤如下:
1、建立工程文件,根据任务要求,确定程序的基本框架,包括各类控件所需的各类函数;
2、创建用户图形界面,根据要求,添加控件,设置控件属性及确定控件的回调函数; 3、编辑程序代码。由计算机自动生成程序代码及回调函数的基本框架,然后向源程序中添加程序代码,完成所实现的功能;
4、调试程序和生成可执行文件。 实验指导:
(1)实验任务
编写一个LabWindows/CVI程序,功能自定(可以是课堂或者书上的例子),程序有菜单或多种控件,用程序改变控件值或属性。
在本实验中,我们制作两数值型控件,当一控件值改变时,另一控件值也随之改变。同时,设计一命令控件,当点击它时即可退出用户接口界面。
此次实验中要用到的控件和回调函数如下表所示
常量名 PANEL NUMERICKNOB 面板 控件类型 主要属性 标题:实验一 label:输入 Numeric 回调函数:ChangedValueCB label:输出 Control Mode:Indicator label:__Quit 回调函数:QuitCB NUMERICSLIDE Numeric COMMANDBUTTON
Command Button
18
(2)实验步骤
步骤1:新建一工程,选择File→New→Project(*.prj),如图1-1所示。
图1-1 创建一工程
步骤2:新建一用户界面。从工程(Project)窗口中选择File→New→User Interface(*.uir),创建一个用户界面文件(*.uir),编辑器将自动产生一个空面板,如图1-2所示。
图1-2 用户界面编辑器窗口
步骤3: 在用户界面编辑器窗口中Untitled Panel 的灰色区域中单击鼠标右键,弹出如图1-3所示的控件选择的快捷菜单。在本实验中我们选择两数值型控件(Numeric)和一命令按钮(Command Button),其属性设置见图1-4~1-6。图1-7为面板属性编辑窗口,最后生成如图1-8所示界面。
19
图1-3 控件菜单
图1-4 “编辑数值控件1”对话框
20
图1-5 “编辑数值型控件2”对话框
图1-6 “编辑命令按钮”对话框
21
图1-7 面板属性编辑窗口
图1-8 最终用户界面
选择菜单File →Save a11.uir,将用户界面文件保存为“ex1.uir”。
步骤4:用代码生成器生成程序框架。选择Code→Generate→All Code,显示如图1-9所
22
示的生成所有代码对话框。
图1-9 生成所有代码对话框
首先必须确定程序启动时要显示的面板。对本实验来说,在.uir文件里只有一个面板。选择该面板作为程序启动时首先显示的面板。
此对话框下部分显示.uir 文件里的回调函数列表。在面板的属性中已经设置QuitCB作为程序终止执行的函数,其旁边出现一个“√”号。
选择OK 按钮,触发代码生成器建立程序源代码,如图1-10所示。 在源代码窗口里选择File→Save,以文件名ex1.c保存源文件。
23
图1-10 程序源代码
步骤5:使用函数面板和函数库开发ChangeValueCB回调函数。
把光标置于ChangeValueCB函数的case语句中,然后选择Library→User Interface Library→Controls/Graphs/Strip Charts….→General Function→Get Control Value,弹出如图1-11所示的Get Control Value函数面板。在面板的控件里输入如图1-11所示的值。在面板的灰色地带点击右键,可获得函数的说明文档。
在源代码里插入函数Get Control Value前,必须声明变量value。选择Code→Declare Variable,并选中复选框Add declaration to current block in target file “ex1.c”,这样将在源代码当前段插入一行代码声明回调函数ChangeValueCB里的变量value。
选择Code→Insert Function Call,将函数Get Control Value 插入源代码窗口光标所在位置,关闭函数Get Control Value面板,可以看到函数Get Control Value 的调用出现在源代码的case EVENT_COMMIT语句后。 选择
Library→Uer Interface Library→Controls/Graphs/Strip
24
Charts….→General
Function→Set Control Value,在函数面板各控件里输入如图1-12所示信息。 选择Code→Insert Function Call,将函数 Set Control Value 插入源代码。 最后所生成代码如图1-13 所示。
图1-11 Get Control Value函数面板
25
图 1-13 最终代码
步骤6:保存并运行程序。选择Run→Debug ex1_dbg.exe,开始运行程序。 步骤7:
把回调函数ChangeValueCB中的EVENT_COMMIT 事件改为EVENT_VAL_CHANGED,保存后运行程序,观察效果有什么不同。
26