LabVIEW实践之路第一、二章(序、正文32页_第1页
LabVIEW实践之路第一、二章(序、正文32页_第2页
LabVIEW实践之路第一、二章(序、正文32页_第3页
LabVIEW实践之路第一、二章(序、正文32页_第4页
LabVIEW实践之路第一、二章(序、正文32页_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、LabVIEW实践之路、北京工业大学 先进制造技术实验室2010年12月代码与工具(代序)IT行业的发展是有目共睹的,越来越多的年轻人加入到这一领域,对于大部分人来说,编程序、写代码成了每天要面对的。LabVIEW实践之路的内容也和程序开发有关,但不仅仅是编程,而是传递一种掌握工具、解决问题的思想。同样,所有的开发语言也都是实现功能或系统,满足需求的工具,如果只知coding而忘记了其工具属性,只知追求编程技巧忘记了功能的实现,那显然不是各种开发语言产生的目的。对于LabVIEW来说,它有其自身的特点和应用范围,有其独特的语言构架、开发环境以及设计原则等。了解掌握这些内容当然很重要,但同样重要

2、的是把LabVIEW、虚拟仪器当做解决问题的工具,用最适合、最高效的投入获得令人满意的结果。虚拟仪器不只有LabVIEW,就像是操作系统不只有Windows;但LabVIEW是虚拟仪器开发环境的霸主,正如Windows在操作系统中的地位。在校的学生进入LabVIEW的天地,根据应用的不同许多相关知识需要了解,因为LabVIEW最拿手的测试测量和自动化领域绝对是一个“知识密集”领域,解决问题的同时学习一些基础理论和应用技术对将来的个人发展是不无裨益的。最后,学习本身就是一种苦中作乐的事情,学习LabVIEW也是如此。希望本教程能够让学习的过程少一些弯路,多一些愉悦,尤其是解决工程问题的快乐。PS

3、:意见、交流信箱:santtoy2010年底于北京工业大学 说明:本教程不限制无商业目的的网上分发、复制、传播,如果涉及商业使用或学术引用,请先征得同意。 第一章 LabVIEW起步:做应该做的人们提到LabVIEW的时候通常前面会加上“虚拟仪器”这个单词,这在一个侧面反映了LabVIEW的应用特点,那么好的,我们来了解一下什么是虚拟仪器,以及它与LabVIEW之间是什么关系。下图来自虚拟仪器的领导厂商,也是LabVIEW的“东家”,美国国家仪器有限公司。两张图的区别主要在几个方面: a) 传统测试仪器 b) 虚拟仪器图1.1 传统测试仪器和虚拟仪器 虚拟仪器由用户定义,而传统仪器则功能固定且

4、由厂商定义。 每一个虚拟仪器系统都由两部分组成软件和硬件。对于当前的测量任务,虚拟仪器系统的价格与具有相似功能的传统仪器相差无几,甚至比它少很多倍。由于虚拟仪器在测量任务需要改变时具有更大的灵活性,因而随着使用时间的延长,通过开发软件来增加新的功能以满足更多测试要求,节省的成本也不断累计。 传统仪器把所有软件和测量电路封装在一起,利用仪器前面板为用户提供一组有限的功能。而虚拟仪器系统提供的则是完成测量或控制任务所需的所有软件和硬件设备,功能完全由用户自定义。 利用虚拟仪器技术,工程师和科学家们还可以使用高效且功能强大的软件来自定义采集、分析、存储、共享和显示功能。简单的说,虚拟仪器的特点是“以

5、软代硬,软硬结合,无缝集成,高度模块化和高度扩展性”。LabVIEW就是其中的虚拟仪器软件开发环境的佼佼者,用来进行快速开发的集成开发环境(Integrated Development Environment,IDE)。当然,LabVIEW并不是只能依附于相关的硬件才能使用,诸如科学计算、数字信号分析处理、数字图像处理、系统仿真等都是它的拿手好戏。必须清楚一件事,“LabVIEW不是一种一般意义上的通用编程语言,但它能用来开发各种通用应用程序”。也就是说,在测试测量等领域LabVIEW可以同硬件结合大展身手,但如果只想开发个计算器程序,编一个音乐播放器,或是开发邮件客户端等等,LabVIEW也

6、是可以胜任或解决一般需求的,当然可能在程序运行速度及体积大小等方面同JAVA、C#、C/C+、VB等有差距。不信可以看一下,用LabVIEW开发的Flash播放器,以及超级玛丽的Demo。不过,这些东西主要还是用来练手的,如果学习LabVIEW的目的就是实现这种程序的开发,那就有点“不务正业”了。 图1.2 Flash播放器 图1.3 超级玛丽Demo1.1 第一个LabVIEW程序:从解一元二次方程开始LabVIEW开发环境的安装就不多费笔墨了,现在就启动LabVIEW,开始掌握工具之旅。初中数学我们就知道,一元二次方程的解可以表示为。那时候没少让大家解方程,现在就用LabVIEW编程来解。

7、LabVIEW里面开发的程序单元被称作VI(Virtual Instruments, 虚拟仪器),文件的扩展名是 .vi ,就像是用c语言开发的 .c 文件或C+开发的 .cpp 文件等。当然,现在LabVIEW开发环境下还包括其它的程序组织类型,如工程(.lvproj)、类(.lvclass)、模板(.vit)、库(.llb)。这些类型有的是为了让你更好的组织开发工作,有的是为了让你获得更高效、复用性更好的程序。我们在前几章将围绕 .vi 文件进行学习,毕竟这是整个LabVIEW开发的核心。建立 .vi 文件可以在LabVIEW启动后选择“新建VI”(如图1.4所示),也可以在开发环境下在文

8、件菜单里选择“新建VI”。图1.4 新建VI一个默认文件名的vi文件将被建立,如图1.5所示,VI开发环境中常用模块包括以下几个主要部分:前面板、程序框图、工具快捷选板、控件快捷选板(前面板用)、函数快捷选板(程序框图用)等。其中前面板主要进行界面设计,类似于VB、VC等开发环境中的人机界面开发环境;而程序框图则类似于其他编程语言的代码编辑器,当然,LabVIEW是通过图形化的拖放来完成“代码”的生成。好的,我们就开始在前面板和程序框图中挥洒创意,实现功能了!当然,先把一元二次方程解了图1.5 VI程序开发界面 功能分析:程序的要求很简单,就是一个算法问题。为了尽快展现我们的程序,像二次项系数

9、是否为0等问题我们先不考虑,程序就是一个三个浮点输入(a, b, c),两个浮点输出(x1, x2)的算法,涉及加、减、乘、除、平方、开方以及取负等运算。 前面板设计:根据算法,放置三个数值输入控件和两个数值显示控件(如图1.6(a)所示)。方法很简单,在控件快捷选板中,找到新式数值栏,用左键将数值输入控件和数值显示控件拖入前面板即可,需要几个拖几个。当然,通常默认的控件标签名称不一定符合我们的要求,那么双击文字(或在工具快捷选板中选择文本编辑后,再单击控件的文字标签)就能够输入新的名称,如图1.6(b)所示。OK,界面完成了,虽然有一点简陋,不过没关系,后面我们会学习多种方法作出让人赞叹的程

10、序界面。 (a)(b)图1.6 前面板控件的放置 我们点击一下程序框图切换过去看一下,五个图标也出现在程序框图中,而且标签和前面板的控件一一对应。没错,这就是我们在前面板放置的控件,如果仔细观察一下,会发现每一个图标上都会有DBL的字样,这说明我们放置的输入输出控件默认是双精度浮点数的,以后再介绍数据类型,接下来就要在框图中编写算法了!图1.7 框图程序中的输入输出 在框图中编写算法要用到函数选板,如果没有出来,在查看菜单里点击一下(如图1.8所示)。图1.8 程序框图的函数选板本程序用到了加、减、乘、除、平方、开方等运算,我们可以在数值选板中找到它们,如图1.9所示。LabVIEW将各函数按

11、照类别排放,只要稍加熟悉,便能快速找到所需的子VI。图1.9 数值函数选板 接下来就根据算法开始在框图程序完成连线了,也就是“写代码”。通常LabVIEW各子VI左侧连线端为输入,右侧为输出,当你从工具选板中选中“进行连线”,即使用连线工具后,鼠标形式变换成为连线样式。将其放置于子VI左侧或右侧的对应位置时,开发环境便会自动显示连线端及其名称。如图1.10所示。当然通过点击Tab键LabVIEW能自动为您切换工具箱中的定位选择工具、连线工具、文本工具等。 图1.10 连线工具及使用框图“编码”很简单,就是在变量/常量/VI的输入输出间连线:在输出/输入连线端按下鼠标左键后拖动到需要连接的输入/

12、输出连线端,一条颜色、形状各异的线出现了,这就是你写下的代码。线的颜色、形状、粗细等标识者传递的数据类型,以后你会慢慢了解的。通常编写程序时,尽量让你的程序从左向右执行,也就是连线时若果上一个输出连接到下一个输入,那么前面的输出应置于框图左边,而后面的输入置于右边。按照上面的方法,我们很容易就能够将解一元二次方程的算法实现,看下面的框图1.11,是不是都能够理解呢?图1.11 解一元二次方程的程序框图 框图程序完成后,前面板上的输入输出之间就通过我们的算法联系起来了。细心的读者可能会观察到:不管是前面板还是程序框图的快捷按钮栏,有一个按钮由变为。恭喜你,程序运行按钮由无法执行变为了可以执行,点

13、击运行按钮就可以执行我们的程序了-当然,我们先把需要解的方程的系数填入对应的输入。图1.12 运行程序结果如上图1.12所示,我们解了一个方程,结果是,看输出吧,呵呵。和的变化体现出了LabVIEW实时编译的特点,即不需要你去点击某一个编译按钮,只要程序已经到了能够运行的程度,那就会出现在你的眼前。当然,能够运行不代表你的程序已经正确完成了,只是说明了框图程序里没有逻辑错误而已。不信你看看,一个空的程序照样是有的。小结虚拟仪器程序设计同主流的程序设计语言有很大不同,“图形化编程”、“G语言”不是吹出来的,用好LabVIEW的关键问题之一就是适应编程习惯。前面板的拖放很像VB、Delphi、VC

14、/BCB、JAVA(NetBeans等)集成开发环境中截面设计,拖放即可;主要区别在于“代码”的生成,依靠连线为主的虚拟仪器确实很有特点。有两点必须现在就指出:第一是LabVIEW上手并不难,在一些领域如测试、信号处理、数值算法等等开发一些实用系统也比较擅长,但要想成为高手,能够实现良好的程序结构、便利的人机交互、复杂的功能,你要花费的力气不比学好任何一门语言少。如今大部分学术论文上充斥的某某虚拟仪器开发的系统类似于小儿科的玩具,只能停留在那种文章里。第二是LabVIEW有优点和缺点,这一点必须一开始就清楚。如果你想学习LabVIEW成为数据库系统开发的高手、网络系统开发的高手,我劝你还是死了

15、这条心的,因为这种系统即使出现也不会有太大价值。另外,程序设计都是相通的,学习LabVIEW也无法绕过软件工程等等能力的培养,比如不会做需求分析就没法实现良好的软件系统。但如果只是想解决一些LabVIEW所擅长解决的小问题(某些时候可能是大问题),那你会发现学习、开发的效率是相当的高。本教程使用的是LabVIEW8.2 中文版,好多朋友可能习惯于使用各版本的英文版,对此表示严重支持!但如果刚要开始学LabVIEW的小盆友,无疑选择中文版更容易上手。1.2 从控件选板和工具选板看LabVIEW的强项现在我们就来看看LabVIEW开发环境给我们提供了哪些前面板控件、框图程序常量或子VI(即能直接拿

16、来用的LabVIEW子程序)。1.2.1 LabVIEW前面板控件建立VI后,在“查看”菜单选择“控件选板”,就能够调出前面板控件选板。当然,如果你嫌它烦不想老在眼前晃,可以关掉它,使用时只要在VI的前面板区域点击右键就可以了。如右图1.13所示,前面板的各种控件以分类(图标+文字)来表示。如果看到右上角有一黑色三角形,那说明这是一个空间集合,点开后会有该类的各种控件。 图1.13 前面板控件以下我们就来看一下常用的LabVIEW新式前面板控件(所谓新式指有点3D风格的控件,是和原来老版本的空间风格不同的。有的小盆友喜欢老版本的风格,那在“经典”一类中还能找到。另外我比较喜欢“系统”风格的控件

17、,主要是设计的前面板同常用的Windows界面非常统一)。 数值选板里面有各种输入输出为数字的控件,如数值、时间、进度条、颜色等等。常用的各数值输入/输出控件均可以选择各种表示法,如各种整型、浮点型等等,稍后会具体介绍。 布尔选板里面有各种输入输出为布尔量的控件,如按钮(按下/弹起)、开关(开/关)、指示灯(亮/不亮)、选择框(选中/未选中)等,这些控件只有两种状态:真和假,否则就不是布尔量了(当前切换方式有好多种)。 说道字符串和路径控件,你是否经常会碰到Windows程序弹出的各种对话框让你输入某些信息?是否用过选中磁盘上的某个文件的按钮?没错,字符串和路径控件就是干这个用的。 数组、矩阵

18、和簇比较有特点。数组控件用来直接从前面板输入/输出各种维数的数组;矩阵和它比较类似;而簇呢,则同C语言中的结构体很像,将各种你需要的数据类型组成特定的数据格式;而错误输入/输出则是一种特定格式的簇,专门用来进行LabVIEW程序错误信息的输入/输出显示。 这里面都是Windows编程经常用到的,包括列表框、表格、树形结构控件等等。 图形控件是学习LabVIEW不可不会的。它包括波形显示的各种二维、三维图表、图片控件以及多种专用图形控件,需要用到DAQ的小盆友们肯定要大笑了。不得不说的是,LabVIEW提供的三维图表、图形控件应该都是Windows的ActiveX控件,用起来非常不爽,个人感觉。

19、 下拉列表与枚举控件是Windows编程中常用的人机交互控件,LabVIEW也为你想到了,不过可别报太大希望,毕竟LabVIEW的本行不在这儿,但一般的功能也基本有了。 容器类控件,其实就是能包含或引入其它控件的LabVIEW控件,如大家非常熟悉的选项卡控件,另外还有分割栏控件,此外还有功能强大的ActiveX容器、.Net容器控件,顾名思义也能知道其强大功能了。 输入/输出控件是用来输入或配置你的输入输出资源的,比如信号采集时通道的选择、板卡资源的选择、串口资源的选择等等。 提到引用肯定有的小盆友两眼冒光,没错,LabVIEW也提供了引用。于是,你可以不通过连线便能够调用了(顺便说一句,不通

20、过连线调用的方法在LabVIEW里还是很多的)。 变体,这东东比较象VB里面的变体类型,如果你需要可以把任何数据类型转换为变体。类则是最近版本里才提供的,号称LabVIEW也要支持面向对象的程序设计,不过到底如何还是日后再说了。 修饰,各种形状让你的界面更美观。当然修饰只能是修饰,就像孔雀就是孔雀,无论如何也不会飞到枝头变成凤凰,哦,对不起,唐伯虎看多了。修饰只起美化作用,不信你看看,前面板上的修饰控件,在程序框图里你是找不到的-其他功能控件可是绝对会找到程序框图中的对应变量。 系统、经典、Express、好多控件,一句话,如果你用得到,你就顺着分类一层层去找。1.2.2 设计一个示波器前面板

21、为了熟悉一下各种控件,那就动手设计一个典型的界面吧,对LabVIEW来说,最典型的就是示波器面板了。下面就是一个示波器前面板,试一试,把它做出来!(哦,对了,这是LabVIEW自带的例子,你可以在帮助-查找范例里面搜索Two Channel Oscilloscope就能找到,还有左上 图1.14 示波器前面板角的标志其实是图片直接贴到前面板上的。)这一部分我们不只熟悉一下部分前面板控件,还要学会用右键,没错,LabVIEW中右键的功能很好很强大,很傻很天真,简直是不可或缺的。好的,先找几个控件吧,当然我们就用常用风格的就行,同样的功能可选控件很多,你只要先组合出一个就行。试一试,先用波形图控件

22、和装饰控件组合成大致的样子,如图1.15所示。图1.15 示波器UI设计1哦,我明白看起来不一样,那我们就在波形图上点右键,把我们不希望看到的左上角的标签和右上角的图例隐藏掉。点击右键显示项,勾掉相应的对号就可以了。不用说,你肯定注意到了右键下有很多选项,比如创建、替换、数据操作、高级等等。这些菜单或之下的次级菜单提供给你了各种快捷操作,当然是针对当前控件的。隐藏掉波形图的标签和图例后,稍微调整一下大小,那么具体布局差不多了。那么我们仿照示例修改波形图的背景色为黑色。这就用到了工具选板的设置颜色。这只毛笔式样的东东就是用来设置前景色和背景色的,如果你想问什么是前景色什么是背景色,哦,打开Win

23、dows自带的画图工具体会一下吧。你只要在设置颜色工具的的前景色颜色块或背景色颜色块上点右键,便能选择你想要的前景背景色。我们就把前景来个一篇漆黑,然后刷一下波形图的边框,吼吼,神秘的黑色。不过坐标看不见了怎么办?没关系,用工具选板中的文字工具,就是那个大A,选中一下,然后看到菜单栏下方你的前面板上方的快捷按钮了没有?点一下文字设置快捷按钮,你会发现什么字体、样式、颜色这些全都有!对了,你如果觉得这样找来找去麻烦,那在波形图控件上点右键属性,找一找,这下满足了吧。图1.16 示波器UI设计2接下来就放置各种数字控件和布尔控件,还有一些文字说明,文字的东东就交给文字工具大A了。别的控件呢?你尽管

24、放上,熟悉一下有好处的。下面是多多少少做了个样子,嘿嘿,有点手懒,你的肯定会好很多吧。顺便说一句,给的事例的前面板是使用经典控件(如图1.18),努努力,你能够做出一模一样甚至更好的。图1.17 示波器UI设计3 图1.18 经典控件面板当然,以上只完成了前面板控件的放置,没有编写任何框图程序。如果你切换到框图(通过点击菜单窗口显示框图程序,或者Ctrl+E快捷键,再或者你双击任意一个前面板控件-装饰除外),就能看到有一堆你放置的前面板各控件的VI图标,如图19所示。为了让你的程序也能运行一下,像上图17一样显示正弦波,我们就加一个简单的波形发生VI。切换到框图程序面板,通过点击查看菜单函数选

25、板或右键直接点击框图程序面板空白处,你可以看到各种各样现成的函数VI或常量。我们先不管别的,找到信号处理波形生成正弦波形VI,点击放置到框图程序里,将该VI右上角信号输出那条线连到波形图控件图标上,OK了。点击快捷按钮的运行按钮,看一看吧。对于虚拟仪器程序设计来说,UI设计是非常重要的,也是当前许多“研究论文”或教程里面忽略掉的。除了大家公认的简洁实用等原则外,其实我个人认为要根据用途(也就是需求)来设计。比如若要实现类似示波器或其它测试系统程序,那最好是仿照普遍使用的示波器仪表面板进行设计和改进,如图14所示;但如果是开发常用的交互程序,那么Windows系统风格无疑是比较好的选择,你能看出

26、来吗,右图就是LabVIEW开发的配置对话框。1.2.3 LabVIEW函数选板LabVIEW函数选板提供了各种数据类型、常量、流程控制、功能函数等,实现功能强大的应用程序就要靠这些幕后英雄了。函数选板最能体现LabVIEW图形化编程的特点,我们来快速认识一下,如果你有其他编程语言的基础,那肯定不是有任何障碍了。建立VI后,在框图程序窗口“查看”菜单选择“函数选板”,或者在框图程序区域点击右键就可以调出函数选板,点开每一项都能够得到众多的可调用函数,如右图所示(当然,有可能一些朋友控件选板或函数选板的排列方式不太一样,但没有关系的)。以下简单说明一下部分函数选板的功能。 结构选板 用于控制框图

27、流程的,只要一说起其中的函数VI你肯定就明白:For循环、While循环、条件(Case)结构、事件结构、定时结构、顺序结构。可以说,任何编程语言都少不了的流程控制东东在这儿。 数组选板 还记得C语言里让人又爱又恨的数组吗?数组越界很危险,数组大小不能动态改变在这儿,不用管了,并且各种强大的数组函数,如插入、删除、拆分、搜索、排序让你眼花缭乱! 簇与变体选板 前面已经在前面板控件中介绍过了能放置在前面板的簇与变体控件,这儿则提供了各种操作方法VI,尤其是簇操作,让你随心所欲定义和操作自己的数据类型。 数值选板、布尔选板 在前面板空间中也有这些类型,框图程序中可用的数值与布尔VI更多。数值类型、

28、数学常量、数学运算、数值转换、复数操作等等,眼花缭乱,当然更高级功能(统计、微积分、线代、拟合、多项式)还得从专门的数学选板里找;而与或非、异或、同或等等布尔预算则在布尔选板里面。 文件选板 创建、删除、读、写文档,包括文本、二进制以及在两者基础上的电子表格、INI、XML和LabVIEW中自定义的各种文档格式。选择合适的数据类型关系着你的文件操作的效率和易用性,真的要具体问题具体分析。 字符串选板 值得大书特书!这是非常有用也是比较好用的,我们将在后面用一节来专门介绍一下。当然,绝不是挨个把字符串VI功能、连线翻译一遍,那是LabVIEW帮助文档干的活。 比较选板 常见的大于等于小于等函数,

29、以及判别是否空、是否是某格式数据的VI,在程序流程选择、导向时会经常用到。 定时选板 和时间、定时有关的函数,请进! 对话框与用户界面选板 提供了简单的提示框、错误警告、简单输入对话框等,要想有复杂的输入输出对话框怎么办?自己设计了 波形选板 要知道,LabVIEW可是测控程序设计高手,同信号采集、分析、显示打交道的小盆友一定得会用才行。哦,对了,波形也是一种数据结构,其实就是簇的一种。 应用程序控制选板 如果你不想用连线的方式调用其他VI怎么实现?如果你想在自己的程序中控制LabVIEW的开启运行怎么实现?这里可以算作一点点高级特性,你会体会到其强大的。 同步选板 还记得VC或其他语言中的信

30、号量、通知器或事件机制吗?是不是很有用?还记得先入先出的队列结构吗?如果你会使用同步选板中的VI,恭喜你,你的程序设计(不仅仅是LabVIEW程序设计)已经入门了。 图形与声音选板 这个选板就不多做解释了,顾名思义。不过可以简单说一句,如果你半分钟就能完成一个看图软件或音频播放是不是很吃惊的事呢? 以上只是基本的函数,还有更多的选板,尤其是LabVIEW擅长的-类似数学计算、信号采集与处理、仪器I/O。基本函数是高楼大厦的基础,而从本教程序言中我们就已经知道,用LabVIEW做他擅长的才是王道。好的,我们就以一个例子结束本章,开始充满乐趣的LabVIEW学习之旅,当然,这个例子也是LabVIE

31、W所擅长的,设计虚拟波形发生器(现在是有一点唬人)!1.2.4 虚拟波形发生器如图1.19所示,前面板上主要就是一个波形图控件、退出按钮以及波形参数控件。注意,不要着急把所有的东东都放到前面板上,先看看我们用到了哪些框图VI不迟。图1.19 虚拟波形发生器前面板框图程序涉及while循环、基本函数发生器、高斯白噪声发生器以及延时等待(ms) 。如图1.20所示,完成框图程序的顺序没有严格要求,不过通常还是把流程控制VI拖进来,在这儿就是while循环。默认循环右下角是循环条件(条件为真事停止或继续),左下角的i则是循环次数,从0开始。当然,如果不给循环条件连一个布尔按钮或常量,这个程序肯定是不

32、能执行的,那你可以放一个按钮在前面板,然后在框图程序中找到这个按钮并连到循环条件上。当然,最快捷的是在循环条件上点右键,在菜单中选择创建输入控件(常量等也可以,由功能决定)。在VI连线端点右键后直接创建输入输出控件是最常用的快速完成程序的方法。图1.20 虚拟波形发生器程序框图好的,我猜该程序难倒你的应该是用到的各函数在哪儿找:while循环就不必说了;波形图也非常容易找;延时等待无疑是在“定时”这一分组里;而基本函数发生器、高斯白噪声发生器就在信号处理波形生成里;至于加号,不许问!可能你也注意到了,前面板上都是中文标签,后面的程序里面为什么这么多英文名称?你很仔细,这是通过右键快速生成控件的

33、时候经常会碰到的,你在前面板控件上右键就会看到显示项标题上打了勾,但标签上没有。那么如果在对应的框图程序图标上点右键呢,没错,英文的是标签!标题和标签是不一样的,后面用到属性节点时好好讲一下。当然,如果你直接在前面板上建立一个控件,一般标签和标题的文本是一致的哦。简单说一下这个程序。该虚拟波形发生器能够产生常见的正弦波、三角波、锯齿波、方波(通过基本函数发生器),根据需求可以调整波形参数;同时能够给信号添加指定强度的高斯白噪声;波形通过图形方式显示;当然,while循环是要整个波形产生、显示的过程持续进行,不过为了避免循环全速进行占用过多资源,加了一个500ms的延时。(循环中的延时是非常常用

34、的,别忘了)最后我们的程序执行时面板看起来比较清爽,少了菜单、快捷按钮等等,这个样式的实现很简单:在你的程序文件菜单里选择VI属性,找到窗口外观一项,剩下的就不用再啰嗦了。OK,LabVIEW实践之路第一章要写结语了,就两句话:用好LabVIEW也得付出努力,用他做应该做的。第二章 强筋健骨:由程序流程的控制展开按照通常的教程,现在一般要介绍各种数据类型,例如数字、字符串、数组与簇等等。不过从程序结构入手,在掌握流程控制VI的同时认识各数据类型应该更有效,毕竟如果老是把目光集中在树木上,那很容易忘了郁郁葱葱的森林。本章仍然通过实例来学习,依次完成For循环、While循环、条件结构、顺序结构、

35、事件结构、公式节点等LabVIEW实例。2.1 循环结构循环结构是任何程序设计语言都必不可少的,尤其是For循环、While循环等。以下将通过实例学习LabVIEW的循环结构以及移位寄存器的用法。2.1.1 For循环看一下右图,For循环的尊容很容易记。左上角N是循环体内程序执行的循环次数,内部的i是当前循环次数(第一次从0开始计数)。LabVIEW的For循环执行过程中是无法中断跳出的,这一点必须明白。另外,虽然左上角的N用来连接总的循环次数值,但许多情况下For循环可以应用“自索引”方法,不用连接N,让循环自动进行,这种方法在数组等类型执行For循环时非常普遍。(其实说白了也很简单,诸如

36、新的JAVA版本也支持数组等类型的迭代而不用先求出数组的length,别急,一会儿给几个例子对比一下) 好的,我们先来最简单的,同时产生1024点的随机数(01之间)和一个周期的正弦波,如图2.1所示。 图2.1 For循环仿真波形上面的例子中For循环次数为1024次,循环体内上部为随机数产生器,下部是正弦函数值。每次循环各产生一个随机数和的正弦值。注意:当循环完成退出时,循环体右侧,边框上连接内外数据的小方框就起到了自动索引的作用:将你各次循环的结果按顺序排列成数组进行输出。当然,有时候我们不需要自索引输出,那可以在索引方框上点右键取消的,不过想一想,取消自索引后输出应该是什么?我问的问题

37、太没有难度了,呵呵。当然,自索引在输入端也是可以使用的,而且会带来意想不到的方便,尤其是同移位寄存器结合使用。闲话少说,下面我们就实现一个求一维DBL数组最大值和最小值的程序。哦,为了养成良好习惯,我们画一下算法的流程简图吧(对了,下面的流程简图说明一下问题帮助编程,相信你能做得更好)。如图2.2所示,为了便于说明问题,我们假定数组非空。我们直接给出了实现的程序,注意,图2.3和图2.4的两个框图程序都能够得到图2.5所示的正确结果,可能其中几个vi、循环两侧的移位寄存器以及2.3中的条件结构有些陌生。除了这些,两个程序有什么不一样吗?图2.3 求数组最大最小值框图程序1图2.4 求数组最大最

38、小值框图程序2图 2.2 算法流程图先说一下有些陌生的东西。图2.3中在循环里应用了条件结构,条件框可对真和假两种情况作出不同的处理,不过不要急,下一小节再讲它。那么数组在开始循环之前使用获得了数组长度,并赋给For循环的循环次数N,这时候在循环内部i就会从0循环递增到N-1,于是我们使用索引数组函数依次获得第i个数组元素。每次获得当前元素后,都同最大值max、最小值min进行比较,以获得整个数组的最大最小值。当然,我们用-初始化max和用+初始化min都是为了从第一个数组元素开始就能够正确的完成最大值、最小值的查找。这儿有一个关键的实现-移位寄存器,也就是循环框上的。你可以在循环框上点右键,

39、选择“添加移位寄存器”便会发现在循环框架的左右出现了一对。没错,移位寄存器是成对出现,它的工作原理是:第i次循环的输出(右侧)即是第i+1次循环的输入(左侧)。具体到图2.3所示的程序,进入循环体时max移位寄存器初始化为-,而min初始化为+。第一次循环时数组元素3读入,分别与max、min的值比较,结果是max、min被置为3;第二次循环时max、min的值都已经变成了3,这一次循环读入2,比较后min的结果置为了2。以此类推,直至循环结束。图2.4功能与图2.3完全一样,注意,为什么For图2.5 程序前面板循环左上角的循环次数N并没有赋值?因为数组进入循环体是使用了自索引(如果你连接数

40、组和For循环体,默认就是自索引),For循环回自动从头到尾依次获取每一个元素的值,对我们编程节省不少力气。另外程序用选择函数代替条件结构,这个函数能够用于大多数双值选择的情况,但必须是相同类型(如从两个整型、两个字符串中根据真假选择),上方输入提供逻辑真时的输出,下方输入则提供逻辑假时的输出,中间则是判别逻辑(真或假)。肯定有学过LabVIEW的小盆友会说,数组最大值、最小值有专门的VI可以调用,不用这么麻烦。没错,数组函数里数组最大值与最小值函数能够直接完成此功能,并且给出最大值、最小值出现的位置。我们举例是为了学习,并且你也可以继续完善我们的例子实现更多的功能。如果我们在程序运行前无法知

41、道循环次数怎么办?或者需要中途可以中断跳出的循环时?当然是While循环了。2.1.2 While循环While循环特征也很明显,除了内部的当前循环次数i同For循环相同外,由于通常用于无法预知循环次数的循环,所以内部的是用来连接跳出循环的条件:输入为真时结束循环。如果你在上点右键,可以选择输入为真时继续循环(即输入为假时结束循环),图标变为。好的,我们先来实现一个简单的While循环:求0+1+2+n的值,置于n是多少,我们就让它随机吧,直到我们点击退出按钮时再停止。最终需要显示n的值和求和的值。程序框图和前面板如图2.6所示。 图2.6 While循环实例使用While循环有几个问题需要注

42、意:1、 计数i从0开始,While循环至少会运行一次。而For循环如果循环次数N设为0(或空数组自索引),则一次也不会循环。2、 合理循环终止方式。如果是通过内部条件触发(如循环3000次后自动停止等),则要注意算法不要有问题;如果是通过点击按钮退出,那要注意按钮的机械动作(后面会讲)和循环条件类型。3、 While循环里面尽量不要出现While循环的嵌套。While循环里面还有While循环很容易导致死循环,而且几乎所有的问题都有不适用嵌套的解决方法。4、 While循环内要根据情况设置延时。许多While循环是需要一直运行来进行事件处理,如果不加延时会全速循环,耗费大量系统资源。而许多情

43、况下,几十甚至几百个毫秒的延时不会对程序的功能和人机交互带来任何问题。许多东西需要在实践中总结和改进,并且经验也不是适用于一切场合的。那么我们再来实现一个While循环的例子:使用While循环绘制图表,我们用到While循环、随机数发生函数、波形图表(chart)、延时函数,如图2.7。图2.7 While循环波形仿真通过调整延时的毫秒倍数,你能很轻松的控制循环的速度。但注意的是,这种定时方式不是一种精确的方法,不能用于非常精密的需求中。还有一点必须强调一下,While循环(包括For循环等)中如果存在并行执行的框图程序,那么只有等到所有程序都执行完一次循环后,才能进入下一次循环的执行。如果

44、出现有快有慢的程序段,那对不起了,等着吧,这里的规矩就是不抛弃不放弃!图2.8很好的说明了问题。 图2.8 循环内程序并行执行在2.8的While循环中,两个红框是并行的程序,其中一个用来处理各种计算等任务,另一个用来检测按钮状态决定是否退出。由于检测状态非常简单,所以瞬时便执行完,而计算任务则需要耗费一秒多时间,所以如果在这期间按钮状态变为了真,对不起,当时是不能退出程序的,等到这一次循环的计算任务也完成了,程序进入下一次循环时才能退出。同样,三个紫色框内是低一层的并行任务,由于其中的For循环最耗费时间,从前面板执行结果可以看出,当最下面的显示“While循环i值”执行完显示到3时,For

45、循环还在努力中,显示为2。所以并行是好东西,但要用好。我曾看到过有人编写的采集程序大致每秒钟循环50次;但由于把一些网络查询反馈等比较耗时的操作放到了采集循环中,就导致了采集程序一直等着其执行完成后才能继续下一次循环,经常会缓冲溢出报错和丢失数据。(那怎么办?后面会说的,别急)2.2 顺序结构顾名思义,顺序结构就是强制程序运行时的前后顺序。有时候我们想将几个程序段按顺序执行,而程序本身并没有连线能够保证这种顺序(还记得前面说的吗?LabVIEW的数据流向是顺着连线从左往右的),那么你可以使用顺序结构。当然,如果连线能保证的,就不要像图2.9的采集程序一样画蛇添足了,因为不使用顺序结构的结果是一

46、模一样的,如图2.10所示。图2.9 带有顺序结构的采集程序图2.10 不含顺序结构的采集程序从上面的图中我们认识了顺序结构的样子之一,顺序结构还有层叠式的,主要是避免前后多个顺序段串起来太长,显示不方便。图2.11所示为顺序结构的两种形式。图2.11 平铺式和层叠式顺序结构顺序结构初始只有一个框,想要添加很简单,直接在框上点右键添加就可以了。下面我们来完成一个顺序结构的程序:获得一段程序运行耗费的时间。这儿将用到获取当前时间的函数-获取日期/时间(秒),在框图的“定时”选板里。程序前面板和框图如图2.12所示。 图2.12 获取程序运行时间上面的框图很简单,就是在程序运行前获取一下当前时间,

47、在程序结束后再获取当前时间,两者之差就是程序运行时间。顺序结构在这儿起了重要的作用。当然,运行一下程序你会发现每次得出的结果有点不同,想一想为什么?如果不加顺序结构上面程序会得到什么结果呢?这个问题我问得太简单了 图 2.13 删除顺序结构后的结果2.3 事件结构事件结构的学习是挺激动人心的。不是说别的东东不重要,而是因为事件结构是实现众多UI事件响应或其他内部事件响应的结构类型。也许你学过VC的事件机制,确实很好很强大,但学习者不能太傻太天真,VC的事件机制学习曲线有点陡(嘿嘿,不如说MFC太陡,陡陡陡)。不过LabVIEW中的事件机制没那么难办,尤其是UI事件。闲话少说,先瞻仰事件结构的尊

48、荣,如图2.14所示。事件结构也是由边框围成的封闭结构,结构内部就是响应特定事件所要执行的程序,结构上方是所要响应事件的名称,即事件分支(图2.14显示的是响应“超时”事件)。注意,以下几句话比较重要,我们一句句解释一下: 图2.14 事件结构1、 一个事件结构可以有多个事件分支,即可以层叠多个框(可以右键添加删除)。不好意思,这一句是废话2、 同一个事件结构里,不能出现两个事件分支都对同一个事件进行响应(注意,是“同一个事件结构里”,不同事件结构就没人管了)。简单说,在一个单位只能“一个萝卜一个坑”,但不限制你去别的单位兼职。3、 同一个事件分支可以同时对多个事件进行响应,也就是说可以“殊途

49、同归”。还有还有,不过先不往下列了,实践之路就得先实践。我们来完成第一个事件结构的例子,是UI事件:判断鼠标是否在前面板内部,先上代码如图2.15。 图2.15 事件结构判别鼠标是是否进入前面板好的,我们来解释一下。程序中的事件结构共有3个事件分支:超时、鼠标进入窗格和鼠标离开窗格。超时是应用程序事件,另外两个则是窗格事件。超时事件左上角连着时间(50毫秒),也就是说当50ms时间没有发生本事件结构中其他任何事件分支时,程序将进入下一个循环,那么很容易想到,如果我们不给超时事件赋值(或赋值为-1),那么程序会一直等待有事件分支发生。以下通过添加“鼠标进入窗格”事件说明事件结构的编辑方法。右键点

50、击事件结构上方的分支列表,选择“添加事件分支”后就进入了“编辑事件”对话框,如图2.16所示。下方“事件源”中选择你的事件的来源,是来自应用程序(如超时事件)、窗格(如本例中的鼠标进入)以及某控件(如按钮、文本框、列表框等等等等)。下方右侧可以选择特定的事件。那么上部的“事件说明符”列表有什么用吗?看到和没有?你可以在当前处理分支里面通过添加多个事件!当然也可以想删谁就删谁别急,下一个例子就会让大家体验一下。在添加了“窗格”的“鼠标进入”事件后,点击确认完成本次添加,这时框图程序的事件结构中就多了该事件分支。为了响应鼠标进入窗格的事件,我们在前面板放置一个字符串显示控件图2.16 编辑事件对话

51、框并赋值为“鼠标进入”,那么就能保证当鼠标进入前面板窗格时就会显示“鼠标进入”字符。按照同样的方法添加“窗格”的“鼠标离开”事件。这时问题来了,我们还想用刚才创建的前面板字符串显示控件来提示“鼠标离开”,怎么办?没法把线连过去啊?那么我们就来使用一种不采用连线的数据流动或共享方法,在这儿可以用局部变量或属性节点(这种方法之后会详细说)等。我们看一下如图2.17如何创建控件的局部变量,很简单,右键!创建完成后,根据需要设置其是读取或写入,我们的例子当然是写入,完成状态字符串的更新。以上的例子很简单,事件结构的每一个事件分支均响应一个事件,并且这些事件都是预定义的系统或UI事件。是不是觉得不够过瘾

52、?毕竟有些事件,特别是非UI事件,是必须由用户自己定义的,这种情况怎么办呢?很简单,看图2.17中的事例-当仿真数据大于0.97时显示该数值并点亮红灯半秒钟(当然,该例中实际上我们可以不用事件结构就能实现该功能,但许多情况下事件结构是不错的选择)。 图2.17 注册用户事件首先告诉大家,注册用户事件的子VI在函数选板对话框与用户界面事件选板下,如右图所示。对于用户自己定义的事件,可以用这些VI来实现,其流程是这样的:首先需要“创建用户事件”,这时需要连接你在事件中所要传输数据的类型给此VI,并且要给其一个唯一的标签,就像图2.17中的;然后注册该事件,因为注册事件后才有了事件句柄(嘿嘿,从VC

53、里面借用该词,不一定准确)可以给处理程序使用;接下来在事件发生的框图内使用“创建用户事件”并将值付给该VI;最后需要在事件结构中处理该事件,创建分支的步骤同前一个例子一样,不过注意的是,事件结构默认样式下边框上没有连接动态事件接线端的位置,那怎么办?答对了!点击右键选中就可以了。各位小朋友一定注意到了,上面例子用到了不少局部变量,对于结束程序的布尔按钮用到了两个,而对于报警灯也用到了两个,这是不需要连线的共享方法(不过我更喜欢用属性节点,嘿嘿,后面会有例子)。我们拿停止按钮来解释一下这种用法。注意,本例中有两个while循环,我们准备用一个按钮来停止。前面已经知道了,由于LabVIEW连线的数

54、据流本质,导致了没有退出循环前,数据流连线无法直接送出去,因此就用按钮的局部变量来实现。这儿必须注意按钮等布尔控件对点击事件的响应方式有多种(右键能查看、修改),后面我们会细说。要保证点击按钮后,两个循环都能退出,我们必须做到按钮为“真”的状态保持到两个循环都退出以后,当然推出以后按钮要置回“假”。上例中是我比较喜欢使用的方法,实质上也是利用了数据流连线连到外面的顺序框上保证了两个循环都能退出。好了,这个例子不多说了,努努力,你肯定能够实现。如果一步步将所有的流程都列出来,那就不是学习,而是纯粹的模仿和重复,加油吧!事件部分再给一个例子吧,就是通过一个事件分支判断到底是鼠标那个键被按下或释放,

55、程序如图2.18所示。 图2.19 一个事件分支响应多个事件上例用一个事件分支响应了两个事件:鼠标按下和鼠标释放,事件添加方式前面说过了,不会忘了?这个例子比较简单,因为两个事件(鼠标按下、鼠标释放)是同一类型的,所以处理起来很简单。好的,我们对于事件结构的学习暂时到这儿,其实在这一部分还看到了多循环并行的使用以及局部变量的妙用。后面还有机会使用事件结构完成非常实用的程序,主要是响应各种按钮事件、菜单事件以及各种自定义事件。当然,饭要一口口的吃,诸如21天精通某编程语言的圣经属于大仙们的读物,作为人类我们可以省省啦。2.4 条件结构条件结构,同样是一个经常会用到的类型,只要有其他编程语言的使用

56、经历,那绝对是小菜一碟。当然,即使没有用过别的编程语言,照样是一碟小菜。条件结构的尊荣在2.1.1中见到过了,默认如右图所示,不再罗嗦。但等等,为什么说“默认”如右图呢?呵呵,这个问题提得好,这个问题提得妙,这个问题呱呱叫!从函数面板里选择条件结构放置到框图程序后,条件结构的左输入端的选择条件是布尔型,即如果输入为“真”,进入一个分支进行处理;而如果输入为假,则进入另一个分支进行处理。那么很简单,我们有时候会使用其他类型的输入作为条件项,如判断计算结果,如果为0,1,2分别进行处理(这是数值型);如判断某字符串是CHN、JPN、USA、WC分别进行处理(这是字符串型);当然还可以是LabVIE

57、W独有的“错误型”,如右图所示。条件结构的用法类于其它编程中的Case结构,我们只要记住以下几点就会基本的用法了(但要用好,还得加加油):1) 一组条件结构的输入条件类型必须是相同的。很容易理解,你如果输入时布尔(真、假),那就不能出现其他的,如果是数字也都得是数字(而且是整形哦),字符串就得都是字符串。2) 各输入必须能够覆盖所有可能的选项。这句话其实也容易理解,布尔量只有真、假两种情况,没有第三种。如果是数字或字符串怎么办?那也得覆盖所有的可能。想一想,怎样能够快速达到这条件?嗯,和其他编程语言一样,设置一个默认选项!除了你明确规定的输入外,其他都默认了不久全覆盖了?比如输入类型为整型,我们分别单独处理输入为0和1的两种情形,然后再添加一个默

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论