第4章LabVIEW的循环与结构LabVIEW中除了拥有C语言中所有的程序结构外,还有一些特殊的程序结构,如事件结构、公式节点等,通过这些可以方便快捷地实现任何复杂的程序结构。LabVIEW中的结构放置在程序框图中,其外形一般是一个大小可以缩放的边框,当它与其他节点的连线有数据传递时,边框内的一段代码将反复执行或有条件执行或按某一定的顺序执行。结构内的该段代码则被称为子框图。结构框图可以看成是个代码容器。容器内的代码按照某种条件反复执行。第4章LabVIEW的循环与结构4.1For循环4.1.1For循环的组成LabVIEW中的循环与结构位于程序框图的“函数”选板下的“结构”子选板中,如图4-1所示。图4-1“结构”子选板界面4.1For循环找到For循环后,用鼠标左键单击For循环后会发现鼠标箭头变成一个表示For循环的小图标,此时用户可在程序框图上用鼠标拖放一个任意大小和位置的For循环边框,如图4-2所示。4.1For循环For循环相当于C语言中的下列程序代码:for(i=0;iN;i++){};N:总循环次数,i:循环变量,初值为0,增值为1,循环体内为代码4.1For循环图4-2For循环界面4.1For循环循环体,代码有输入、输出端子循环变量i,仅有输出最基本的For循环由循环框架、总数接线端(输入端)、计数接线端(输出端)组成。与其他语言相比,LabVIEW中的For循环除具有一般For循环共有的特点外,还具有一般For循环没有的独特之处。LabVIEW中没有类似于其他编程语言中的goto之类的转移语句,一旦确立了For循环执行的次数并开始执行后,只有达到输入的循环次数才能终止其运行。如果确实要跳出此循环,可以用While循环来代替For循环。4.1For循环4.1.2简单For循环应用示例图4-3简单For循环示例FOR循环简单示例?没有连加4.1.4移位寄存器在For循环内的应用移位寄存器是LabVIEW的循环结构中的一个附加变量对象,其功能是将当前循环完成的某个数据传递给下一个循环。一般来说,移位寄存器可以存储任何类型的数据,但是连接在同一个寄存器两个端子上的数据必须是同一类型的。移位寄存器的类型与第一个连接到其端子之一的对象数据的类型相同。起到C语言中,i++的作用。在LABVIEW中,不支持变量的自赋值。只能通过移位寄存器解决。图4-5For循环移位寄存器示例4.1.4移位寄存器在For循环内的应用当前的i上一次的i当前循环的结果值上次循环的结果值图4-6For循环中不添加移位寄存器的结果4.1.4移位寄存器在For循环内的应用4.1.3自动索引在For循环内的应用自动索引的功能是使循环框外面的数组成员逐个进入循环框内,或使循环框内的数据累加成一个数组输出到循环框外面。循环内--》循环外,元素--》数组,一维---》二维,自动索引值,在完成循环后才一次性输出。For循环的索引可通过鼠标右键单击循环边框的数据通道来启动。尽管For循环和While循环都支持自动索引功能,但其主要区别在于:For循环的数组默认为能自动索引,如不需要索引,可在数组进入循环的通道上单击鼠标右键弹出快捷菜单选择“禁用索引”选项;而While循环中的数组默认为不能自动索引,如果需要索引,可在循环的通道上单击鼠标右键弹出快捷菜单选择“启用索引”选项。另外,在创建二维数组时一般使用For循环而不使用While循环。4.1.3自动索引在For循环内的应用图4-4For循环自动索引示例自动索引示例自动索引示例24.1.3自动索引在For循环内的应用4.1.5反馈节点在For循环内的应用和移位寄存器一样,反馈节点也是用来实现数据在前后两次循环中的传递。但与移位寄存器相比,使用反馈节点有时能让程序更加简洁易懂。循环中一旦连线构成反馈,就会自动出现反馈节点的符号。反馈节点符号由两部分构成,分别为初始化端子和反馈节点箭头。初始化端子既可位于For循环框图内,也可位于For循环框图外,默认为位于For循环框图内。4.1.5反馈节点在For循环内的应用反馈节点箭头表示连线上的数据流动方向,它可以是正向的,也可以是反向的。图4-7For循环中使用反馈节点示例4.1.5反馈节点在For循环内的应用反馈节点的使用2反馈节点的使用1此处没有开启自动索引功能。实心框4.2While循环4.2.1While循环的组成在如图4-1所示的界面中找到While循环后,用鼠标左键单击While循环后会发现鼠标箭头变成一个表示While循环的小图标,此时用户可在程序框图上用鼠标拖放一个任意大小和位置的While循环边框,如图4-8所示。图4-8While循环界面4.2While循环最基本的While循环由循环框架、条件接线端(输入端)和计数接线端(输出端)组成。与For循环的计数接线端一样,While的计数接线端也是输出循环已执行次数的数字输出端子。While的条件接线端是一个布尔变量,需要输入一个布尔值。4.2While循环条件接线端用于控制循环是否继续执行时,有两种使用状态:默认状态的条件接线端属性为“真(T)时停止”,此时的图标是一个方框圈住的实心的红色圆点,如图4-8右下角所示,这表示当条件为真时循环停止。当在条件接线端图标上单击鼠标右键选择“真(T)时继续”,则图标变成如图4-9所示,此时表示当条件为真时循环继续。当每一次循环结束时,条件端口检测通过数据连线输入的布尔值和其使用状态决定是否继续执行循环。4.2While循环图4-9条件端子变换后的While循环界面与For循环是在执行前检查是否符合条件不同,While循环是在执行后再检查条件端子。因此,While循环至少执行一次。4.2While循环图4-10简单While循环示例While循环示例3While循环示例1While循环示例2While-for示例循环的输入输出4.2While循环4.3条件(CASE)结构条件结构同样位于“函数”选板下的“结构”子选板中。与创建循环的方法类似,我们可以从结构选板中选择条件结构,用鼠标在程序框图上任意位置拖放任意大小的条件结构图框。Case条件结构由结构框架、条件选择端口、选择器标签及递增/减按钮组成,如图4-11所示。图4-11条件结构界面4.3条件结构如果要将分支选择器的端口数据类型从数字型改成布尔型,则对应的0和1分支会分别改变成假和真。选择器标签中也可以输入单个值、数值列或数值范围。4.3.1添加、删除与排序分支在条件结构框架上单击鼠标右键,在弹出的快捷菜单中选择“在后面添加分支”菜单项用户就可以为条件结构添加新的分支,如图4-12所示。图4-12分支的添加和排序添加完新分支后可在快捷菜单中选择“重排分支”菜单项打开重排分支对话框,在对话框的分支列表中用鼠标拖动列表项可以对分支重新排序。通常,排序按钮以第一个选择值为基准对选择器标签值进行排序。删除分支的操作与添加分支相同。创建新的分支后可以为新分支添加分支名。4.3.1添加、删除与排序分支建立选择结构建立多选结构建立选择结构24.3.2连接数据的输入与输出条件结构的所有输入端子(包括隧道和选择端子)的数据对所有分支都可以通过连线使用,甚至不用连线也可使用。隧道即是指结构上的数据出入口,表现为以矩形框出现在结构的边框上。分支不一定要使用输入数据或提供输出数据,但是如果任一分支有输出数据,则其他所有的分支也必须在该数据通道有数据输出,否则将可能导致编程中的代码错误。(a)不正确的连接—边框上的数据通道为中空状态(b)正确的连接—边框上的数据通道为实心状态图4-13连接数据的输入与输出4.3.2连接数据的输入与输出实心框空心框4.3.3Case条件结构示例图4-14执行两个数相乘或相加运算的Case条件结构示例图4-15执行两个数相乘或相加运算的Case条件结构示例4.3.3Case条件结构示例4.3.3Case条件结构示例CASE结构示例1IF结构示例-开方根4.4顺序结构顺序结构就是LabVIEW中用来控制程序执行次序的。顺序结构由多个框架组成,从框架0到框架n,首先执行的是放在框架0中的程序,然后执行的是放在框架1中的程序,……,这样依次执行下去。顺序结构的每个框架称为一帧,在程序运行时,只有上一个框架中的程序运行结束后才能运行下一个框架中的程序。顺序结构共有两种类型:层叠式顺序结构平铺式顺序结构。4.4顺序结构顺序结构顺序地执行子框图,而这些子框图看起来就像一帧帧的电影胶片,因此称之为帧。层叠式顺序结构和平铺式顺序结构都位于“函数”选板下的“结构”子选板中。与创建其他数据结构的方法类似,用户可以从结构选板中选择顺序结构,然后用鼠标在程序框图上任意位置拖放任意大小的顺序结构图框,此时的顺序结构只有一帧,如图4-16(a)所示。在层叠式顺序结构的边框上单击鼠标右键,从弹出的快捷菜单中选择“在后面添加帧”菜单项就可以添加新的帧。每一个帧都有一个帧编号,编号从0开始。4.4.1层叠式顺序结构图4-16层叠式顺序结构界面4.4.1层叠式顺序结构层叠式顺序结构中的数据要借助于顺序结构变量来传递。(a)未赋值的局部变量(b)连接数据(c)赋值后的局部变量(d)结果图4-17顺序局部变量的创建与使用4.4.1层叠式顺序结构图4-18顺序结构中的数据通道4.4.1层叠式顺序结构层叠式顺序结构4.4.2平铺式顺序结构图4-19平铺式顺序结构界面多框架平铺式顺序结构的一个鲜明的特点是它的多个框架不是层叠在一起,而是自左至右平铺,并按从左至右的顺序执行。层叠式顺序结构与平铺式顺序结构的功能完全相同。他们的主要区别在于平铺式顺序结构的所有框架在一个平面上,视觉上较为直观,不需要用户在框架之间的切换;当在编写项目程序时通常使用层叠式顺序结构,使框图中程序更加简洁。层叠式顺序结构和平铺式顺序结构之间是可以互相切换的。在顺序框架的右键选单中按需要选择相应选项即可。4.4.2平铺式顺序结构相比于层叠式顺序结构,平铺式顺序结构各帧之间同样可以传输数据,而且平铺式顺序结构传递数据的方式与层叠式顺序结构相比较而言更加简单和直观,只需直接在两帧间连线就可以自动创建一个循环隧道传输数据,如图4-20所示。4.4.2平铺式顺序结构图4-20平铺式顺序结构的数据传输4.4.2平铺式顺序结构平铺式顺序结构4.5事件结构所谓事件,是指对程序活动发生的异步通知。事件可以来自于用户界面、外部I/O或其他方式。用户界面事件包括鼠标点击、键盘按键等动作,外部I/O事件则指诸如数据采集完毕或发生错误时硬件触发器或定时器发出信号。LABVIEW中的事件结构也是一种特殊的选择结构。其他方式的事件可通过编程生成并与程序的不同部分进行通信。LabVIEW支持用户界面事件和通过编程生成的事件,但不支持外部I/O事件。LabVIEW中的事件结构也是一种能改变数据流执行方式的一种结构,使用事件结构可以实现用户在前面板的操作(事件)与程序执行的互动。4.5事件结构Labview支持下列5种事件1.应用程序事件(Application),这类事件主要反映整个应用程序状态的变化,例如:程序是否关闭,是否超时等。2.VI事件(ThisVI),这类事件反映当前VI状态的改变。例如:当前VI是否被关闭,是否选择了菜单中的某一项等等。3.动态事件(Dynamic),用于处理用户自己定义的或在程序中临时生成的事件。4.区域事件(Pane)和分割线事件(Splitter)是LabVIEW8中新添加的特性。LabVIEW8中,用户可以把一个VI的前面板分割成几份,这两类事件用来处理用户对某个区域或区域分割线的状态改变。5.控件事件(Control)是最常用的一种事件,用于处理某个控件状态的改变。例如,控件值的改变,或者鼠标键盘的操作。4.5事件结构在右键关联菜单中,只要选定了某一个事件产生源,其相应的所有事件均排列在右侧events框中。4.5.1事件结构的创建与简单示例一个标准的事件结构由框架、超时端子、事件数据节点、递增/减按钮、选择器标签组成,如图4-21所示。和条件结