文档库

最新最全的文档下载
当前位置:文档库 > 第2章 LabVIEW 程序结构

第2章 LabVIEW 程序结构

第二章程序结构

2.1循环结构

2.1.1While 循环

While 循环可以反复执行循环体的程序,直至到达某个边界

条件。它类似于普通编程语言中的 Do 循环和 Repeat-Until 循

环。While 循环的框图是一个大小可变的方框,用于执行框中的

程序,直到条件端子接收到的布尔值为 FALSE。

●该循环有如下特点:

●计数从0开始(i=0)。

●先执行循环体,而后i+1,如果循环只执行一次,那么

循环输出值i=0。

●循环至少要运行一次。

条件端子

循环变量

图2-1While 循环示意图

练习2-1使用While循环和图表

目的:用 While 循环和图表获得数据,并实时显示。

创建一个可以产生并在图表中显示随机数的VI。前面板有

一个控制旋钮可在0到10秒之间调节循环时间,还有一个开关

可以中止VI的运行。学习怎样改变开关的动作属性,以便不用

每次运行VI时都要打开开关。操作步骤如下:

前面板

第2章 LabVIEW 程序结构

图2-2练习2-1的前面板

1.选择FileoNew,打开一个新的前面板。

2.选择ControlsoBoolean,在前面板中放置一个开关。

设置开关的标签为控制开关。

3.使用标签工具创建 ON 和 OFF 的标签,放置于开关旁。

4.选中ControlsoGraph,在前面板中放置一个波形图(是chart,而不是graph)。设置它的标签为随机信号。这个图表用于实时显示随机数。

5.把图表的纵坐标改为0.0 到 1.0。方法是用标签工具把最大值从10.0改为1.0。

6.选择ControlsoNumeric,在前面板中放置一个旋钮。设置旋钮的标签为循环延时。这个旋钮用于控制While 循环的循环时间。

流程图

7.开流程图,按照下图创建流程图。

第2章 LabVIEW 程序结构

图2-2练习2-1的流程图

a.从 FunctionsoStructures 中选择 While 循环,把它放置在流程图中。将其拖至适当大小,将相关对象移到循环圈内。

b.从Functionso Numeri c中选择随机数(0-1)功能函数放到循环内。

c.在循环中设置Wait Until Next ms Multiple函数(FunctionsoTime & Dialog),该函数的时间单位是毫秒,按目前面板旋钮的标度,可将每次执行时间延迟0到10毫秒。

d.照上面所示的流程图连线,把随机数功能函数和随机信号图表输入端子连接起来,并把启动开关和While 循环的条件端子连接。

8.返回前面板,调用操作工具后单击垂直开关将它打开。

9.把该 VI 保存为 LabVIEW\Activity目录中的Random Signal.vi。

10.执行该 VI。While循环的执行次数是不确定的,只要设置的条件为真,循环程序就会持续运行。在这个例子中,只要开关打开(TRUE),框图程序就会一直产生随机数,并将其在图表中显示。

11.单击垂直开关,中止该VI。关闭开关这个动作会给循环条件端子发送一个FALSE值,从而中止循环。

12.用鼠标右键单击图表,选择Data

OperationsoClear Char t,清除显示缓存,重新设置图表。

练习2-1结束

附注与说明

布尔开关的机械动作:

布尔开关有6种机械动作属性可供选择。在前面板上用鼠标右键单击开关,在快捷菜单中选择Mechanical Action就可以看到这些可选的动作。LabVIEW还提供了一个范例示范这些动作,它是位于Examples\General\Controls\booleans.llb的Mechanical Action of Booleans.vi。

2.1.2移位寄存器(Shift Register)

移位寄存器可以将数据从一个循环周期传递到另

第2章 LabVIEW 程序结构

外一个周期。在程序设计中,经常要用到它.创建一

个移位寄存器的方法是,用鼠标右键单击循环的左边

或者右边,在快捷菜单中选择Add Shift Register。如

右图所示。

移位寄存器在流程图

上用在循环边框上相应的

一对端子来表示。右边的

端子中存储了一个周期完

成后的数据,这些数据在

这个周期完成之后将被转

移到左边的端子,赋给下一个周期。移位寄存器可以转移各种类

型的数据--数值、布尔数、数组、字符串等等。它会自动适应

与它连接的第一个对象的数据类型。下图表示了它的工作过程.

第2章 LabVIEW 程序结构

图2-3Shift Register的工作过程

可以令移位寄存器记忆前面的多个周期的数值。这个功能对

于计算数据均值非常有用。还可以创建其他的端子访问先前的周

期的数据,方法是用鼠标右键单击左边或者右边的端子,在快捷

菜单中选择Add Element 。例如,如果某个移位寄存器左边的端

口含有三个元素,那么就可以访问前三个周期的数据。

练习 2-2 使用移位寄存器

目的:创建一个可以在图表中显示运行平均数的VI 。

前面板

1.打开一个新的前面板,按照下图所示创建对象。

2.把波形图表的坐标范围改为0.0到2.0。

3.在添加竖直坐标之后,用鼠标右键单击它,在快捷菜单中选择Mechanical

Action?Latch When Pressed ,再选择Operate?Make Current Values Default ,把ON 状态设置为默认状态。

第2章 LabVIEW 程序结构

图2-4 练习2-2的前面板

流程图

4.按下图创建流程图。

第2章 LabVIEW 程序结构

图2-4 练习2-2的流程图

5.在流程图中添加 While 循环(Functions?Structures ),创建移位寄存器。

a. 用鼠标右键单击While 循环的左边或者右边,在快捷菜单中选择Add Shift Register 。

b. 用鼠标右键单击寄存器的左端子,在快捷菜单中选择Add Element,添加一个寄存

器。用同样的方法创建第三个元素。

6.Random Number (0–1)函数(Functions?Numeric)——产生0到1之间的某个随机数。7.Compound Arithmetic 函数(Functions?Numeric)——在本练习中,它将返回两个周期产生的随机数的和。如果要加入其他的输入,只需用右键单击某个输入,从快捷菜单中选择Add Input。

8.除法函数(Functions?Numeric)——在本练习中,它用于返回最近四个随机数的平均值。

9.数值常数(Functions?Numeric)——在While循环的每个周期,Random Number (0–1)函数将产生一个随机数。VI就将把这个数加入到存储在寄存器中的最近三个数值中。

Random Number (0–1)再将结果除以4,就能得到这些数的平均值(当前数加上以前的三个数)。然后再将这个平均值显示在波形图中。

10.Wait Until Next ms Multiple函数(Functions?Time & Dialog)——它将确保循环的每个周期不会比毫秒输入快。在本练习中,毫秒输入的值是500毫秒。如果用鼠标右键单击图标,从快捷菜单中选择Visible?Label,就可以看到Wait Until Next ms Multiple 的标签。

11.用鼠标右键单击Wait Until Next ms Multiple 功能函数的输入端子,在快捷菜单中选择Create Constant。出现一个数值常数,并自动与功能函数连接。

12.将Constant设置为500。这样连接到函数的数值常数设置了500毫秒的等待时间。

因此循环每半秒执行一次。注意,VI用一个随机数作为移位寄存器的初始值。如果没有设置移位寄存器端子的初始值,它就含有一个默认的数值,或者上次运行结束时的数值,因此开始得到的平均数没有任何意义。

13.执行该VI,观察过程。

14.把该VI 保存为LabVIEW\Activity目录下的Random Average.vi。

练习2-2结束。

附注:移位寄存器的初值:

上面的练习中对移位寄存器设置了初值0.5。如果不设这个初值,默认的初值是0。在这个例子中,一开始的计算结果是不对的,只有到循环完3次后移位寄存器中的过去值才填满,即第4次循环执行后可以得到正确的结果。

2.1.3For循环

For循环用于将某段程序执行指定次数。和While 循环一样,

它不会立刻出现在流程图中,而是出现一个小的图标,而后您可

以修改它的大小和位置。具体的方法是,先单击所有端子的左上

方,然后按下鼠标,拖曳出一个包含所有端子的矩形。释放鼠标

时就创建了一个指定大小和位置的For循环。

第2章 LabVIEW 程序结构

For循环将把它的框图中的程序执行指定的次数,For循环

具有下面这两个端子:

N: 计数端子(输入端子)——用于指定循环执行的次数。

I: 周期端子(输出端子)——含有循环已经执行的次数。

上图显示了一可以产生100个随机数并将数据显示在一个

图表上的For循环。在该例中,i 的初值是0,终值是99。

练习 2-3 使用For循环

目的:用For循环和移位寄存器计算一组随机数的最大值。

1.打开一个新的前面板,按照下图创建对象。

a.将一个数字显示对象放在前面板,设置它的标签为“最

大值”。

b.将一个波形图表放在前面板,设置它的标签为“随机

数”。将图表的纵坐标范围改为0.0到1.0。

c.在图表的快捷菜单中选择V isible ItemsoScrollbar

和Digital Display,并隐藏Plot Legend。

d.用移位工具修改滚动栏的大小。

第2章 LabVIEW 程序结构

第2章 LabVIEW 程序结构

图2-5 练习2-3的面板和流程图

2.按照上图画流程图。

3.在流程图中放置一个For循环

(FunctionsoStructures)。

4.在For循环的边框处单击鼠标右键,在快捷菜单中选择

Add Shift Register。

5.将下列对象添加到流程图。

a Random Number (0–1)函数(FunctionsoNumeric )—

—产生0到1之间的某个随机数。

b 数值常数(FunctionsoNumeri

c )——在这个练习中需

要将移位寄存器的初始值设成0。

c Max&Min 函数(FunctionsoComparison )——输入两个

数值,再将它们的最大值输出到右上角,最小值输出到右下角。

这里只需要最大值,只用连接最大值输出。

d 数值常数(FunctionsoNumeric )——For 循环需要知

道需要执行的次数。本练习中是100次。

6.按照上图连接各个端子。

7.运行该VI 。

8.将该VI 保存为LabVIEW\Activity 目录下的Calculate

Max.vi 。

练习 2-3 结束。

2.2 分支结构:Case

Case 结构含有两个或者更多的子程序(Case ),执行那一个

取决于与选择端子或者选择对象的外部接口相连接的某个整数、

布尔数、字符串或者标识的值。必须选择一个默认的Case 以处

理超出范围的数值,或者直接列出所有可能的输入数值。Case

结构见下图,各个子程序占有各自的流程框,在其上沿中央有相

应的子程序标识:

Ture 、False 或1、2、3…。按钮用来改变

当前显示的子程序(各子程序是重叠放在屏幕同一位置上的)。

第2章 LabVIEW 程序结构

第2章 LabVIEW 程序结构

第2章 LabVIEW 程序结构

练习 2-4 使用 Case 结构

目的:创建一个VI 以检查一个数值是否为正数。如果它是正的,VI 就计算它的平方根,反之则显示出错。

前面板

1. 打开一个新的前面板,并按照下图所示创建对象。

控制对象用于输入数值,显示对象用于显示该数值的平方根。

流程图

2.照下图创建流程图。

第2章 LabVIEW 程序结构

第2章 LabVIEW 程序结构

第2章 LabVIEW 程序结构

图2-6练习2-4的面板和流程图

3.从FunctionsoStructures中选择一个 Case结构,并放置在在流程图中。Case 结构是一个可以改变大小的方框。先来做Ture的情况,照流程图上半部分构造。

a Greater Or Equal To 0? 函数(FunctionsoComparison)——如果输入数值大于或者等于0就会返回一个TRUE值。

b Square Root 函数(FunctionsoNumeric)——返回输入数值的平方根。

c连好线

d点击Case框的选择按钮,转入False情况编程

e数值常数(FunctionsoNumeric)——这里用于显示错误的代数值-999.00。

第2章 LabVIEW 程序结构

f One Button Dialog函数(FunctionsoTime & Dialog)——在这里它用于显示一个对话框,内容是Error...。

g字符串常数(FunctionsoStrin g)——用Edit Text Tools在对话框中输入字符串。

h该VI在TRUE或者FALSE情况下都会执行。如果输入的数值大于等于0,VI会执行TRUE Case,返回该数的平方根,否则将会输出-999.00,并显示一个对话框,内容为Error...。

4.返回前面板,运行该VI。修改标签为Number的数字式控制对象的数值,分别尝试一个正数和负数。注意,当把数字式控制对象的值改为负数时,LabVIEW会显示Case结构的FALSE

第2章 LabVIEW 程序结构

A D

C

B

Case 中设置的出错信息。

5. 保存该 VI 到LabVIEW\Activity 目录中的Square

Root.vi 。

VI 的算法

本练习中的流程图功能相当于代码式编程语言中的下列伪

代码:

if (Number >= 0) then

Square Root Value = SQRT(Number)

else

Square Root Value = -999.00

Display Message "Error.. "

end if

练习 2-4 结束。

2.3 顺序结构和公式节点

2.3.1 顺序结构(Sequence Structure )

在代码式的传统编程语言中,默认的情况是,程序语句按照排列顺序执行,但LabVIEW 中不同,它是一种图形化的数据流式编程语言。在图2-7左图中,假设有A 、B 、C 、D 4个节点,其数据流向如右图所示。按照数据流式语言的约定,任何一个节点只有在所有

图2-7 顺序结构的说明

的输入数据有效时才会执行,所以图中,当且仅当A 、B 、C 3个节点执行完,使得D 节点的3个输入数据都到达D 节点后,D 节点才执行。但是你要注意,这里并没有规定A 、B 、C 3个节点的执行顺序。在LabVIEW 中这种情况下,A 、B 、C 的执行顺序是不确定的,如果你需要对它们规定一个确定的顺序,那就需要使用本节介绍的“顺序结构”。

图2-7中的右边是顺序结构的图标,它看上去像是电影胶片。它可以按一定顺序执行多个子程序。首先执行0帧中的程序,然后执行1帧中的程序,逐个执行下去。与Case 结构类似,这多帧程序在流程图中占有同一个位置。

练习 2-5 使用顺序结构

目的:创建一个 VI ,计算生成等于某个给定值的随机数所需要的时间。

前面板

1. 打开一个新的前面板,并按照下图所示创建对象。

第2章 LabVIEW 程序结构

图2-8练习2-5的前面板

我们约定数据是0到100范围的整数。当前值用于显示当前产生的随机数。“执行次数”用于显示达到指定值循环执行的次数。匹配时间用来显示达到指定值所用的时间。

流程图

第2章 LabVIEW 程序结构

第2章 LabVIEW 程序结构

第2章 LabVIEW 程序结构

第2章 LabVIEW 程序结构

图2-8练习2-5的流程图(共3帧)

1.在流程图中放置顺序结构

(FunctionsoStructures)。

2.用鼠标右键单击帧的边框,在快捷菜单中选择Add

Frame After,创建一个新帧。重复这个步骤,再创建一个帧。

共3桢。

3.选中第0桢,设置读取初始时间(子)程序

4.第0帧的下边框上含有一个小方框,其中有一个箭

头。这个方框叫做顺序局部变量,可以在同一个顺序结构中的各

个帧之间传递数据。用鼠标右键单击第0帧的底部边框,选择

Add Sequence Local,创建顺序局部变量。顺序局部变量显示为

一个空的方块。当您将某个功能函数与顺序局部变量相连时,方

块中的箭头就会自动显示。

5.T ick Count (ms) 函数(FunctionsoTime &

第2章 LabVIEW 程序结构

Dialog)——返回启动到现在的时间(以毫秒为单位)。

在这里例子里需要使用两个这个函数。另一个在第2帧

中。

6.按图连好线。转入第1帧。该帧是匹配计算,内含

一个循环结构。该图中使用的新函数有:

第2章 LabVIEW 程序结构

Round to Nearest函数(FunctionsoNumeric)——在

该例中,它用于取0到100之间的随机数到距离最近的整数。

第2章 LabVIEW 程序结构

Not Equal?函数(Functionso Comparison)——在该例

中,它将随机数和前面板中设置的数相比较,如果两者不相等会

返回TRUE值,否则返回FALSE。

第2章 LabVIEW 程序结构

Increment函数(FunctionsoNumeric)——在该例中,

它将While循环的计数器加1。

7.按图连好线。转入第2帧

在第0帧中,Tick Count (ms)功能函数将以毫秒为单位

表示当前时间。这个数值被连到顺序局部变量,这样它就可以被

后续的帧使用。在第1帧中,只要函数返回的值与指定值不等,

VI就会持续执行While循环。在第2帧中,Tick Count (ms)

功能函数以毫秒为单位返回新的时间。VI从中减去原来的时间

(由第0帧通过顺序局部变量提供)就可以计算出花费的时间。

8.返回前面板,在Number to Match控制对象中输入

一个数值,执行该VI。

9.把该VI保存为LabVIEW\Activity目录下Time to

Match.vi。

练习 2-5结束。

附注与说明:设置数据范围

在设定一个数据对象时,可以设置对输入数据的限制,利用

快捷键选择Data Range…选项,将会出现如下对话框:

第2章 LabVIEW 程序结构

图2-9设置数据范围

它可以防止用户创建的控制对象或显示对象的值超出某个

预设的范围。您可以选择忽略这个值,将它强制修改到范围以内,

或暂停程序的执行。在程序执行时,如果发生溢出错误,溢出错

误符号将显示在工具栏中的执行按钮的位置。而且,一个立体的

黑框将把发生溢出的控制对象包围起来。

2.3.2公式节点(Formula Node)

公式节点是一个大小可变的方框,可以利用它直接在流程图

中输入公式。从FunctionsoStructures中选择公式节点就可以

把它放到流程图中。当某个等式有很多变量或者非常复杂时,这

个功能就非常有用。例如等式:y = x2 + x + 1使用公式节点可

以表示为:

第2章 LabVIEW 程序结构

图2-10公式节点示意图

利用公式节点可以直接输入一个或者多个复杂的公式,而不

用创建流程图的很多子程序。使用文本编辑工具来输入公式。创

建公式节点的输入和输出端子的方法是,用鼠标右键单击第0

帧的底部边框,选择Add Input (Add Output)。再在节点框中

输入变量名称。变量名对大小写敏感。然后就可以在框中输入公

式。每个公式语句都必须以分号(;)结尾。

公式节点的帮助窗口中列出了可供公式节点使用的操作符、函数和语法规定。一般说来,它与C 语言非常相似,大体上一个用C 写的独立的程序块都可能用到公式节点中。但是仍然建议不要在一个公式节点中写过于复杂的代码程序。

下面这个例子显示了如何在一个公式节点中执行不同条件时的数据发送。

请阅读下面这段程序代码,如果X 为正数,它将算出X 的平方根并把该值赋给Y ,如果X 为负数,程序就给Y 赋值-99。

if (x >= 0) then

y = sqrt(x)

else

y = -99

end if

可以用公式节点取代上面这段代码,如下图所示: output

input

Y=(X>=0)?sqrt(X):-99;Y X

注意:公式节点中变量字母X,Y 大、小写是有区别的,开方的函数sqrt(X)中函数名称是小写。

练习 2-6 使用公式节点

目的:创建一个VI ,它用公式节点计算下列等式:

y1 = x 3 – x 2 + 5

y2 = m* x + b

x 的范围是从0到10。可以对这两个公式使用同一个公式节点,并在同一个图表中显示结果。

前面板

m

第2章 LabVIEW 程序结构

第2章 LabVIEW 程序结构

第2章 LabVIEW 程序结构

b

Waveform Graph

第2章 LabVIEW 程序结构

图2-11 练习2-6的面板

1. 打开一个新的前面板,按照上图(该图中包含运行结果)创建前面板中的对象。波形图显示对象用于显示等式的图形。该

VI使用两个数字式控制对象来输入m和b的值。

流程图

2.按照下图创建流程图。

第2章 LabVIEW 程序结构

图2-12练习2-6的流程图

在创建某个输入或者输出端子时,必须给它指定一个变量

名。这个变量名必须与公式节点中使用的变量名完全相符。

公式节点中,在边框上单击鼠标右键,在快捷菜单中选择

Add Input,可以创建三个输入端子。在快捷菜单中选择Add

Output,创建输出端子。

x的范围是从0到10(包括10),就必须连接11到计数端

子。

Build Array (FunctionsoArra y)——在这个

第2章 LabVIEW 程序结构

例子中,它用于将两个数据构成数组形式提供给一

个多曲线的图形中。通过用变形工具拖拉边角就可

以创建两个输入端子。

3.返回前面板,尝试给m和b赋以不同的值再执行该 VI。

4.把该VI保存为LabVIEW/Activity目录下的

Equations.vi。

练习 2-6结束。