读《我和Labview》Labview编程基础2

2数组和循环结构


数组和循环结构


2.1簇

簇是Labview特有的一种复合数据结构,簇能进行嵌套
重点:簇的捆绑解绑,簇元素的顺序排列,错误簇,不在用户界面使用簇的原因

2.1.2簇控件

Cluster.png
Clustervi.png

在大多数 VI 中都能看到错误簇的身影,它构成了 LabVIEW 程序最基本的 错误处理机制。错误簇由一个布尔类型数据(值为真时表示有错误)、一个数值型数据(错误代码)和一个字符串数据(错误信息)组成的。
如果某些数据之间的相关性非常高,总是在一起被处理(比如:“是否有错”、“错误代码”和“错误信息”这三个数据),那么它们就很适合被捆绑成一个簇,这样,在不同的节点之间传递数据时,只需要一根数据线,可以让程序变得更整洁。使用簇的缺点是在处理数据的时候常常会多出“松绑”“捆绑”这个步骤。另外,一般最好不要在程序的用户界面上使用簇,它不利用调整用户界面上控件的布局。

2.1.3簇数据运算

簇能进行运算,尤其是簇中的数据都是相同类型的数据,其运算结果应该还是簇

2.2数组

2.2.1数组数据

数组和簇结构类似,不同在于一个数组中所有元素的数据类型都必须是同一种,且数组不能作为另一个数组的元素
数组的索引从0开始,可以根据索引来查看数组的元素,当数组较长,可以使用滚动条:数组控件右键菜单->显示项->垂直滚动条或水平滚动条
在前面板增加索引数量可以增加数组的维度,一维数组常用来表示一条曲线,二维数组常用来表示一个平面,一个表格或多条曲线
数组可以放入簇里面,作为簇的元素
lab14.png
数组.png

2.2.2数组数据的运算

常见三种运算:
1.数组之间的运算:各种数组函数
2.数组型运算如加减乘除等,可用于数值型数组之间,或数值型数组和数值之间
两输入数组元素个数不同时,结果数组长度等于两输入中长度较短的那个数组的长度
3.布尔型运算如与或非等,可用于布尔型数组之间,或布尔型数组和布尔值之间
lab15.png

2.2.3数组数据的比较

比较函数右键->比较模式->比较集合/比较元素
“比较元素”的意思是对两个数组中对应的每一个元素分别进行对比,比较的结果构成了一个同长度的布尔型数组。可以理解为是用来比较不同数组索引相同的元素是否相同
“比较集合”则是把数组整体作为一个整体,同另一个数组相比较,如果两个数组长度相同,每个对应元素也相同,则结果为“真”,否则为“假”。可以理解为是用来比较不同数组是否相同的
lab16.png

2.2.4数组索引

缺省:default,默认
数组索引函数是拿取数组元素最常使用的函数,索引数组函数的索引参数相当于表明想要哪个元素,
索引多个元素时:
1.若索引参数为空,缺省,则相当于输入索引0
2.当有多个索引参数缺省时,从0到后面依次排列
3.当前位索引参数有值n时,后面缺省的索引值从前位索引参数值开始计算,依次为n+1,n+2……
Labview.png
索引多维数组时:
如二维数组,索引值是成对出现的
当索引值有两个的时候,代表索引这个位置的元素;当索引值有一个的时候,代表索引数组的这一行或者这一列
Labview1.png

2.2.5数组合并

创建数组函数是合并数组,把元素添加入数组的函数
输入多个数组或元素时:
1.输入两个类型相同的一维数组时,函数默认的输入模式是“添加输入”,创建数组函数默认会将它们合并为一个二维数组
2.输入两个类型相同的一维数组时,更改创建数组函数右键菜单的“连接输入”,可以把两个数组首尾相连,合并成新的一维数组
3.输入一个非数组类型数据和一个这个类型的一维数组时,创建数组函数会把非数组数据添加到数组中去
Labview2.png
输入多维数组时:
如图,若干个二维数组被新创建为三维数组,二维数组的连接不太常用
Labview3.png

2.2.6其它类型的数组控件

除了默认的数组控件,还有图表控件表格控件强度图等控件的数据类型也是数组

2.3for循环结构

左上角的 N 表示循环迭代的总次数,由外部提供给循环结构;左下角 i 是当前迭代的次数。LabVIEW 中的 for 循环迭代计数只能从 0 开始,每迭代一次增加 1,即循环第一次迭代 i 为 0,第二次迭代 i 为 1,依此类推
1713075379035.png

2.3.1输入隧道

数据连线在通过各种结构的边框时,会形成小矩形,即隧道,负责数据在结构处的传入传出
实心隧道:禁用索引
空心隧道:启用索引
单个数据输入时,默认是实心隧道;数组输入时,默认是空心隧道,数组改成禁用索引后,将输入整个数组
数组输入时,可以选择enable和disable索引功能
使用了索引隧道的for结构,可以不用输入N值,迭代次数即输入数组的长度
如下图,循环次数和数组长度的值是相同的,因为使用了输入索引隧道,循环次数N由数组长度决定;用当前迭代次数i和索引数组函数和直接使用索引隧道自动索引得到的元素是一样的,这是因为索引隧道按i值索引
Labview4.png
1.如果在for结构同时用索引隧道索引多个长度不同的数组时,for结构循环次数取最数组长度最小值
2.如果for结构索引多个长度不同数组的同时输入N值,for结构循环次数取N值和数组长度值中的最小值;
3.如果for结构索引的数组为空,则循环次数取0
4.**如果for结构索引多维数组,每通过一次数组索引隧道,数组就降低一维度。如二维数组经过两次索引隧道即可得到所有的元素
Labview5.png
上面索引数组造成的循环迭代问题在调试中经常会遇见

2.3.2输出隧道

对于循环结构的输出隧道来说,它的输入端在循环结构之内,也就是说每次循环迭代都会传递给隧道一个数据;而隧道的输出端只有一个值。因此,循环结构的输出隧道要负责把输入的多个数据合并整理成为一个单个的数据,传递出去。我们可以给输出隧道设置不同的数据合并方式,在它的右键菜单上可以看到,它有四种模式:

  • Last value:图标是一个实心方块。这种模式只输出最后一次循环迭代传递给隧道的数据。
  • Indexing: 图标是一个空心方块。与输入隧道的索引模式先对应,把每一次循环迭代传递给隧道的数据作为数组元素,合并成一个数组传递出去。如果输入的数据已经是数组了,那么就会把输入数组增加一个维度输出
  • Concatening:图标是一个带横条纹的方块。只能应用于隧道的输入端数据的类型是数组类型的情况。与 Indexing 不同的是,输出的数组与输入数组维度相同,但是长度增加了。每一次循环迭代传递给隧道的数组,会被追加到输出数组的后面。
  • Conditional:图标为的隧道会多一个图标为问号的长方形。可以输入一个布尔值,如果输入的值为“真”,则输入数据会被保留;如果输入值为“假”,则输入数据会被忽略,不会出现在隧道的输出端。

Labview6.png

2.3.3应用实例

1.打开一文件夹下的所有vi并显示当前vi名称,同时显示进度
for-instance1.png
2.当输入的数组为空时,循环次数为0,for结构不会进行循环迭代,输出的数值为0
for-instance2.png

2.3.4移位寄存器

隧道负责循环结构内部和外部之间的数据交互,移位寄存器是用在循环结构不同迭代之间的数据交互的,在文本编程语言中,需要传递数据时,一般逻辑下最先想到的是创建一个变量,变量是传递数据的桥梁,在循环语句中更是如此。但对于Labview来讲,这与Labview的数据流驱动是相悖的,在Labview中需要数据传递时,首先要想到移位寄存器
移位寄存器是一对的,由两部分组成,分别位于循环结构的左右两侧,一次迭代结束时,数据流入循环结构右侧的移位寄存器,在下一次迭代开始时,该数据会从同一移位寄存器的左侧流出,当第一次迭代开始时,i=0,移位寄存器左侧流出初始值
yiwei1.png
移位寄存器在循环结构两端的接线端是强制使用同一内存的。即一对移位寄存器总是包含左右两部分,但这两部分中的数据是同一份;对比隧道,如一个隧道和其他隧道是全无关系的独立节点
for-instance.png
如上图实例2中的程序把输入和输出隧道更改成一对移位寄存器,执行更改后的程序,“输出整数”的值会确定是33,即便一次迭代都没有执行,数据从移位寄存器左侧流入,移位寄存器左右两侧保存的是同一份数据,所以移位寄存器右侧流出的还是33。
使用移位寄存器常见的错误是忘记给移位寄存器赋初始值,使用移位寄存器的准则:除非能够确定程序的确不需要给移位寄存器赋初始值,否则最好在循环结构外赋初始值。
lab1.png
在该程序中,没有赋初始值的情况下,每次运行vi“输出值”都会发生变化
移位寄存器的左侧接线端可以是多个,鼠标对准左侧接线端拖拽即可
yiweijicunqi1.png
如果迭代次数少于寄存器个数,或迭代还未开始,从左侧数据尚未更新的接线端出来的数据就是它们的初始值
yiweijicunqi1.png

2.3.5结束条件

->选中for结构右键->条件接线端,可以为 for 循环创建一个接收停止循环命令的接线端,类似于 C 语言中跳出循环的 break 语句:
for.png
有时候,循环尚未完成全部迭代,就已经得到所需答案,那么循环也没必要再继续。比如上图中的程序,用于查找“数组”中是否有元素与“字符串”的值相同。如果找到,则传“真”值给条件接线端,停止循环运行。
条件接线端默认为红色,输入条件为1时结束,单击条件接线端,使其变成绿色环形箭头,输入条件为1时运行,输入条件为0时结束

2.4while循环结构

while循环在循环开始前不能确定好循环的次数,只能在循环开始执行后,根据条件接线端的数据来判断是否执行下一次迭代。while循环结构类似文本语言中的do……while循环语句。如果程序的逻辑是先执行循环,在判断是否停止循环,则应当首先考虑使用while循环,反之要先考虑for循环,除了出于逻辑上的考虑,还有运行速度的原因
循环结构的隧道,移位寄存器以及反馈节点等数据传输方式大致相同,for循环的各种规则大部分适用于while循环。使用索引隧道的时候要注意:while循环的迭代次数只受控于传入“条件接线端”的数据,而不受连接索引隧道的数组长度影响,while循环的迭代次数可以超过输入数组的长度,此时无法从数组中得到有效元素的数据,输入隧道只会使用默认值
while.png
使用输出索引隧道时,while 循环的效率比 for 循环稍差。如图中的程序,分别在两种循环结构中通过输出索引隧道构造一个数组,结果数组的大小是相同的,但是for循环结构中,Labveivw在循环运行之前,就已经知道数组大小的长度是100,因此Labview预先给Array1分配了一个大小为100的数据存储空间,对于while循环的话,事先无法确定好循环次数,在循环运行过程中给Array2分配的存储空间需要不断调整,这些额外工作使得while循环的效率下降。
for循环和while循环结构的重要区别就是在循环开始之前能不能确定好循环次数

2.5反馈节点

单纯需要下次迭代使用上次的数据,可以使用反馈节点:
fankuijiedian2.png

2.5.1反馈节点的基本用法以及初始化

两种创建方法:

  • 1.直接创建:在给循环内部的某一节点连线时,如果数据流出现了一个环,Labview会自动创建一个反馈节点插在环中
  • 2.间接创建:通过移位寄存器右键菜单,可以将移位寄存器替换成反馈节点,反之亦然。

两种初始化表示:

  • 1.默认表示:初始化接线端在下方
  • 2.右键菜单->Move Initializer One Loop Out:初始化接线端移到循环结构左边框上

fankuijiedian1.png
两种初始化方式:

  • 1.Initialize On Compile Or Load:反馈节点图标“米”字形,表示只在装入内存或者被重新编译后初始化一次
  • 2.Initialize On First Call:反馈节点的图标 “人”字符号,它表示每次启动运行 VI,反馈节点都会被初始化

fankuijiedian3.png
第一次运行:result1=2;result2=2
第一次运行:result1=4;result2=2
第一次运行:result1=6;result2=2
………………………………………………………………………………

反馈节点还有个启用输入端,右键菜单->显示启用接线端/Show Enable Terminal 可以显示出这个输入端。它的输入为真时,反馈节点正常工作;输入为假时,反馈节点则在这一次迭代中不工作,继续保持上一次迭代时的数据。
fankuijiedian4.png
在上图程序中,反馈节点只有在 i 为偶数时才工作,因此程序的功能是在统计 0~4 这五个整数中有几个偶数,结果为 3

移位寄存器除了可以返回上一次迭代的数据,还可以返回上 n 次的迭代数据。反馈节点也有类似功能(并不完全相同)。右键菜单->属性配置对话框,在配置中可以选择延时的次数.
fankuijiedian4-1.png
fankuijiedian4-2.png
fankuijiedian4-3.png
延时设置为3,结果如图所示

2.5.2反馈节点的使用

反馈节点和移位寄存器的功能和本质是完全相同的。反馈节点的优点在于不需要从循环的边框上连数据线,节点类函数控件都有一个特点就是不和有关联的结构和其他控件相连,但底层存在逻辑,如反馈节点实际依赖循环结构

使用反馈节点两点需要注意:
1.在多层嵌套循环中,反馈节点会被包含它的每一层循环结构调用
2.反馈节点与包含它的循环结构不一定位于同一个 VI 中

2.5.2在子VI中直接使用反馈节点

fankuijiedian5-3.png

  • 上图中的反馈节点脱离了循环结构,反馈节点可以建立自己的移位寄存器。上面为一个计数器/counter功能的vi,程序运行后,该vi每被调用1次,输出加1
    下面程序用于测试该子vi:
    fankuijiedian5-1.png
    如图在两处调用了同一个子vi,但两处分享了同一个移位寄存器。
    fankuijiedian5-2.png
    在不同的两个循环里也是如此
    只有把子 VI 设置成为每个实例都生成副本的 可重入运行方式 时,不同的子 VI 实例才具有独立的移位寄存器
posted @   Ananke_Sheqk  阅读(101)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示