第二章程序结构分析.docx
《第二章程序结构分析.docx》由会员分享,可在线阅读,更多相关《第二章程序结构分析.docx(15页珍藏版)》请在冰豆网上搜索。
第二章程序结构分析
第二章程序结构
2.1循环结构
2.1.1 While循环
While循环可以反复执行循环体的程序,直至到达某个边界条件。
它类似于普通编程语言中的Do循环和Repeat-Until循环。
While循环的框图是一个大小可变的方框,用于执行框中的程序,直到条件端子接收到的布尔值为FALSE。
●该循环有如下特点:
●计数从0开始(i=0)。
●先执行循环体,而后i+1,如果循环只执行一次,那么循环输出值i=0。
●循环至少要运行一次。
图2-1 While循环示意图
练习 2-1 使用While循环和图表
目的:
用While循环和图表获得数据,并实时显示。
创建一个可以产生并在图表中显示随机数的VI。
前面板有一个控制旋钮可在0到10秒之间调节循环时间,还有一个开关可以中止VI的运行。
学习怎样改变开关的动作属性,以便不用每次运行VI时都要打开开关。
操作步骤如下:
前面板
图2-2 练习2-1的前面板
1.选择File»New,打开一个新的前面板。
2.选择Controls»Boolean,在前面板中放置一个开关。
设置开关的标签为控制开关。
3.使用标签工具创建ON和OFF的标签,放置于开关旁。
4.选中Controls»Graph,在前面板中放置一个波形图(是chart,而不是graph)。
设置它的标签为随机信号。
这个图表用于实时显示随机数。
5.把图表的纵坐标改为0.0到1.0。
方法是用标签工具把最大值从10.0改为1.0。
6.选择Controls»Numeric,在前面板中放置一个旋钮。
设置旋钮的标签为循环延时。
这个旋钮用于控制While循环的循环时间。
流程图
7.开流程图,按照下图创建流程图。
图2-2 练习2-1的流程图
a.从Functions»Structures中选择While循环,把它放置在流程图中。
将其拖至适当大小,将相关对象移到循环圈内。
b.从Functions»Numeric中选择随机数(0-1)功能函数放到循环内。
c.在循环中设置WaitUntilNextmsMultiple函数(Functions»Time&Dialog),该函数的时间单位是毫秒,按目前面板旋钮的标度,可将每次执行时间延迟0到10毫秒。
d.照上面所示的流程图连线,把随机数功能函数和随机信号图表输入端子连接起来,并把启动开关和While循环的条件端子连接。
8.返回前面板,调用操作工具后单击垂直开关将它打开。
9.把该VI保存为LabVIEW\Activity目录中的RandomSignal.vi。
10.执行该VI。
While循环的执行次数是不确定的,只要设置的条件为真,循环程序就会持续运行。
在这个例子中,只要开关打开(TRUE),框图程序就会一直产生随机数,并将其在图表中显示。
11.单击垂直开关,中止该VI。
关闭开关这个动作会给循环条件端子发送一个FALSE值,从而中止循环。
12.用鼠标右键单击图表,选择DataOperations»ClearChart,清除显示缓存,重新设置图表。
练习 2-1结束
附注与说明
布尔开关的机械动作:
布尔开关有6种机械动作属性可供选择。
在前面板上用鼠标右键单击开关,在快捷菜单中选择MechanicalAction就可以看到这些可选的动作。
LabVIEW还提供了一个范例示范这些动作,它是位于Examples\General\Controls\booleans.llb的MechanicalActionofBooleans.vi。
2.1.2移位寄存器(ShiftRegister)
移位寄存器可以将数据从一个循环周期传递到另外一个周期。
在程序设计中,经常要用到它.创建一个移位寄存器的方法是,用鼠标右键单击循环的左边或者右边,在快捷菜单中选择AddShiftRegister。
如右图所示。
移位寄存器在流程图上用在循环边框上相应的一对端子来表示。
右边的端子中存储了一个周期完成后的数据,这些数据在这个周期完成之后将被转移到左边的端子,赋给下一个周期。
移位寄存器可以转移各种类型的数据--数值、布尔数、数组、字符串等等。
它会自动适应与它连接的第一个对象的数据类型。
下图表示了它的工作过程.
图2-3 ShiftRegister的工作过程
可以令移位寄存器记忆前面的多个周期的数值。
这个功能对于计算数据均值非常有用。
还可以创建其他的端子访问先前的周期的数据,方法是用鼠标右键单击左边或者右边的端子,在快捷菜单中选择AddElement。
例如,如果某个移位寄存器左边的端口含有三个元素,那么就可以访问前三个周期的数据。
练习2-2使用移位寄存器
目的:
创建一个可以在图表中显示运行平均数的VI。
前面板
1.打开一个新的前面板,按照下图所示创建对象。
2.把波形图表的坐标范围改为0.0到2.0。
3.在添加竖直坐标之后,用鼠标右键单击它,在快捷菜单中选择MechanicalAction»LatchWhenPressed,再选择Operate»MakeCurrentValuesDefault,把ON状态设置为默认状态。
图2-4 练习2-2的前面板
流程图
4.按下图创建流程图。
图2-4 练习2-2的流程图
5.在流程图中添加While循环(Functions»Structures),创建移位寄存器。
a.用鼠标右键单击While循环的左边或者右边,在快捷菜单中选择AddShiftRegister。
b.用鼠标右键单击寄存器的左端子,在快捷菜单中选择AddElement,添加一个寄存器。
用同样的方法创建第三个元素。
6.RandomNumber(0–1)函数(Functions»Numeric)——产生0到1之间的某个随机数。
7.CompoundArithmetic函数(Functions»Numeric)——在本练习中,它将返回两个周期产生的随机数的和。
如果要加入其他的输入,只需用右键单击某个输入,从快捷菜单中选择AddInput。
8.除法函数(Functions»Numeric)——在本练习中,它用于返回最近四个随机数的平均值。
9.数值常数(Functions»Numeric)——在While循环的每个周期,RandomNumber(0–1)函数将产生一个随机数。
VI就将把这个数加入到存储在寄存器中的最近三个数值中。
RandomNumber(0–1)再将结果除以4,就能得到这些数的平均值(当前数加上以前的三个数)。
然后再将这个平均值显示在波形图中。
10.延时WaitUntilNextmsMultiple函数(Functions»Time&Dialog)——它将确保循环的每个周期不会比毫秒输入快。
在本练习中,毫秒输入的值是500毫秒。
如果用鼠标右键单击图标,从快捷菜单中选择Visible»Label,就可以看到WaitUntilNextmsMultiple的标签。
11.用鼠标右键单击WaitUntilNextmsMultiple功能函数的输入端子,在快捷菜单中选择CreateConstant。
出现一个数值常数,并自动与功能函数连接。
12.将Constant设置为500。
这样连接到函数的数值常数设置了500毫秒的等待时间。
因此循环每半秒执行一次。
注意,VI用一个随机数作为移位寄存器的初始值。
如果没有设置移位寄存器端子的初始值,它就含有一个默认的数值,或者上次运行结束时的数值,因此开始得到的平均数没有任何意义。
13.执行该VI,观察过程。
14.把该VI保存为LabVIEW\Activity目录下的RandomAverage.vi。
练习2-2结束。
附注:
移位寄存器的初值:
上面的练习中对移位寄存器设置了初值0.5。
如果不设这个初值,默认的初值是0。
在这个例子中,一开始的计算结果是不对的,只有到循环完3次后移位寄存器中的过去值才填满,即第4次循环执行后可以得到正确的结果。
2.1.3For循环
For循环用于将某段程序执行指定次数。
和While循环一样,它不会立刻出现在流程图中,而是出现一个小的图标,而后您可以修改它的大小和位置。
具体的方法是,先单击所有端子的左上方,然后按下鼠标,拖曳出一个包含所有端子的矩形。
释放鼠标时就创建了一个指定大小和位置的For循环。
For循环将把它的框图中的程序执行指定的次数,For循环具有下面这两个端子:
N:
计数端子(输入端子)——用于指定循环执行的次数。
I:
周期端子(输出端子)——含有循环已经执行的次数。
上图显示了一可以产生100个随机数并将数据显示在一个图表上的For循环。
在该例中,i的初值是0,终值是99。
练习2-3使用For循环
目的:
用For循环和移位寄存器计算一组随机数的最大值。
1.打开一个新的前面板,按照下图创建对象。
a.将一个数字显示对象放在前面板,设置它的标签为“最大值”。
b.将一个波形图表放在前面板,设置它的标签为“随机数”。
将图表的纵坐标范围改为0.0到1.0。
c.在图表的快捷菜单中选择VisibleItems»Scrollbar和DigitalDisplay,并隐藏PlotLegend。
d.用移位工具修改滚动栏的大小。
图2-5 练习2-3的面板和流程图
2.按照上图画流程图。
3.在流程图中放置一个For循环(Functions»Structures)。
4.在For循环的边框处单击鼠标右键,在快捷菜单中选择AddShiftRegister。
5.将下列对象添加到流程图。
aRandomNumber(0–1)函数(Functions»Numeric)——产生0到1之间的某个随机数。
b数值常数(Functions»Numeric)——在这个练习中需要将移位寄存器的初始值设成0。
cMax&Min函数(Functions»Comparison)——输入两个数值,再将它们的最大值输出到右上角,最小值输出到右下角。
这里只需要最大值,只用连接最大值输出。
d数值常数(Functions»Numeric)——For循环需要知道需要执行的次数。
本练习中是100次。
6.按照上图连接各个端子。
7.运行该VI。
8.将该VI保存为LabVIEW\Activity目录下的CalculateMax.vi。
练习2-3结束。
2.2分支结构:
Case
Case结构含有两个或者更多的子程序(Case),执行那一个取决于与选择端子或者选择对象的外部接口相连接的某个整数、布尔数、字符串或者标识的值。
必须选择一个默认的Case以处理超出范围的数值,或者直接列出所有可能的输入数值。
Case结构见下图,各个子程序占有各自的流程框,在其上沿中央有相应的子程序标识:
Ture、False或1、2、3…。
按钮用来改变当前显示的子程序(各子程序是重叠放在屏幕同一位置上的)。
练习2-4使用Case结构
目的:
创建一个VI以检查一个数值是否为正数。
如果它是正的,VI就计算它的平方根,反之则显示出错。
前面板
1.打开一个新的前面板,并按照下图所示创建对象。
控制对象用于输入数值,显示对象用于显示该数值的平方根。
流程图
2.照下图创建流程图。
图2-6 练习2-4的面板和流程图
3.从Functions»Structures中选择一个Case结构,并放置在在流程图中。
Case结构是一个可以改变大小的方框。
先来做T