济南大学自动化与电气工程学院授课教师:谢锦丽E-mail:cse_xiejl@ujn.edu.cn联系方式:13793128018虚拟仪器技术1济南大学自动化与电气工程学院虚拟仪器技术数组、二维数组•数组:是一系列相同数据类型元素的集合。•数组元素是根据其索引来访问的:每个元素的索引值在0到N-1之间,N是数组元素的个数。•创建数组是将数组框架与数据对象结合起来创建数组控件和指示器。•所有的元素要么都是控件,要么都是指示器,不能混合使用。•For循环和While循环可以在边界上自动索引并累加数组——每次迭代创建一个新的元素,该功能称为自动索引。•自动索引功能在For循环中是默认打开的,但是在While循环中是默认关闭的。2济南大学自动化与电气工程学院虚拟仪器技术数组、二维数组•For循环边界上的自动索引数组,每次迭代时都创建下一个数组元素。在循环结束后,循环输出数组到指示器,而在循环结束之前,所有的数组数据都是不可用的。•关闭自动索引,只有随机数函数的最后一个值从循环输出•在打开For循环输入数组上的自动索引后,LabVIEW会将循环次数自动设置成数组的大小,因此就不需要连接值到计数端子。如果赋给LabVIEW的循环次数发生冲突——例如,同时使用外部定义循环次数和自动索引(或者自动索引两个不同大小的数组),LabVIEW设置循环次数为其中最小的值。•二维数组以类似表格的形式存储元素,需要使用两个索引来定位一个元素:列索引和行索引。3济南大学自动化与电气工程学院虚拟仪器技术数组处理函数•初始化数组:该函数创建并初始化具有指定值的n维数组。•数组大小:该函数返回输入数组中元素的个数。•创建数组:该函数可以将两个数组合并或组合成一个数组,或为数组添加额外的元素。•数组子集:该函数返回从“索引”端子指定索引开始,长度为“长度”端子指定值的部分数组元素子集。注意,由于索引是从0开始的,第n个元素的索引是n-1。•索引数组:该函数范围数组中特定的元素。•删除数组元素:该函数删除数组的一部分,从“索引”开始,长度为“长度”指定的值的元素。与数组子集函数一样,删除数组元素函数返回数组的一部分,但是它返回的是原数组被删除后剩下的部分。4济南大学自动化与电气工程学院虚拟仪器技术复合运算•复合运算函数能够同时处理多个数据。在需要多次使用加、乘、与、或和异或函数时,复合运算函数避免了一次性使用多个这样的函数。•在输出端子的弹出菜单上选择“更改模式”改变函数的功能。同样可以使用操作工具单击函数来改变模式。•弹出菜单中“逆操作”选项来反转数字输入或输出的极性或布尔值(从假到真,或真到假)。输入和输出上的小圈表示极性反转。5济南大学自动化与电气工程学院虚拟仪器技术4.6簇•簇是一个组合数据类型结构。•簇元素数据具有绑定和释放概念。释放元素后可以访问其中的元素,可以一次性全部释放,也可以按索引释放指定元素,这取决于选择使用的函数。•不像数组可以动态的改变大小,簇有固定的大小,相当于其内部有固定数量的线,每根线代表一个元素。•簇里面的对象必须全都是控件或者全都是指示器,在同一个簇中不能既有控件又有指示器。簇是控件还是指示器取决于首次放入其内部的对象属性。•创建簇两个步骤:在前面板或程序框图中放置簇框架;添加需要的控件、指示器或常数到框架内。•簇内元素具有固定的逻辑顺序,与它们在框架内的位置无关。第1个放入簇的对象为元素0,第2个为元素1,以此类推。6济南大学自动化与电气工程学院虚拟仪器技术4.6簇•使用簇将一些控件和指示器绑定起来,就可以使用单个端子连接子VI,传输多个值,减少连接到子VI的连线和端子的数量。•只有类型相同的簇之间才可以连接。即:两个簇必须有相同的元素个数,且对应元素必须有相同的顺序和数据类型。只要数据类型相同,数组中的多态性同样适用于簇。•释放函数,将簇分解成单个的元素,根据索引访问元素,必须访问整个簇并且考虑簇中元素的顺序。按名称释放函数,同样是分解簇为单个元素,但是根据标签访问元素,可以访问任意数量的元素。•绑定函数,将单个的元素组成新的簇或者使用簇代替元素。按名称绑定函数不能绑定簇,但是能够替换簇中的单个元素而不需要访问该簇,另外,使用按名称绑定函数,不需要担心簇顺序和正确的绑定函数大小,只需要确认所有元素都有名称即可。7济南大学自动化与电气工程学院虚拟仪器技术4.6簇•练习:创建VI,检测输入簇中的Numeric1数值控件的值是否大于等于0。如果小于0,VI计算所有控件的绝对值。如果大于等于0,VI不用计算任何空间的绝对值。无论Numeric1的绝对值是什么,VI都将所有的值乘以0.5并将结果显示在OutputCluster上。8济南大学自动化与电气工程学院虚拟仪器技术4.6簇•1.打开新的前面板并放置簇框架(新式——数组、矩阵与簇),标记为InputCluster。•2.函数——编程——数值子选项卡创建Numeric1、Numeric2和Slide控件,从选项卡选取控件时,要放置在簇框架的内部,且一定要以指定的顺序创建,分别为其设置标签。•3.根据同样的方法使用指示器创建OutputCluster,放置元素的到簇的顺序要与InputCluster相同。(可通过复制InputCluster来创建OutputCluster,更改标签。)•创建程序框图,包括选择(Case)结构的True和False两个分支。9济南大学自动化与电气工程学院虚拟仪器技术4.6簇•按名称释放函数(编程——簇、类与变体):从InputCluster中提取Numeric1,然后与0比较,如果“Numeric1”没有出现在输入出名称区域,使用操作值工具单击,从簇元素列表中选择Numeric1。•大于或等于0函数(编程——比较):如果数字输入是正数或者0就返回True。10济南大学自动化与电气工程学院虚拟仪器技术4.6簇•绝对值函数(编程——数值):输入数值大于等于0时,返回输入数值;输入数值小于0时返回输入数值的相反数。在本练习中,取整个簇的绝对值。•5.运行VI,给Numeric1既输入正数又输入负数。注意使用多态性,给簇中的所有值一次性乘以0.5并计算整个簇的绝对值。•6.保存11济南大学自动化与电气工程学院虚拟仪器技术第4章LabVIEW的复合数据•4.1数组•4.2二维数组•4.3数组处理函数•4.4多态性•4.5复合运算•4.6簇•4.7数组和簇的转换•4.8错误簇和错误处理函数12济南大学自动化与电气工程学院虚拟仪器技术4.7数组和簇的转换•LabVIEW中包含的数组操作函数比簇操作函数多,因此数组和簇之间的转换非常有用。•例如:如果想要把前面板上按钮簇中所有按钮的值都反转,那么“反转一维数组”函数是很好的选择,此时可以使用“簇至数组转换”函数将簇转化成数组,再用“反转一维数组”函数反转数组的值,最后再使用“数组至簇转换”函数转换回簇。•函数——编程——数组/簇、类与变体13济南大学自动化与电气工程学院虚拟仪器技术4.7数组和簇的转换•簇至数组转换函数:将具有相同数据类型的N元素簇转换成相同数据类型的N元素数组。数组的索引对应于簇顺序(例如:簇元素0编程数组中索引0的值)。•LabVIEW不允许创建数组的数组,不能对包含以数组为元素的簇使用此函数。•在使用该函数时,簇中的所有元素的数据类型必须相同。•数组至簇转换函数:函数将N个元素的一维数组转换成相同数据类型的N元素簇,必须在函数端子的弹出菜单上选择簇大小指定输出簇的大小,因为簇不会像数组一样自动调整大小。14济南大学自动化与电气工程学院虚拟仪器技术4.7数组和簇的转换•簇大小的默认值是9,如果数组非空且小于簇大小所规定的元素数量,LabVIEW会自动填入额外的值到簇,这些值就是簇内元素数据类型的默认值(数值型:0;字符串型:空字符串;布尔型:假)。如果输入数组的元素数量大于指定簇大小,输入数组会被截断以适合簇大小所规定的元素数量。•输入簇大小必须与连接到其输入数据的元素数量匹配,否则,输出连线会保持中断直到簇大小调整合适。15济南大学自动化与电气工程学院虚拟仪器技术4.7数组和簇的转换数组和簇的比较函数模式•一些比较函数在比较数组和簇的数据时有两种模式:集合比较模式和元素比较模式。在比较节点的弹出菜单的比较模式子菜单中选择需要的模式。•集合比较模式下,比较函数返回集合整体比较厚的布尔值。当且仅当所有元素的比较结果都为真时返回值才是真。在元素比较模式下,返回一个布尔型的数组或簇,里面数据是基于每个元素的比较结果。16济南大学自动化与电气工程学院虚拟仪器技术第4章LabVIEW的复合数据•4.1数组•4.2二维数组•4.3数组处理函数•4.4多态性•4.5复合运算•4.6簇•4.7数组和簇的转换•4.8错误簇和错误处理函数17济南大学自动化与电气工程学院虚拟仪器技术4.8错误簇和错误处理函数•错误是函数或子VI因为资源不可用或接收到的消息不正确而不能完成请求的事件。•错误输入/错误输出函数:控件——新式——数组、矩阵与簇子选项卡,可以用于许多VI和函数的输入/输出上。•LabVIEW中错误簇是一个特殊的数据类型:由布尔型状态、I32型错误代码和字符串型错误源组成。用来传送LabVIEW代码运行时产生的错误信息。•在LabVIEW中使用数据流传输错误簇数据类型中的错误信息。18济南大学自动化与电气工程学院虚拟仪器技术4.8错误簇和错误处理函数4.8.1错误簇数据类型错误簇包含了3个元素:•1.状态:布尔型,表示是否有错误发生(真或假)。•2.代码:I32型,错误代码,用于标志错误的有符号整数。a.错误代码为正数表示错误;b.错误代码为负数表示警告。c.0表示没有错误•3.源:字符串型,包含错误源描述信息的字符串。通常包含调用链,调用链是一个VI列表,从错误发生处的子VI(或函数)开始,然后根据调用的层次,列出直到顶层的所有VI。19济南大学自动化与电气工程学院虚拟仪器技术4.8错误簇和错误处理函数4.8.2传输错误信息:错误流•LabVIEW本身就是一个基于数据流的编程语言,对于错误信息的传递也是使用数据流的形式在LabVIEW的程序框图中实现。如下图中的红点标识处所示,错误簇数据在框图中是按顺序、连续的在程序中传递。•很多LabVIEW函数以及子VI都有错误输入(ErrorIn)以及错误输出(ErrorOut)端点,一般这两个端点分别位于函数节点图标的左下侧以及右下侧。20济南大学自动化与电气工程学院虚拟仪器技术4.8错误簇和错误处理函数4.8.3子VI中错误的产生和响应关于错误的产生和响应,希望函数和VI能完成以下的功能。•1.如果“错误输入”包括错误(状态为“真”),不需要做任何处理,除非进行“结尾”工作,例如:a.关闭相关的文件。b.关闭相关的设备或断开相关的连接。c.使系统回到空进程/安全状态(关闭电机等)。•2.如果错误发生在函数或者VI内部,函数就必须通过“错误输出”端子输出错误信息,除非已经有错误信息从“错误输入”端子输入,这种情况下只需要将从“错误输入”进入的错误信息原封不动的输出到“错误输出”。21济南大学自动化与电气工程学院虚拟仪器技术4.8错误簇和错误处理函数错误选择结构•通过使用错误选择结构,可以轻易的实现上述第2条的常规错误处理动作。错误选择结构就是一个有错误簇连接到其条件端子的选择结构。选择结构允许错误簇数据类型连线到条件选择器端子。连线之后,选择结构的帧名改变为“无错误”和“错误”。在执行时,如果错误簇不包含错误,那么执行“无错误”帧,反之,如果错误簇包含错误,那么就执行“错误”帧。•实现上面提到的第2条功能只需要将错误帧中错误簇直接连接到VI的错误输出端,将没错误的情况下的执行代码放到无错误帧中。22济南大学自动化与电气工程学院虚拟仪器技术4.8错误簇和错误处理函数错误数据融合•在程序中如果上游的函数就已经出错了,这是需要做清理工作该怎么办?这时就不便使用错误选择结构了,最好就是使用合并错误(MergeError)函数将所有的上游错误融合在一起。•函数——