读《我和Labview》5条件结构和顺序结构
5.1条件结构
Labview的条件结构由多个分支组成,每个分支有不同的程序代码,根据输入数据的不同,每次只执行其中一个分支中的代码
相当于C语言中的if else和switch语句功能
分支选择器:条件结构左侧带问号的小矩形是分支选择器。条件结构根据流入分支选择器的数据的值来决定执行某一分支内的代码
选择标签:条件结构上方带文字是矩形方框是选择标签。文字表示了当前显示的分支的条件
5.1.1布尔类型条件选择结构
条件结构常见的程序模式:向分支选择器输入一个比较的结果
布尔型条件结构和错误簇的联系:
Labview中最常见的布尔型条件结构是用来处理错误簇的。很多子VI都有两个专门用于错误处理的参数:"错误输入"和"错误输出",。子VI中最外层的结构就是一个条件接哦古,"错误输入"的数据线直接连至它的分支选择器
5.1.2其它数据类型的条件选择
字符串、整数和枚举类型的数据也可作为条件结构的条件。这三种类型的数据通常使用的值比较多,相应的条件结构也需要配备多个分支去处理不同的条件值。
例子1:整数输入条件结构
一个分支可以对应多个条件,不同条件间用逗号(英文逗号,)隔开表示范围时用 英文句号..
上图中程序的分支如下:
- 分支1:条件为0时以及默认进入该分支
- 分支2:条件为1时进入该分支
- 分支3:条件为3或5时进入该分支
- 分支4:条件为2,4或6时进入该分支
- 分支5:条件为7-11时进入该分支
- 分支6:条件为大于12时进入该分支
不同的分支条件是唯一的。如果同一个条件出现在不同的分支标签中,VI会报错
例子2:字符串输入条件结构
- Labview在处理数值和字符串时的行为不一致:
当条件结构接收条件数据为整数时,分支条件1..3
表示条件1,2,3都可能会落入这个分支
当条件结构接收条件数据为字符串时,分支条件"1".."3"
表示只有条件"1"和"2"会落入这个分支,而条件字符"3"进入不了。
如果要接收到"0"到"9"的所有字符,条件就必须设为"0"..":"
(":"是”9“的下一个字符)或
"0".."9","9"
;同理,如果要接收字符"b"、"c"、"d",就要设为"b".."e"
或"b".."d","d"
字符串条件行为不同的原因是字符串可以任意长度。没法直接定义任意一个确定字符串前面的那个字符串。如没有办法直接定义所有以字符串"a"开头的字符串,就只好使用"a".."b"
来表示。
5.1.3是否要设置默认分支?
1.如果输入的条件是布尔类型数据,条件结构只需要两个分支,一般不用考虑设置默认分支
2.如果输入的条件是其它类型的数据,条件结构已有的分支不能覆盖所有可能时,VI会报错
使用默认分支会造成风险,参考作者本章自述(代码维护性及bug调试)
5.1.4合理设置选择条件
Labview条件结构的主要缺陷:每次只能显示一个分支中的代码。用户翻页才能看到其它分支的代码,严重影响程序的可读性。
为了抵消这个缺点,涉及条件结构应首先尽量避免嵌套的条件结构,其次再尽可能减少分支数量。利用条件选择器可以接收多种数据类型、每一分支可以处理多个条件的特点,合理设置条件结构的判断逻辑,可以大大简化代码的复杂度
例子1:要求比较两个输入整数:a和b。a>b
时,弹出对话框显示“a>b”;a=b
时显示"a=b";a<b
时显示“a<b”.编写这个程序并不困难,但是如果直接按照程序要求的逻辑来编写程序,程序中会出现一个嵌套的条件结构:
所以需要改变思路,提高程序的可读性。改动程序的条件判断逻辑,即可避免条件结构的嵌套
下图程序中还有一个优化之处,就是把每个条件分支中共同的代码"单按钮对话框"提取到结构之外,这样即可改善程序的可读性,也可以提供程序的运行效率。把共同的代码放在结构外面,这个原则再条件结构中是务必遵循的
5.1.5条件结构隧道
条件结构的隧道只有一种
条件结构每次只执行某一分支的代码,但编程的时候并不知道某一次运行会执行哪个分支,所以每个分支都必须为输出隧道的输入端接上数据线,但多数情况下,可能只有某个分支中才会产生一个有意义的输出数据,供结构外代码使用,其它分支只需提供一个默认值就可以了。
输出隧道有个设置是"未连线时使用默认值",这样当某一分支不传递任何数据给这个输出隧道的输入端,输出隧道就使用该数据类型的默认值作为输出
这里涉及"未连线时使用默认值"的考量,与上文提到的是否要未条件结构设置默认分支问题非常相似
快捷方法:许多时候条件结构的输出隧道与输入隧道相对应。如果希望把这种有对应关系的输入输出隧道在各个分支里,一次性都连接起来,可以先连上其中一个,然后切到其它分支中,隧道鼠标右键->连接输入隧道->创建并连接未连接的分支
5.1.6避免把控件放在条件结构内
例子1:一个VI有两个输入参数,一个是整数"condition",一个是实数数组"input array",一个输出"output array",当condition=2时,input array中每个元素都加1输出
如果写类似下图的程序:
有两个问题:
1.逻辑上容易出错,输出控件被放在了条件为2这个分支中,如果程序执行了其它分支,那么不会有数据传递给输出控件"output array'',那么它的输出值是不确定的(它会保持上一次的值,但我们并不确定程序运行上次是什么值),这会导致引起它的程序代码得到意料之外的结果
2.这样代码运行效率会差很多
所以编写类似程序,一定要注意把输入输出控件放置在条件结构外:
5.2选择函数
在Labview中,条件结构的可读性比较差,但作为程序必不可少的一种结构。某些情况下,可以使用选择函数来代替,或者通过改变程序的条件判断逻辑来使用,提高程序的可读性
编程->比较->选择函数
选择函数有三个输入,其中第二个输入参数必须是布尔类型,另外两个参数的数据类型必须相同,类似C语言中的y = x ? a : b;
语句
转化为下面程序:
5.3顺序结构
5.3.1程序执行顺序
Labviews是数据流驱动的编程语言,程序沿着数据在连线上的流动方向顺序执行。Labview也是自动多线程的编程语言
如果程序中有两个并行放置,之间无任何连线的模块,Labview的自动多线程会把它们放置到不同的线程中并行执行。
如果是先后之间有连线,则遵循数据流驱动的特性,数据从左往右流动,一般从左往右执行
可以当成并联串联,串联按数据流动方向依次顺序执行,并联时并行执行
具体详细内容请看书中本节内容,有举例说明
5.3.2创建顺序结构
没有数据线相连的各函数或子VI之间,可能有时也需要执行顺序的依赖关系,假设上图程序Sub VI A完成的工作是在某文件中写入一个数据,Sub VI B是需要从文件中读出此数据,那么应该线按顺序执行完Sub VI A,再执行Sub VI B,这时可以去使用平铺式顺序结构。
右键菜单可以添加新的帧,当程序运行到顺序结构时,会按照帧的顺序依次执行每一帧。平铺顺序结构按照从左到右的顺序执行每一帧的代码
放置结构的时候,都可以先放程序框图,再往里面放程序;
或者直接选择程序框图,圈住程序
顺序结构有两种模式:平铺式和层叠式。两种模式的功能完全相同,但表现形式不同
5.3.3层叠式顺序结构
Labview的早起版本只有层叠式,现在层叠式顺序结构已经在函数选板上消失了,这一发展恰好体现了Labview推荐的编码风格
假设需要编写一个VI,用于测试的代码运行所耗费的时间
由于记录时间的代码部分,与被测试的代码部分并无数据线相连,而它们之间又必须以一定的先后顺序执行,所以可以考虑使用顺序结构。
第0帧记录下系统当前的时间,也就是测试代码运行前的时间;第1帧中的代码是被测试代码;第2帧再次读取系统当前时间,这个时间减去第0帧读到的时间,就是第1帧测试代码运行的时间
这个程序的麻烦之处:第2帧需要用到第0帧提供的起始时间。也就是说,在第0帧产生的那个时间数据,需要传递到第2帧中去。由于两个接线端不在同一帧上,无法直接将这两个接线端连线。在此情况下,需要借助"顺序局部变量"。顺序结构右键菜单->添加顺序局部变量。局部变量未接线时是淡黄色的小矩形,接线之后变成与数据线颜色相同的箭头。然后后续的帧中,可以根据需要来引用数据。==在顺序结构中,每个顺序局部变量只能选择其中一帧将数据写入,其后的所有帧都可以从中读取写入的数据,但在这之前的任何帧中,顺序局部变量仍然是个实心矩形,表明在这些帧中都不能读写。
第0帧
第1帧
第2帧
顺序结构的隧道
顺序结构的隧道与选择结构的隧道类似,负责把数据传进或传出结构。在层叠式顺序结构中,对于输入隧道,每一帧均可从它读出数据;对于输出隧道,只能有一帧与其相连,写入数据
5.3.4平铺式顺序结构
优先使用平铺式顺序结构,平铺式顺序结构不需要使用顺序局部变量,且可读性高
5.3.5无形胜有形的最高境界
手中无剑才是最高境界,对于顺序结构来讲,不用顺序结构才是最高境界
设置无错误后延时读取仪器数据VI程序介绍
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具