第5章 结构.docx

上传人:b****3 文档编号:6264967 上传时间:2023-05-09 格式:DOCX 页数:19 大小:628.77KB
下载 相关 举报
第5章 结构.docx_第1页
第1页 / 共19页
第5章 结构.docx_第2页
第2页 / 共19页
第5章 结构.docx_第3页
第3页 / 共19页
第5章 结构.docx_第4页
第4页 / 共19页
第5章 结构.docx_第5页
第5页 / 共19页
第5章 结构.docx_第6页
第6页 / 共19页
第5章 结构.docx_第7页
第7页 / 共19页
第5章 结构.docx_第8页
第8页 / 共19页
第5章 结构.docx_第9页
第9页 / 共19页
第5章 结构.docx_第10页
第10页 / 共19页
第5章 结构.docx_第11页
第11页 / 共19页
第5章 结构.docx_第12页
第12页 / 共19页
第5章 结构.docx_第13页
第13页 / 共19页
第5章 结构.docx_第14页
第14页 / 共19页
第5章 结构.docx_第15页
第15页 / 共19页
第5章 结构.docx_第16页
第16页 / 共19页
第5章 结构.docx_第17页
第17页 / 共19页
第5章 结构.docx_第18页
第18页 / 共19页
第5章 结构.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

第5章 结构.docx

《第5章 结构.docx》由会员分享,可在线阅读,更多相关《第5章 结构.docx(19页珍藏版)》请在冰点文库上搜索。

第5章 结构.docx

第5章结构

第5章结构

5.1For循环

5.1.1For循环的建立

5.1.2For循环的时间控制与数据传递

5.1.3循环的自动索引

5.1.4移位寄存器

5.2While循环

5.3选择结构CaseStructure

5.3.1选择结构的建立

5.3.2选择结构的设置

5.3.3选择结构的应用示例

5.4顺序结构SequenceStructure

5.4.1顺序结构的建立

5.4.2顺序结构的数据输入输出

5.4.3顺序局部变量SequenceLocal

5.4.4顺序结构应用示例

5.4.5顺序结构的缺陷与人为的数据依从关系

5.5事件结构EventStructure

5.5.1事件驱动的概念

5.5.2事件结构的建立

5.5.3事件结构的设置

5.5.3事件的分类

5.6公式节点FormulaNode

5.6.1公式节点的用途

5.6.2公式节点的建立

5.6.3公式节点的语法

5.6.4表达式节点ExpressionNode

第5章结构

结构是一种程序流程控制节点,它们放置在图形代码窗口中,外形是一个大小可以缩放的边框,当它与其它节点的连线有数据传递过来时,边框内的一段代码或者反复执行、或者有条件执行、或者按照一定顺序执行。

结构内的一段代码叫做子图形代码;结构边框上数据输入输出的端口叫通道。

LABVIEW有6种结构:

For循环、While循环、选择结构、顺序结构、公式节点和事件结构。

这些结构都在Structure函数子模板中,它们各自的位置见图5-1。

事件结构

While循环

For循环

公式节点

顺序结构

选择结构

图5-1结构子模板

 

5.1For循环

For循环控制一段程序代码执行一定的次数,它等价于以下的伪代码:

Fori=0toN-1

ExecuteDiagramInsideTheLoop

5.1.1For循环的建立

在图形代码窗口中设置For循环的做法是,在Structure函数子模板中选中For循环的小图标,在所有应在For循环内执行的节点左上角区域点击一下鼠标,然后按住鼠标向右下角拖动,直到虚线框包围所有应在For循环内执行的节点,松开鼠标后,就得到了一个大小和位置满意的For循环框。

如图5-2所示。

也可以先放好一个For循环框,再向里面填代码。

图5-2For循环的建立

For循环有两个固定的端口。

计数端口count是一个输入端口,除非使用自动索引功能,否则都要在For循环框外,为count端口连接一个整形数,指定循环执行的次数。

如果连接其它类型的数值,LabVIEW自动把它强制转换为最接近的整形数。

对正好在两个数之间的数,则转换为接近的偶数。

例如4.5转换为4,而5.5转换为6。

循环端口iteration是一个输出端口,它输出循环当前执行的次数。

循环次数是从0开始计数的。

5.1.2For循环的时间控制与数据传递

在满足循环条件的情况下,循环结构在一次循环结束后将尽快开始执行下一次循环,也就是说,如果不加控制循环结构将以尽快的速度执行。

控制循环速度最常用的方法是使用Time&Dialog函数子模板中的等待函数WaitUntilNextmsMultiple,程序执行到这个函数时将等待指定的毫秒倍数。

在图5-3中,For循环内的程序执行完以后,如果不足100毫秒,将等待到100毫秒再执行下一次循环。

但是如果循环内的程序在100毫秒内没有执行完,将在程序执行完后再开始下一次循环。

即程序执行一个循环的时间不会少于100毫秒。

(a)(b)

图5-3循环结构的时间控制与数据传递

循环结构通道上的数据在循环第一次执行时进入循环框内,以后在循环执行过程中将不再理会这个数据的变化。

图5-3(a)中的程序中用了一个图形显示件WaveformChart,它将每一个到达的数据立即描绘在曲线上。

但是如果希望在100次循环执行的过程中用滑钮控制曲线变化是不可能的。

滑钮数值将保持在0循环时的值100次不变。

图5-3(b)的程序的WaveformChart将只显示第100次循环时的数据,因为循环结构在执行完以后,才传递出数据。

如果要完整描绘100个数据点,或者把WaveformChart放进循环框内,或者用下面要介绍的自动索引。

5.1.3循环的自动索引

自动索引是指使循环框外面的数组成员逐个依次进入循环框内,或使循环框内的数据累加成一个数组输出循环框外面的功能。

使用自动索引功能时,从循环框外连接到输入通道的二维数组将索引出一维数组,从一维数组将索引出单个成员。

与此相反,在循环的输出边框,单个元素依次累加成为一维数组,一维数组累加成为二维数组,等等。

For循环和While循环都支持这种功能,但是连接到For循环的数组默认为能自动索引,如果不需要索引,可以在数组进入循环的通道上弹出菜单,选DisableIndexing,而连接到While循环的数组默认为不能自动索引,如果需要索引,可以在循环的通道上弹出菜单,选EnableIndexing。

能自动索引时,通道图标是空心框;不能自动索引时,通道图标是实心框的。

进入循环的数据通道上自动索引以后,数据线型由粗线变为细线,或者由双线变为单线;而输出数据的通道上使用自动索引以后,数据线型由细线变为粗线,或者由单线变为双线。

图5-4(a)用了两个嵌套的For循环,里层的For循环将6次执行时的循环数累加成一个一维数组0~5输出。

外层的For循环依次为这个一维数组各个成员加当前循环数,最后将8次循环的8个一维数组累加成二维数组输出。

输出的结果就是图5-4(b)的二维数组。

图5-4(b)外层的For循环每执行一次循环从二维数组中索引出一行。

里层的For循环每执行一次从一维数组中索引出一个成员。

(a)(b)

图5-4索引数组

在图5-4(b)中内、外层的For循环都没有连接循环的计数端口count。

在这种情况下,For循环执行的次数等于数组长度,也就是说,直到把数组所有成员索引完为止。

如果同时连接了计数端口值,或者还有其它数组执行自动索引进入循环,则循环按照其中最小的次数执行。

5.1.4移位寄存器

1.建立移位寄存器

移位寄存器从一个循环向下一个循环传递数据。

While循环和For循环都可以使用移位寄存器。

创建移位寄存器的方法是在循环的左边框或右边框弹出菜单,然后选择AddShiftRegister。

刚刚创建的移位寄存器包含两个相对的端口,分别位于循环的两个竖直边框上。

右边的端口储存循环结束时的数据。

到下一循环开始时,该数据出现在左边的端口上。

左边的端口可以增加,以便于储存多次循环的数据。

增加端口的方法是用定位工具拖动端口任意一角,或弹出菜单选AddElement。

2.移位寄存器传递数据的方法

图5-5说明移位寄存器如何传递数据。

这个程序在循环开始前为移位寄存器左边3个端口都赋初始值5。

注意,如果初始化移位寄存器,就必须为所有左侧端口都赋值,而且要同样的数据类型。

循环开始执行后循环数i不断送入右边框的移位寄存器端口,并在每次循环结束时转移到左侧移位寄存器端口。

到下一次循环时这个循环数就出现在移位寄存器左边最上边的端口中。

而在每次循环中,移位寄存器左边各端口的值都向下移动一位。

到循环全部结束时,右侧端口数值转移到左侧端口的同时,输出到循环框外。

移位寄存器可以保存任何类型的数据,数值型、布尔型、字符串和数组等。

移位寄存器自动适应连接到它的端口上的第一个数据的类型。

 

图5-5移位寄存器传递数据过程示例

图5-6的程序使用移位寄存器求20个随机数的最大值。

图中Max&Min函数在Comparison子模板,它比较两个输入值,分别返回最大值和最小值。

图中把最大值连接到移位寄存器端口。

这个程序每一次循环中都把当前产生的随机数和移位寄存器左端口中的数据进行比较,因为左端口存储的总是上一次循环产生的最大值,所以最终就得到20个随机数的最大值。

用同样的方法不难求出一些数中的最小值。

图5-6用移位寄存器求最大值

因为移位寄存器可以存储前几个循环的数据,这对求几个数据的平均值也很有用。

3.使用非初始化的移位寄存器

在图5-5的程序中为移位寄存器进行了初始化。

这样每次开始执行这个循环时,左边3个移位寄存器端口值都被赋初始值。

但有时应用移位寄存器就是为了保存程序运行中的一些状态信息,这时就不能对移位寄存器初始化。

非初始化的移位寄存器在程序装入内存时自动按所连接的数据的类型进行初始化,例如数值型的初始值为0,布尔型的初始值为FALSE。

以后程序每次执行到这个循环时,移位寄存器左侧端口向循环内的输出值是上一次执行时的终值。

只要程序不退出内存,移位寄存器总保存着它上一次执行时的数据。

这样就能使移位寄存器在程序的一系列执行过程之间传递数据。

有时在程序中放一个For循环或While循环却只让它执行一次,这就只是为了使用移位寄存器传递数据。

5.2While循环

While循环控制程序反复执行一段代码,直到某个条件发生。

它等价于以下伪代码:

Do

ExecuteDiagramInsidetheLoop(Whichsetsthecondition)

WhileConditionisTRUE

建立While循环的方法与For循环是一样的。

While

循环同样有两个固定的端口。

循环端口iterationterminal是一个输出端口,它输出循环当前执行的次数。

循环数是从0开始计数的。

条件端口conditionalterminal是一个布尔量输入端口。

程序在每次循环结束时检查条件端口。

因此,While循环总是至少执行一次。

(a)(b)(c)(d)

图5-7While循环的终止条件

条件端口到底遇到什么条件能使While循环停止下来,是可以设置的。

默认设置为ContinueIfTrue,即直到传递到条件端口的布尔量值为False时退出循环,如图5-7(a)所示。

在条件端口上弹出菜单将设置改为StopIfTrue,则传递到条件端口的布尔量值为True时退出循环,如图5-7(b)所示。

如果连接一个错误信息簇数据到条件端口,则默认设置为StopOnError,如图5-7(c)所示。

许多VI会返回一个错误信息参数,它是一个簇,包含一个错误信息码数值、一个错误状态布尔量,和一个错误源说明字符串。

条件端口自动解析出其中的错误状态布尔量,根据这个值确定执行什么操作。

在条件端口上弹出菜单将设置改为ContinueWhileError,则即使遇到错误也不会退出循环。

如图5-7(d)所示。

注意4个图中条件端口图标是不同的。

由于循环结构在进入循环后将不会再理会循环框外面数据的变化,因此产生循环终止条件的数据源一定要放在循环框内,否则会造成图5-8那样的死循环。

图5-8死循环

While循环的自动索引、循环时间控制方法及使用移位寄存器等功能与For循环也都是非常相似的。

但是在使用数组自动索引功能时应该注意,While循环的循环次数不是事先确定的,在对进入循环的数组进行索引时,如果数组成员已经索引告罄,则LabVIEW自动在后面追加缺省值,例如一个数值型数组有10个成员,那么从第11次循环开始,从数组通道进入循环的数值就是0,而假如数组是布尔型的,追加的就是False,等等。

While循环使用自动索引时输出数组的长度一般在事前也是未知的。

5.3选择结构CaseStructure

5.3.1选择结构的建立

选择结构包含有多个子图形代码框,每个子图形代码框包含一段程序代码,程序选择其中的一段执行。

一个子图形代码框对应一个Case。

这些子图形代码框像一摞卡片一样重叠在一起,任何时候只有一个是可见的。

向这些子图形代码框填写代码也要一层层打开进行。

在程序中放置选择结构的方法与循环结构是一样的。

放进图形代码窗口的选择结构图标如图5-9(a)所示。

循环结构左侧边框上的带?

图标的端口是选择端口。

连接到选择端口的值决定了选择结构执行时到底执行哪一个子图形代码框内的代码。

这个值的类型可以是整型、布尔型、字符型或枚举型。

选择端口的图标颜色也会随连接的数值类型而改变。

默认情况是连接一个布尔量,图标为绿色,共有两个子图形代码框。

(a)(b)

图5-9选择结构

在图5-9(b)中,为选择端口连接了一个枚举型控制件,并为它输入3个值Li、Zh、Liu。

为枚举型数据赋值的方法是,用标签工具写完一个枚举值后,在图标上弹出菜单选AddItemAfter或AddItemBefore,再用标签工具为下一个枚举量赋值。

选择结构边框的顶部是子图形代码框显示窗口,它的中间是子图形代码框标识,两边分别是升序、降序按钮。

子图形代码框标识指明当前显示的子图形代码框对应的选项。

枚举型控制件连接到选择端口以后,子图形代码框标识自动转换为前两个枚举值Li和Zh,因为目前只有两个子图形代码框。

在选择结构边框上弹出菜单选AddCaseforEveryValue,则条件端口有几个枚举值,就会有几个子图形代码框。

当选择端口输入数值型或字符型数据时,则需要在弹出菜单上选AddCaseAfter或AddCaseBefore逐个增加子图形代码框。

在子图形代码框标识上击鼠标左键,则出现所有存在的子图形代码框名,可以选择显示其中任意一个。

子图形代码框标识两边分别是升序、降序按钮,点击它们可以分别查看前一个或后一个子图形代码框。

通过在选择结构边框上弹出菜单还可以进行子图形代码框的复制DuplicateCase、删除DeleteThisCase,或者移除整个选择结构RemoveCaseStructure,这时只剩下顶层内的图形代码。

5.3.2选择结构的设置

1.缺省选项的设置

在其它的编程语言中,如果出现选项超出预定范围的情况,通常不执行任何选项。

在LABVIEW中,则必须设置一个缺省选项处理超出选项范围的情况,除非能够为每个可能的选择值都设置一个子图形代码框。

例如一个选择结构的选择端口连接了一个整型数,而选择结构具有1,2,3这3个子图形代码框,这时为它所有可能的选择值设置子图形代码框是不可能的,所以必须将1,2,3这3个子图形代码框之一设置为缺省选项,只要选择值是1,2,3之外的值就执行这个缺省选项。

设置缺省选项的方法是,当显示缺省子图形代码框时在选择结构边框上弹出菜单选MakeThisTheDefaultCase。

2.子图形代码框的设置

用标签工具修改子图形代码框标识可以设置子图形代码框与选项的对应关系。

子图形代码框标识可以是一个单值,也可以是一个表,例如1,2,3,或者是一个范围,例如5..10。

范围也可以是开放的,例如..1或9..,前者表示小于或等于1的选项值都执行这个子图形代码框,后者表示大于或等于9的选项值都执行这个子图形代码框。

字符型和枚举型数值在子图形代码框标识中被自动加上双引号。

错误的数值被用红色显示。

修改选择结构的子图形代码框的顺序的方法是在选择结构边框上弹出菜单选RearrangeCases…,弹出一个对话框,在CaseList中拖动子图形代码框名到需要的位置。

3.数据通道的要求

向选择结构框内输入数据时,各个子图形代码框连接或不连接这个数据通道都可以;但是从选择结构框向外输出数据时,各个子图形代码框都必须为这个通道连接数据。

否则通道图标是中空的,程序运行钮也是断开的。

当各个子图形代码框都为这个通道连接好数据以后,通道图标才成为实心的,程序才可以运行。

但是如果允许没有连线的子图形代码框输出默认值,可以在数据通道上弹出菜单,选UseDefaultIfUnwired。

这时数据通道变为灰色,程序执行到没有为数据通道连线的子图形代码框时,就输出相应数据类型的默认值。

5.3.3选择结构的应用示例

1.使While循环先检查条件端口再执行代码

前面已经介绍过,While循环是先执行完循环框内的代码,再检查条件端口。

这样循环框内的代码至少要被执行一次。

如果需要防止这种情况,可以像图5-10那样,把代码放在选择结构内。

 

图5-10While循环的先检查后执行

图5-11按条件分离数组成员

 

2.按一定条件分离数组成员

图5-11是LabVIEW带的示例程序SeparateArrayValues.vi,位于LabVIEW的Example\General\array.llb库文件中。

这个程序将一个输入浮点数数组的正负数成员分离开。

它先将两个移位寄存器用InitializeArray函数初始化为数组类型,分别用于存储正负数成员。

移位寄存器初始数据为0个成员的浮点数组。

程序开始执行后,由于For循环的自动索引功能,输入数组成员每次循环进入一个。

当这个数小于0时,就执行True选框,把它加到负数数组中。

否则执行False选框,把它加到正数数组中。

最后从移位寄存器输出累加起来的正负两个数组。

For循环没有连接计数端口,直到把输入数组索引完后,停止执行。

5.4顺序结构SequenceStructure

5.4.1顺序结构的建立

基于文本的编程语言,是按程序的语句出现的顺序执行。

而在数据流程序中,只要一个节点所有需要输入的数据全部到达就开始执行。

如果有时需要某个节点先于其它节点执行,可以用顺序结构作为控制节点执行次序的一种方法。

顺序结构的图标看上去像一张电影胶片,它可以包含有一个或多个子图形代码框,每一个子图形代码框被称为一个Frame。

有多个子图形代码框时,这些子图形代码框像一摞卡片一样重叠在一起,需要一层层打开向这些子图形代码框填写代码。

在程序中放置选择顺序结构的方法与前面各种结构是一样的。

刚放进图形代码窗口的顺序结构图标如图5-12(a)所示,这时只有一个子图形代码框。

在顺序结构边框上弹出菜单选AddFrameAfter或AddFrameBefore可以逐个增加子图形代码框。

增加子图形代码框后如图5-12(b)所示,边框的顶部出现子图形代码框显示窗口,它的中间是子图形代码框标识,显示出当前框在顺序结构序列中的号码(0到n-1),以及此顺序结构共有几个子图形代码框。

子图形代码框标识两边分别是升序、降序按钮,点击它们可以分别查看前一个或后一个子图形代码框。

在子图形代码框标识上击鼠标左键,则出现所有存在的子图形代码框名,可以选择显示其中任意一个。

(a)(b)

图5-12建立顺序结构

通过在选择结构边框上弹出菜单同样可以进行子图形代码框的复制DuplicateFrame、删除DeleteThisFrame,或者移除整个顺序结构RemoveSequence只剩下顶层内的图形代码。

弹出菜单的MakeThisFrame…选项还可以为某一个Frame指定顺序号,此顺序号原有的代码与它交换位置。

顺序结构从0号图形代码框内的代码开始,顺序执行每一个子图形代码框。

5.4.2顺序结构的数据输入输出

向顺序结构框内输入数据时,各个子图形代码框连接或不连接这个数据通道都可以;但是从顺序结构框向外输出数据时,各个子图形代码框只能有一个连接这个数据通道;否则通道图标是中空的,程序运行钮也是断开的。

这一点与选择结构是不同的。

而且,不管由哪一层子图形代码框向外传递数据,都要等所有子图形代码框顺序执行完后才能传出数据。

5.4.3顺序局部变量SequenceLocal

顺序局部变量用于在各个子图形代码框之间传递数据。

建立顺序局部变量的方法是在顺序结构边框上弹出菜单,选AddSequenceLocal。

这时在弹出菜单的位置出现一个黄色小方框,为这个小方框连接数据后它中间出现一个指向顺序结构框外的箭头,并且颜色也变为与连接的数据类型相符。

如图5-13(a)所示。

这时一个数据已经存储到顺序局部变量中。

不能在为顺序局部变量赋值的子图形代码框之前访问这个数据,在这些子图形代码框中顺序局部变量图标没有箭头,也不允许连线,如图5-13(b)所示。

在为顺序局部变量赋值的子图形代码框之后所有子图形代码框都可以访问这个数据,这些顺序局部变量图标都有一个向内的箭头,如图5-13(c)所示。

(a)(b)(c)

图5-13建立顺序局部变量

5.4.4顺序结构应用示例

(a)(b)(c)

图5-14计算时间

图5-14的程序用RandomNumber函数连续产生0~1的随机数,计算出这些随机数平均值达到0.5所用的时间。

这个程序共有3个Frame,在图5-14(a)的Frame0中,建立了一个顺序局部变量,并用TickCount函数把当前时间赋给它,意味着计时开始。

TickCount函数返回计算机开机到当前的时间毫秒数。

在图5-14(b)的Frame1中,用移位寄存器对连续产生的随机数进行累加,用累加值除以循环次数,即求这些随机数的平均数。

再用Comparison函数子模板的InRangeandCoerce函数比较它是否在0.5000~0.5001范围内。

如果在此范围内则退出循环。

在图5-14(c)的Frame2中,再次调用TickCount函数,用当前时间值减去顺序局部变量中的程序开始运行时间,得到程序运行所消耗的时间。

5.4.5顺序结构的缺陷与人为的数据依从关系

NI提供了顺序结构,却不提倡过多使用它。

原因主要有两点。

●顺序结构妨碍了作为LabVIEW优点之一的程序并行运行机制。

●顺序结构掩盖了部分程序代码,中断了作为LabVIEW主要特点的数据流形式。

做为顺序结构的替代,控制程序执行顺序的方法是建立人为的数据依从关系。

在这种情况下,是数据的到达而不是它的值来触发对象的执行。

数据的接收对象也许并不实际需要它的值。

人为建立数据依从关系使所有节点都处于可见的状态。

在图5-15中如果不建立人为的数据依从关系,则两个while循环不一定哪个先开始执行。

因为LabVIEW并不保证图形代码从左向右或从上向下执行。

从需要先执行的结构内任意一个节点连一条线到下一个结构的边框,则保证了这两个结构执行的顺序。

可以看到,后一个循环中没有任何一个对象需要这个数据,只是起到让它等待数据到达再执行的目的。

这是程序中常用的一种方法。

图5-15人为的数据依从关系

5.5事件结构EventStructure

5.5.1事件驱动的概念

LabVIEW是一种数据流的编程环境,由数据流决定程序中节点的执行顺序。

但是在编程中也可以设置某些事件,去对数据流进行干预。

这些事件就是用户在前面板的互动操作,例如,点击鼠标产生的鼠标事件、按下键盘产生的键盘事件等。

在事件驱动程序中,首先是等待事件发生,然后按照对应指定事件的程序代码对事件进行响应,以后再回到等待事件状态。

使用事件设置,可以达到用户在前面板的操作与图形代码同步执行的效果。

用户改变一个前面板控件的值、关闭前面板、退出程序等动作,都可以及时被程序捕捉到。

5.5.2事件结构的建立

事件结构的图标外形与建立事件结构的方法和选择结构都是极其相似的,但是事件结构可以只有一个子图形代码框。

这一个子图形代码框可以设置为响应多个事件,也可以建立多个子图形代码框,设置为分别响应各自的事件。

图5-16事件结构图标

图5-16是事件结构图标。

超时端口Timeout用于连接一个数值指定等待事件的毫秒数。

默认值为-1,即无限等待。

如果设置了处理超时事件的子图形代码框,那么在事件产生之前发生超时的话,LabVIEW就发生一个超时事件。

通过事件数据端口可以访问事件数据值。

如果设置了多个事件,就可以显

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2