【LabVIEW】程序结构使用汇总
(包括:while循环、For循环、事件结构、条件结构、公式节点)
一、while循环
1、必要的循环时间间隔
LabVIEW 在执行While循环时,如果用户没有给它设定循环时间间隔,那么它将以CPU的极限速度运行。
按下Ctrl+Alt+Delete 快捷键打幵任务管理器,可以看到它几乎将CPU全部利用, 正常情况这样做比较危险,因为这样可能会导致整个 LabVIEW 程序看上去跟“死 掉” 一样。
在很多情况下我们没有必要让 While 循环 以最大的速度运行,所以最好给 While 循环 加上时间间隔。
有两种方法:一种是在每个循环中添加一个等待时间,只有在等待完毕后才运行下一个循环。
另一种方法是使用定时循环(Timed Loop)。
2、测试每次循环执行的时间
3、结束循环
在循环上(边框)点右键,选择“条件接线端”。(For循环类似)
4、结束程序运行的几种方法
(1)使用条件接线端终止循环
直接用条件接线端停止所有循环退出程序,下一次无法再继续运行循环。
也就是说,如果该VI是子VI,并且有个循环是需要在下一次打开VI时再次运行的,那么这种方法并不适用。
(2)Stop函数(在应用程序控制里可以找到)
结束整个VI的运行,并不会关闭前面板。并且,如果VI是子VI,会连主VI一起结束。
(3)VI方法Abort VI
和Stop函数一样不会关闭前面板,并且如果VI是子VI,那么会报错:VI的状态与该操作不兼容。
个人认为,上述三种方式都只适用于该VI不是作为子VI的情况下使用。
一般情况下,我们调用子VI并打开前面板操作,都是通过设置子VI属性来实现的,如下图:
这种情况下,如果需要关掉一个带循环的子VI,并且在下一次打开VI时继续运行循环,使用上面三种方法是没办法实现预期功能的。应该通过动态加载VI面板来实现。
通过该子VI的路径来打开前面板并执行VI。此外,在该子VI的事件中,需要处理退出程序的操作:
二、事件结构
1、使用
事件结构,即仅当 “事件” 发生时,程序才作相应的响应。 通过事件结构,程序可以变得很简单,并降低CPU利用率。当多个事件发生时会形成事件队列, 直到每个事件对应的代码都被执行为止,因此不会有事件被漏掉的情况。
注意:事件结构必须放在 While 循环中,否则没有意义,因为当一个事件完成后,程序 需要去等下一个事件的发生。
在跟用户进行交互的时候,尽量使用事件结构。
2、使多个事件分支执行相同的功能(多种事件进入相同条件分支)
(1)条件为数值类型
用英文逗号隔开:
(2)字符串类型
用英文逗号隔开,且每个条件都要加英文双引号:
3、如何让子VI响应主VI触发的事件
状况:主程序调用一个事件结构(比如当一个按键值改变时触发事件)响应的子vi时,主程序对应按键值改变时,子vi中的相应事件无法响应。通过建立按键的引用去驱动子vi的事件也没有生效。
参考方法:
(1)主程序上放置 一个控件,创建一个引用控件,并拷贝到子VI。
(2)创建用户事件进行触发。
http://www.cpubbs.com/bbs/thread-157242-1-1.html
4、事件结构和while循环的使用
(1)事件结构要嵌套在while循环里执行,否则执行一次就会结束
(2)事件结构要设置超时时间,否则while循环一直会停在此次循环中直到执行某个事件后才进入下一次循环。
(3)若while循环中放置了等待控件,则一次while循环最少需要 "等待控件时间"和 "事件结构超时"两者之间较大的那个时间值。
简单画个流程图:
·进入第一次while循环
·执行while循环体里的程序,事件结构开始等待事件产生并处理
·事件超时时间到或等待控件时间到? 是则进入下一次while循环,否则继续等待。
·若等待控件时间没到,而事件结构超时已到,则此时触发事件时,事件结构不会响应,但会放在事件队列里,在下次while循环里执行。
如下图这段简单的程序,事件结构100ms超时后,此次循环内不再响应事件,到下次循环才响应。
https://blog.csdn.net/sinat_28530785/article/details/98207879
三、条件结构
1、隧道
在条件结构一个分支的边框上创建输出隧道时,其他分支边框上也会出现输出隧道。只要有一个输出隧道没有连线,则条件结构每个分支边框上的输出的隧道都显示为白色正方形。
隧道可使用数据类型的默认值,不是每个速调都必须连线。
在条件结构上右键单击输出隧道,从快捷菜单中选择未连接时使用默认,这样所有未连线的隧道都将使用隧道数据类型的默认值。
索引隧道,一个循环外的数组通过索引隧道连接到循环结构上,隧道在循环内一侧会自动取出数组的元素,依顺序每次循环取出一个元素。用索引隧道传出数据,可以自动把循环内的数据组织成数组。
2、移位寄存器
通过移位寄存器传入传出数据,也是数据的类型和值都不会发生变化。移位寄存器的特殊之处在于在循环结构两端的接线端是强制使用同一内存的。
因此,上一次迭代执行产生的某一值,传给移位寄存器右侧的接线端,如果下一次迭代运行需要用到这个数据,从移位寄存器左侧的接线端引出就可以。
移位寄存器如何创建:
点击循环结构上的节点——右键——替换为移位寄存器
同样在这里右键可以替换为隧道。
四、(层叠式)顺序结构
只有连接到结构的数据到达结构,层叠式顺序结构才开始运行。只有当所有帧执行完毕后,各个帧才会返回所连接的数据。
1、在层叠式顺序结构的帧之间传递数据
(1)转到传出的数据所在的帧。
(2)右键单击结构右侧边框,从快捷菜单中选择添加顺序局部变量。
(3)连接要传递的数据和顺序局部变量。接线端上将出现一个向外的箭头。
(4)在顺序结构的帧中,将顺序局部变量接线端连接到需从上一帧接收数据的任意接线端。其后的帧中的接线端将出现向内的箭头,表示该接线端是该帧的数据源。
注: 如帧位于与顺序局部变量接线端相连的第一个帧之前,则该帧不可使用顺序局部变量接线端。
五、常见问题
1、部分选择器无对应分支
当条件结构有多个分支时,必须设置默认分支,否则程序无法执行。
在所有分支都确认无误的情况下,该错误可能是没有设置默认分支导致的,将一个分支设置为默认分支就好了。
2、已连接两个不同类型的接线端
在使用移位寄存器的时候,输出端提示接线错误,已连接两个不同类型的接线端。
但是线都是一个数据类型直接连过去的,中间没啥变化。
找半天发现中间经过一个for循环的时候,节点是索引数组的图标,应该是实心的才对。
最后把这个for循环隧道模式从“索引”改为“最终值”,接线就没有错误了。
3、错误输出后如何调出错误描述
在error out连接线上右键选择 簇、类与变体选板——按名称解除捆绑