前言:
任何计算机语言都离不开程序结构,LabVIEW 作为一种图形化的高级程序幵发语言也不例外。LabVIEW 中的程序结构包括if-else循环,while循环结构,使能结构,公式节点和数学脚本节点等, 因此通过LabVIEW可以非常方便快速地实现任何复杂的程序结构。在LabVIEW 中,无论是循环结构、Case 结构还是条件式节点,它们都表现为一个方框包围起来的图形代码。这个方框就类似于C语言中的两个花括号 。
一、while循环
如果我们需要让循环在满足某种条件时退出或继续运行,这时候就需要借助于 While 循环。它是 LabVIEW 中最经常使用的一种程序结构。
下面我们利用 while 循环写一段最简单的代码:用户输入一个整数,while循环计算出 1 到 该数值的累加和,该段代码如下所示:
在上述代码中使用了反馈节点,因为使用 反馈节点可以让程序更简洁, 就是直接将输出与输入连接起来,这时就会自动出现一个反馈节点的符号。
其中 是循环终止条件的输入端子,默认情况下为 Stop if true,即当输 入布尔条件为 True 时终止循环,为 False 时继续运行。如果右击该端子,该端子变为,这表示当输入布尔条件为 True 时继续运行,为 False 时终止循环。这两种情况是互 为相反的逻辑。具体采用哪一种,则主要由程序的可读性决定。此外,While循环体与外部代码交换数据的方式和For循环是一样的,可以参考 For 循环。
如果以索引方式输入数组的话,While循环的次数并不会由数组大小控制,它仍由布尔值控制。当循环次数超过数组大小时,将以数组最后一个元素作为输入。我们编写代码如下所示:
运行程序后,前面板显示:
LabVIEW 在执行While循环时,如果用户没有给它设定循环时间间隔,那么它将以CPU的极限速度运行。按下Ctrl+Alt+Delete 快捷键打幵任务管理器,可以看到它几乎将CPU全部利用, 正常情况这样做比较危险,因为这样可能会导致整个 LabVIEW 程序看上去跟“死 掉” 一样。
在很多情况下我们没有必要让 While 循环 以最大的速度运行,所以最好给 While 循环 加上时间间隔。有两种方法:一种是在每个循环中添加一个等待时间,只有在等待完毕后才运行下一个循环。 另一种方法是使用定时循环(Timed Loop)。
因此,在写 While 程序时千万别忘了加上一个定时器,即:
二、For 循环
For 循环用于将某段程序循环执行指定的次数。可以通过两种方法指定循环次数,一种是直接给定,一种是通过输入数组的大小给定。它在 函数面板中的位置如下图所示:
如果输入 For 循环体的数据为数组的话,有两种情况:一种是将整个数组一次性输入循环体, 另一种是让数组元素逐个地输入,并以数组大小确定循环次数。同理,输出也一样,可以一次性将整个数组输出;也可以将元素逐个输出,最后再将所有输出元素组合为同一个数组输出。
一般来说,如果直接将数组与内部数据连接,它默认就是自动索引,即数组元素一个个地输入,输出也是一样的。一般情况下,用户不再需要指定运行的次数,它会自动根据数组大小执行。 当然如果用户硬要指定,那么它按照最小的执行次数执行。即如果数组有5个元素,而用户指定循环次数为10,则实际循环次数为5。索引方式下输入和输出一维数组如下图所示:
程序框图:
前面板:
显然,虽然没有指定 for 循环中 N值 的大小,该循环执行了5次就终止了。因此,它会自动根据数组大小决定执行次数。
如何利用 for 循环来产生二维数组或多维数组,方法很简单,如下图所示:
对应的前面板如下所示:
改变循环次数:
三、事件结构
Labview 提供了事件结构,即仅当 “事件” 发生时,程序才作相应的响应。 通过事件结构,程序可以变得很简单,并降低CPU利用率。当多个事件发生时会形成事件队列, 直到每个事件对应的代码都被执行为止,因此不会有事件被漏掉的情况。
注意:事件结构必须放在 While 循环中,否则没有意义,因为当一个事件完成后,程序 需要去等下一个事件的发生。我们来看一段代码:
接下来我们在选择器标签处右键鼠标,添加事件分支:
添加 “取消按钮” 对应的事件:
添加 “确定按钮” 对应的事件:
添加 “ 旋钮” 对应的事件:
然后我们可以运行代码,在前面板看到结果如下:
旋转 旋钮:
四、条件结构
这一节我们通过一个例子来学习条件结构:利用条件结构和循环结构写一个跑马灯,即要求 5 个灯从左到右不停的轮流点亮,闪烁间隔由滑动条调节,我们新建一个空白 VI ,然后编写代码:
在while循环中放一个时延函数,延时时间由滑动条控制,这个延时时间就是跑马灯的闪烁间隔。然后从循环次数 i 引出,除以 5 取余数加1 作为条件使能结构的输入。最后依次设置每个分支:
当输入为3时的分支执行的代码:
输入为4时对应的分支:
输入为5时对应的分支:
我们看看对应的前面板:
接下来,我们运行程序:
注意: 当条件使能结构有多个分支时,必须设置默认分支,否则程序无法执行,如下:
五、公式节点
公式节点是一种程序结构,通过公式节点,用户不仅可以实现复杂的数学公式,还能通过文本编程写一些基本的逻辑语句,如if...else...、case, while循环之类的语句。可以这么说,公式节点基木上弥补了图形化幵发语言相对于文木语言的缺陷。公式节点的语法与C语言基本相同。
接下来我们来利用公式节点进行编程:
我们添加公式节点函数,在方框的边框上右键鼠标,添加2个输入和3个输出,然后编程算法代码:
显然,公式节点不仅能实现一个公式,还能同时实现多个公式,只需要增加输入输出端子就可以了。而且,语法规则完全遵循C语言。
运行程序可以看到:
更改 a 和 b 的值:
六、实践——温度监测系统
最后,我们来做一个温度监测系统,该系统底层数据是由随机数发生器产生的20〜40 之间的随机数,其代码如下所示:
设置华氏和摄氏两种显示模式,选择华式温度时:
选择摄氏温度时:
然后设定温度上限,当温度超限时,Alarm Counter加1,这里采用了移位寄存器。LabVIEW 提供了移位寄存器,把上一次循环产生的结果 “移动” 到下一次循环的输入。添加移位寄存器的方法如下图所示:
右击 For 循环的边框,选择 添加移位寄存器 选 项,在右击点和另外一侧就会出现一个小黑框,把它与需要连接的数据连接即可。
由于存储在移位寄存器中的数据值直到关闭VI时才从内存中消除。如果没有初始化移位寄存器,就会导致在关闭VI之前前后 两次运行该 VI 的结果截然不同。由于这种情况难于预测,因而可能会使VI的运行结果难以捉摸, 因此,任何情况下都别忘了初始化移位寄存器。
接下来分析整个程序,最外层用 While 循环来控制整个系统的运行:
当用户单击 “幵始采集” 按钮后,系统幵始采集数据,执行 case循环中的 true分支对应的程序,在该分支中,用层叠顺序结构来实现“初始化”,“运行”,“结束”这3个顺序执行状态:
我们执行程序,可以看到前面板如下: