两种循环
如果使用过其他编程语言的话,对于需要重复执行的代码要怎么处理可能就会想到循环结构。在LabVIEW里面提供了两种循环结构来完成这个工作。在VI 程序里面可以使用For循环或者是While循环来控制重复执行的动作。For循环将按照设定次数循环执行,While循环则是将不停执行直到某种设定条件出现才会停止执行。在LabVIEW的函数工具板上的Programming>>Structure就可以看到这两种循环结构。
For循环
For循环执行其框内的代码(我们又称其为子框图subdiagram),执行次数为初始设定的执行次数。该执行次数可以通过For循环结构左上方的计数端子(count terminal)进行设定。具体设定方法就是在该结构外面将一个整数值连线到这个端子。如果连接的整数值是0,那么这个循环就不执行。
For循环结构如下图所示:
循环结构内部的计数值为当前已执行的循环的次数,第一次运行循环时该值为0,第二次运行循环时该值为1,直到N-1(N为设定的总循环次数)。For循环与下面的伪代码类似:
for i = 0 to N-1
Execute subdiagram
While循环
While循环将一直执行其框内的子框图直到连接到其条件端子上的布尔量的值为真才会结束执行。LabVIEW在运行While循环的时候,将在每一次循环执行之后检查条件端子的值,如果该值为假就会进行下一个循环,否则就会停止循环。
While循环里面的计数值与For循环结构里面的计数值的用途是一样的。While循环与下面的伪代码类似:
Do
Execute subdiagram
While condition is FALSE
(Until condition is TRUE)
对于While循环结构里面的条件端子,我们还可以通过在其上右键点击并从弹出的菜单中选择Continue if True,将其设定为当该值为真的时候继续循环、为假的时候停止循环。
另外,如果需要将VI程序框图中的循环结构更换为其他类型的循环结构时,可以通过在结构外边缘点击右键并在弹出菜单中选择要更换的类型即可(以Replace开头)。只能够在类型结构之间才能完成更换。
自动伸展(Auto Grow)
所有LabVIEW结构都有一个自动伸展(Auto Grow)的属性,可以在结构的右键菜单里面选中或是不选中Auto Grow选项来打开或关闭该属性。当打开该属性时,这个特性会有两个用途。第一个就是,当你在结构框图内放置新的对象时,如果该对象已经超出了结构的边界,结构就会自动伸展以将其全部包含在其框图之内。第二个就是,使用这个属性就能防止将结构缩小到比其内部对象还要小。这两个用途是用来防止结构体内部的对象无法看到。
也可以通过菜单Tools>>Options...来打开LabVIEW选项对话框,在Block Diagram部分通过Place structures with Auto Grow enabled之前的选择框来设定在LabVIEW中添加新的结构是是否默认启用该功能。
移除结构而不是删除它们
当不想使用某个结构的时候,我们可以移除它,不过有一点你需要小心。如果你删除了一个While循环,你将会同时删除其内部的全部对象,包括了函数、子VI、连线等等。
除非你确实不想要这个结构内部的全部代码了,否则不要在选中结构之后按Delete按钮全部删除。我们可以在结构框图上点击右键,在右键菜单中选择Remove While Loop(对于While循环)或Remove For Loop(对于For循环)来移除结构。这样就只会移除结构,但是结构内部的框图将会保留下来。从结构外部到结构内部的各个连线也将会保留下来。
循环内部的端子的问题
在循环与外部传入、传出数据都是使用循环结构外框上的叫做隧道(tunnel)的小方块。由于LabVIEW是以数据流的方式执行代码的,对于循环结构的输入数据是在循环执行之前输入的。而循环输出的数据则是在全部循环结束运行之后才输出的。
同样的,由于数据流的关系,如果对于某个变量需要每个循环都要检查或更新的话,就需要把该变量放置到循环内部。以下图为例,While循环在每次循环的时候都检查一下布尔量控件的值,当该值为真的时候结束循环。
如果如下图所示,将布尔量控件放置在While循环结构之外。那么根据布尔量控件的初始值就创建了一个死循环或者是只执行一次的循环。因为根据数据流的流程,LabVIEW在开始执行循环之前读取了布尔量控件的值,而不是在循环内部或循环结束之后读取该值。
对于其他类型的控件也是一样的道理的,如果需要每次循环更新或检查一次就需要把控件放置在循环结构内部。