labview实践出真知
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二章强筋健骨:由程序流程的控制展开按照通常的教程,现在一般要介绍各种数据类型,例如数字、字符串、数组与簇等等。不过从程序结构入手,在掌握流程控制VI的同时认识各数据类型应该更有效,毕竟如果老是把目光集中在树木上,那很容易忘了郁郁葱葱的森林。
本章仍然通过实例来学习,依次完成For循环、While循环、条件结构、顺序结构、事件结构、公式节点等LabVIEW实例。
2.1 循环结构
循环结构是任何程序设计语言都必不可少的,尤其是For循环、While循环等。以下将通过实例学习LabVIEW的循环结构以及移位寄存器的用法。
2.1.1 For循环
看一下右图,For循环的尊容很容易记。左上角N是循环体内程
序执行的循环次数,内部的i是当前循环次数(第一次从0开始计数)。
LabVIEW的For循环执行过程中是无法中断跳出的,这一点必须明白。
另外,虽然左上角的N用来连接总的循环次数值,但许多情况下For循环可以应用“自索引”方法,不用连接N,让循环自动进行,这种方法在数组等类型执行For循环时非常普遍。(其实说白了也很简单,诸如新的JA V A版本也支持数组等类型的迭代而不用先求出数组的length,别急,一会儿给几个例子对比一下)好的,我们先来最简单的,同时产生1024点的随机数(0~1之间)和一个周
期的正弦波
1*22*21023*2
sin, (0,, , , )
102410241024
y x x
πππ
== ,如图2.1所示。
图2.1 For循环仿真波形
上面的例子中For循环次数为1024次,循环体内上部为随机数产生器,下
自索引输出,那可以在索引方框上点右键取消的,不过想一想,取消自索引后输出应该是什么?我问的问题太没有难度了,呵呵。
来意想不到的方便,尤其是同移位寄存器结合使用。闲
话少说,下面我们就实现一个求一维DBL数组最大值
和最小值的程序。哦,为了养成良好习惯,我们画一下
算法的流程简图吧(对了,下面的流程简图说明一下问
题帮助编程,相信你能做得更好)。如图2.2所示,为了
便于说明问题,我们假定数组非空。
我们直接给出了实现的程序,注意,图2.3和图2.4
的两个框图程序都能够得到图2.5所示的正确结果,可
能其中几个vi、循环两侧的移位寄存器以及2.3中的条
件结构有些陌生。除了这些,两个程序有什么不一样
吗?
图2.3 求数组最大最小值框图程序1
图2.4 求数组最大最小值框图程序2 图 2.2 算法流程图先说一下有些陌生的东西。图2.3中在循环里应用了条件结构,条件框可对真和假两种情况作出不同的处理,不过不要急,下一小节再讲它。那么数组在开始循环之前使用获得了数组长度,并赋给For循环的循环次数N,这时候在循环内部i就会从0循环递增到N-1,于是我们使用索引数组函数依次获得第i个数组元素。每次获得当前元素后,都同最大值max、最小值min进行比较,以获得整个数组的最大最小值。当然,我们用-∞初始化max和用+∞初始化min都是为了从第一个数组元素开始就能够正确的完成最大值、最小值的查找。这儿有一个关键的实现---移位寄存器,也就是循环框上的。你可以在循环框
上点右键,选择“添加移位寄存器”
便会发现在循环框架的左右出现了一对。没错,移位寄存器是成对出现,它的工作原理是:第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并没有赋值?因为数组进入循环体是使用了自索引(如果你连接数组和For循环体,默认就是自索引),For循环回自动从头到尾依次获
取每一个元素的值,对我们编程节省不少力气。另外程序用选择函数代替条件结构,这个函数能够用于大多数双值选择的情况,但必须是相同类型(如从两个整型、两个字符串……中根据真假选择),上方输入提供逻辑真时的输出,下方输入则提供逻辑假时的输出,中间则是判别逻辑(真或假)。
肯定有学过LabVIEW的小盆友会说,数组最大值、最小值有专门的VI可以
调用,不用这么麻烦。没错,数组函数里数组最大值与最小值函数能够直接完成此功能,并且给出最大值、最小值出现的位置。我们举例是为了学习,并且你也可以继续完善我们的例子实现更多的功能。
如果我们在程序运行前无法知道循环次数怎么办?或者需要中途可以中断跳出的循环时?当然是While循环了。
2.1.2 While循环
While循环特征也很明显,除了内部的当前循环次数i同For循环相同外,由于通常用于无法预知循环次数的循环,所以内部的是用来连接跳出循环的条件:输入为真时结束循环。如果你在上点右键,可以选择输入为真时继续循环(即输入为假时结束循环),图标变为。
好的,我们先来实现一个简单的While循环:求0+1+2+…+n的值,置于n 是多少,我们就让它随机吧,直到我们点击退出按钮时再停止。最终需要显示n 的值和求和的值。程序框图和前面板如图2.6所示。
图2.6 While循环实例
使用While循环有几个问题需要注意:
1、计数i从0开始,While循环至少会运行一次。而For循环如果循环次数N设为0(或
空数组自索引),则一次也不会循环。
2、合理循环终止方式。如果是通过内部条件触发(如循环3000次后自动停止
等),则要注意算法不要有问题;如果是通过点击按钮退出,那要注意按钮的机械动作(后面会讲)和循环条件类型。
3、While循环里面尽量不要出现While循环的嵌套。While循环里面还有While
循环很容易导致死循环,而且几乎所有的问题都有不适用嵌套的解决方法。
4、While循环内要根据情况设置延时。许多While循环是需要一直运行来进行
事件处理,如果不加延时会全速循环,耗费大量系统资源。而许多情况下,几十甚至几百个毫秒的延时不会对程序的功能和人机交互带来任何问题。
许多东西需要在实践中总结和改进,并且经验也不是适用于一切场合的。
那么我们再来实现一个While循环的例子:使用While循环绘制图表,我们用到While循环、随机数发生函数、波形图表(chart)、延时函数,如图2.7。