1、虚拟仪器,电子科技大学自动化学院 虚拟仪器课程组02888013287 ,2.3 LabVIEW的程序结构,主要的程序结构有: 循环(While循环和For循环) 选择(Case结构) 顺序(Sequence结构) 事件(Event结构),2.3.1 For循环,1For循环的创建 基本的For循环结构由循环框、循环次数端口和计数端口组成。,循环框,计数端口,循环次数端口,2For循环的工作流程 For循环用于将结构中的程序循环执行指定的次数。 在开始For循环之前,从循环次数端口读入循环次数,计数端口输出0值。 接下来执行For循环框内框图代码程序,每执行一次计数端口值自动加1。 循环次数达
2、到设定值后,退出循环。,3For循环的数据通道与自动索引 数据通道是用连线工具连接循环框内外的数据端口时,在框架上自动形成的方形通道图标 。 图标空心表明此时数据通道具有自动索引功能,实心图标不能索引 。 自动索引是指将循环框外面的数组成员逐个依次进入循环体内,或将循环框内的数据累加成一个数组输出到循环框外面。,例如:下图中通道自动索引功能有效时,每一次循环产生一个新的数据,存储在循环的边框通道上,待循环结束以后,产生的6个数据将传送到一个数组指示器中。自动索引功能无效时,只有最后一次For循环产生的1个随机数传到循环外。,空心,实心,4移位寄存器 创建:右击边框,弹出一个菜单,选择Add S
3、hift Register选项,可添加一个移位寄存器。 用途:主要用于While循环和For循环,将上一次循环的值传给下一次循环。 数据类型: 数字型、布尔型、字符串等 。 初始化:在循环外将初始值连到移位寄存器的左端口,有默认初值。 还可以存储前几次循环的值,在移位寄存器的左端口或右端口上右击鼠标弹出菜单,选择Add Element选项,可创建附加的左端口来存储前几次循环的值。,5反馈节点 功能:在循环中,将数据从一次循环传递到下一次循环。反馈节点箭头的方向表示数据流的方向。 反馈节点和移位寄存器可以互换,在反馈节点或移位寄存器图标上弹出快捷菜单选Replace with shift Reg
4、ister或Replace with Feedback Node即可。移位寄存器左端口多于1个时不能转换为反馈节点。,下面是用移位寄存器(左图)和反馈节点(右图)实现a+的框图程序。,2.3.2 While循环,For循环和While循环的区别: For循环要执行预先指定的循环次数。 而While循环只有在条件端口接收到的值为False时才停止循环。While循环不必知道循环次数。 While循环不满足条件也要执行1次。 For循环当N1时1次都不执行。,1.While循环的创建 While循环由循环框、条件端口和计数端口组成。,循环框,条件端口,计数端口,2.While循环的工作流程 条件端
5、口控制循环的停止与否。 条件端口有两种状态 : 当使用状态为Stop if True 时,若输入值为Ture,则停止循环 。若输入值为False,则继续执行下一次循环。 当使用状态为Continue if True 时,若输入值为Ture,则继续执行下一次循环。若输入值为False,则停止循环。 循环结束后,才去检测条件端口的值,因此不管条件是否成立,循环至少要执行一次。,计数端口用于统计循环执行的次数,While循环每执行一次,计数端口的值就加1。 计数端口从零开始计数,也就是说,在第一次循环结束时,计数端口的值为0,如果循环执行了10次,则计数端口的值为9。 While循环也具有数据通道索
6、引和移位寄存器、反馈接点的功能,它们的用法与For循环相同,只是While循环的边框数据通道默认为不能索引。,用While 循环实现求X的立方和,2.3.3 Case结构,1.Case结构的创建 Case结构由选择框架、选择端口、选择器标签,以及递增/递减按钮组成。,选择标签,递增按钮,递减按钮,选择框架,选择端口,2Case结构的工作流程 Case结构有一个条件选择端口 (Selector),根据连到该端口 的值来判断执行哪一个子Case。 Selector端口的数据类型有布尔型、数字型和字符串型。 3设置选择结构的默认项 应设置一个默认项来处理超出条件选项范围的情况。 设置选择结构默认项的
7、方法是在选择结构边框上单击鼠标右键,选择Make This The Default Case。,4选择结构数据通道的设置 输入数据时,每个子Case框可连可不连数据通道。 输出数据时,每个子Case框必须为通道连接数据。否则程序不能运行,这时通道的图标是空心的,只有为每个子Case框的数据端口都连接数据后,图标才变成实心。 Use Default if Unwired可使程序中没有连线的子Case框输出默认值。,CASE0 (Add),VI就进行加法运算,CASE1,则VI将进行减法运算。 使用了一个数字型Text Ring控制器(在控制模板中的Ring&Enum子模板中) 注意:当在一个子C
8、ase中建立了一个输出数据通道后,必须给每一个子Case定义输出数据通道。,设定默认的子CASE,当所有条件都不满足时,执行默认子CASE,例子,2.3.4 顺序结构,LabVIEW是一种数据流程序设计语言,没有明确的先后顺序,当节点所有输入端的数据全部有效时,节点才执行。 Sequence结构,它是一种先后顺序执行的结构,看上去象电影胶片的帧(Frame),每一帧为一段框图程序,按照帧(Frame)的顺序来执行框图程序。 两种形式顺序结构,Flat Sequence Structure平铺式顺序结构和Stacked Sequence Structure层叠式顺序结构。功能相同,区别仅在于表现
9、形式不同。,1. 顺序结构的创建 在函数模板的Structures子模板中选择创建顺序结构。选取Stacked Sequence Structure层叠式顺序结构 。 在结构边框上面单击鼠标右键,从弹出的快捷菜单中选择“Add Frame After”或“Add Frame Before”可以增加子图形代码框。 在结构边框上右击弹出的快捷菜单,选择ReplaceReplace with Flat Sequence,可以将层叠式顺序结构变换为平铺式顺序结构,2.顺序结构的工作方式 数据传递至顺序结构时,层叠式从标识0开始执行,依次顺序执行;平铺式从左至右执行所有子图形代码框。 从结构外面向顺序结
10、构写数据时,可连接可不连接这个数据通道;但是当顺序结构向外输出数据时,各个图形代码框中只能有一个连接这个数据通道。 代码框之间的数据传递,平铺式可从一帧直接连线到另一帧来传递数据,层叠式则需要通过局部变量Sequence Local来传送数据。,在层叠式顺序结构的边框上面右击,选择Add Sequence Local即可在当前帧创建一个顺序局部变量端口。 将本帧中的数据连接到该局部变量端口,该数据就可传到后面的帧,该数据不会作用到它前面的帧。 如下图示意了层叠式顺序结构通过局部变量传递数据的情况。在标识是1号帧的一个数据传递到标识是2号的帧进行“或”运算,0号帧不能使用该数据。,例:使用Seq
11、uence结构,设计一个VI,计算产生一个与指定的数字相等的随机数所需花费的时间。,读取定时器的当前值,VI程序每隔10ms执行循环,四舍五入取整,2.3.5 事件结构,1.事件结构的创建 事件结构包括:结构框、事件标签、超时端口和事件数据端口。,事件标签 :说明当前框图程序是响应的什么事件 。,超时端口,默认值为-1,表示无限等待 。,事件数据端口,结构框,2事件结构的使用 可有一个或多个子图形代码框,该图形代码框可以设置为响应多个事件。 右击事件结构边框,从弹出的快捷菜单中选择Edit Events Handled by ThisCase,这时将弹出编辑事件对话框。,显示当前建立的事件,默
12、认“Timeout事件。,增加事件,删除事件,可以选择的事件源,相应的事件源可产生的事件消息,例如:建立一个5秒的超时事件和一个“OK Button” 开关值发生变化的事件,要求: 方法1:任一事件发生都执行同一个子图形代码框程序,显示出对话框“超时或单击了OK按钮”。 方法2:由不同的框图程序响应不同的事件,显示出对话框“超时事件”或“单击了OK按钮事件”。,法1: 在前面板添加放置一个“OK Button” 控件 。 在编辑事件对话框中单击按钮 新建一个事件,选取“EventSources”事件源窗口中的“OK Button”,并在“Event”事件窗口中选择“Value Change”
13、。 选取OneButtonDialog函数,放置在Event Structure中。 在message数据端口新建一个常量,输入“超时或单击了OK按钮”。 在超时端口连接值为5000的一个数字常量。,运行程序,如果单击了“OK Button”按钮或等待5秒都会显示出对话框“超时或单击了OK按钮”。,法2: 在事件结构边框的快捷菜单中选择Add Event Case来创建事件结构的一个分支 。 在弹出的对话框中,选取“EventSources”事件源窗口中的“OK Button” 。并在“Event”事件窗口中选择“Value Change” 。 后面的设置与法1类似。,2.3.6 公式节点,在
14、框图程序中,如果需要设计较复杂的数学运算,框图将会十分复杂,工作量大,而且不直观,调试、改错也不方便。 利用公式节点,只需将数学公式的文本表达式输入在公式节点的框图内,并连接相应的输入、输出端口,则LabVIEW会自动地根据公式计算出正确的结果,并从输出端输出。,(1)公式节点的创建 从函数模板的Structures子模板上选择公式节点Formula Node,在框图中设置公式节点。 公式节点的边框大小可以改变,用户可以使用标签工具,将数学公式直接输入到公式节点的框内。,(2)公式节点的使用 可以声明变量,也支持一些常用的C语言的语句(包括赋值语句、条件语句、循环语句、Switch语句),每条
15、语句以分号结尾。 输入公式后,需要添加输入、输出端口。 在添加端口后出现的方框内填入变量名称。 将输入端口和程序中的数据端口相连接。 将输出端口和程序中的指示端口连接,公式节点中常用的运算符,其中,条件运算符的“?”前的部分是判定条件,“?”和“:”间的部分为当条件为True时的表达式,“:”后的部分为当条件为False时的表达式。,公式节点语句中还可以使用数学函数:abs、acos、acosh、asin、asinh、atan、atan2、atanh、ceil、cos、cosh、cot、csc、exp、expml、floor、getexp、getman、int、intrz、ln、lnp1、lo
16、g、log2、max、min、mod、pow、rand、rem、sec、sign、sin、sinc、sinh、sizeOfDim、sqrt、tan、tanh。 公式节点中可使用 IF条件语句, for和do 、while循环 Swtich ( ) case分支语句 公式节点的语法与C语言相同,例:用公式节点计算y1=x3+x2+5和y2=m*x+b,分析: 公式的输入端口共有3个输入量,分别是m、b和x。3个输入量经过公式节点中的两条语句完成指定的运算,通过输出端口输出y1和y2。,补充:前面板对象属性的动态控制,在前面板设计编程时,我们可以修改和设定对象控件的属性,但是在程序运行时能否由用户
17、修改或程序自身改变呢? 方法是:创建对象的属性节点,通过对属性节点的“写”操作,完成对对象属性的修改。 同样通过对属性节点的“读”操作,在程序中读取对象的属性。,例:程序运行中,用Knob控件改变图形曲线的颜色,提示:建立CHART的属性节点 ,改为可写,并指定为曲线Plot的颜色Color属性,用Knob的值控制CASE,分别送5种颜色值给属性节点,2.3.7 局部变量和全局变量,1局部变量 程序太复杂,连线困难,需用局部变量。 (1)创建 法一:为前面板对象创建局部变量。 在对象上面单击鼠标右键,选择CreateLocal Variable。 法二:在框图程序中新建局部变量,然后再指向某个
18、对象。 可以为一个对象创建多个局部变量。 局部变量具有读、写两种属性。并可互换。,(2) 使用示例 程序中,建立了“停止”控件的两个局部变量。 循环内的局部变量处于“读”状态,读出当前“停止”控件的状态,送给“指示灯”控件显示。 循环外的局部变量 则处于“写”状态,它在每次程序运行前赋给“停止”控件,赋值为“False”,以保证程序运行时进入循环状态。,2全局变量 不同程序之间交换数据,需用全局变量。 全局变量VI只有前面板而无框图程序。 (1)创建 选择全局变量图标,右击,选择Open Front Panel,打开全局变量声明VI的前面板。 按照需要的数据类型加入控件 。 切换到框图程序窗口
19、,单击全局变量图标,选择需要它指向的控件。 返回到全局变量声明VI的前面板,将该VI文件存盘,完成全局变量的建立。,(2)调用 由函数模板中的Select a VI子模板打开选择用户程序对话框,选择已经保存的全局变量声明VI程序,此时将在框图程序中显示全局变量数据端口。 如果在全局变量声明VI中建立多个控件,可以用操作工具在全局变量的图标上单击,在列出的所有变量对象中选择所需的对象。,(3)使用示例 利用全局变量在不同VI中传递数据。 创建一个全局变量声明,其中包含一个数值型控件并命名为“数值”和布尔型控件并命名为“状态”,保存为“GVvi”。 新建一个VI命名为“采集信息.vi”,前面板中有
20、一个旋钮开关和按键开关,将它们的值送到全局变量中。由函数模板中的Select a VI子模板打开选择用户程序对话框,选择“GVvi”,调用两次全局变量声明,选择全局变量的不同数据类型,对端口连线并保存VI。如图,“采集信息”框图程序,新建VI “显示信息.vi”,前面板中有一个表盘指针控件和LED控件。采用同样的方法在框图程序窗口选择创建的全局变量,并在全局变量图标上单击鼠标右键,选择“Change to Read”。,“显示信息”框图程序,分别运行两个VI程序,可以发现由程序“采集信息”得到的数据,通过全局变量传递到程序“显示信息”中,实现了两个程序之间的数据传递。,习题:2.3,1. 用W
21、hile循环,创建一个程序使之当输入0到100之间的随机数,大于等于循环次数时继续运行。 2.学习使用双重For循环。创建一个程序,画出X从1到N的立方和曲线(N大于等于1小于等于100,X、N均为整数),3.创建一个VI程序,不断地产生随机数,直到产生的随机数与程序指定的数值相匹配。记录下共产生了多少个随机数才与程序的指定值相匹配。 4.创建一个VI程序,每秒测量一次温度,并显示在波形Chart指示器上。如果温度高出或低于设定范围,VI程序点亮前面板的2个LED。,参考答案,第1题,第2题,第3题,第4题,2.4 数组、簇和字符串,数据类型选择和转换:,数值型控件对象的数据类型或格式和精度指
22、定:右击对象,在弹出菜单上选择“Represeutation”或”Format Precision” 不同数据类型连接时,有的可以自动转换,有的不行 可使用转换函数强制转换 转换函数在函数面板数值运算Numeric中conversion子模板中,2.4.1 数组,数组是同一类型数据的集合。 LabVIEW中的数组可以为任何数值类型、布尔型、字符串。 一个数组可以是一维的,在内存允许的情况下,也可以是多维的,每维最多可以包含231个元素。 可以通过数组指针(索引index)访问数组元素,指针在0到N1的范围内变化,而就是数组元素的个数。例:10元素的一维数组,1.创建数组:,第一步创建数组壳:从
23、控制模板的Array&Cluster子模板中选择Array控制器,放在前面板上,即建立了一个空的数组壳(Array Shell) 第二步建立数据对象: 把一个数据对象拖入数组壳,或者从控制模板中添加一个数据对象到数组壳中,这样就可以创建一个数组,增加数组维数,在数组壳左边的指针标记上弹出菜单,选择Add Dimension选项,增加数组的维数,列指针,行指针,当前指针指示的元素,4行2列元素,三维数组,页指针,行指针,列指针,利用循环创建数组,在For循环和While循环的边框上可以自动地累积数据,形成数组,这种特性被称为自动索引。 自动索引为打开状态时,每一次循环产生一个新的数组元素,并存储
24、在循环的边框上。 若自动索引被设为无效,则只有最后一次循环产生的数传到循环外 。 For循环数据出口的自动索引默认为有效。而While循环的数据出口的自动索引默认为无效 在数据出口信道上右击,弹出菜单中可修改自动索引。,创建二维数组,使用两个For循环,把其中一个嵌套在另一个中可以生成一个二维数组。外层的For循环产生行,而内层的For循环产生列,2.数组函数,数组函数详细介绍,(1)数组大小函数Array Size,(2)数组索引函数Index Array,(3)替换数组元素函数Replace Array Subset,(4)插入数组函数Insert Into Array 向数组指定位置插入
25、若干行或若干列新元素。,(5)从数组中删除元素函数Delete From Array 从一个数组中删除单个元素或者子数组,(6)初始化数组Intialize Array,(7)创建数组函数Build Array 功能:把多个数组组合成一个数组或对一个数组添加元素。,(8)提取子数组函数 Array Subset,提取输入数组的第0行开始的两行和第1列开始的两列元素,组成一个新数组。,(9)一维数组轮转函数Rotate 1D Array,(10)一维数组倒置函数Reverse 1D Array,(11)搜索一维数组函数Search 1D Array,(12)一维数组分离函数Split 1D Ar
26、ray,(13)一维数组排序函数Sort 1D Array升序排列,(14)获得数组最大值和最小值的函数Array MaxMin,数组函数举例,求数组的大小 检索数组,得到指定位置的元素或子数组,替换数组一个元素或行、列,例:设计一个VI,产生9个随机数组成的数组,先倒序排列,按从小到大排列,并且求出最大值、最小值。,数组插值函数应用,线性代数(Linear Algebra)子模板,在数学子模板 中,线性代数函数举例,2.4.2簇,定义:簇是一种可以把相同或不同类型的数据组合在一起的数据结构,类似于C语言中的结构体数据类型struct。 我们可以把簇形象地理解为一根多芯电缆,不同的信号线捆绑在
27、一起进行传输,电缆中的每根线就相当于簇中的每个元素。,1.创建簇,方法1:在框图程序中使用Bundle函数(Cluster子模板中)Bundle函数可以新建簇 还可在已有簇中添加元素方法2:在前面板放置一个簇的空框架(Control 模板的Cluster子模板中的Cluster控件) ,在框架中再增加簇的元素 。,2簇函数,1、Unbundle分解簇函数 2、 Bundle合成簇函数 3、 Unbundle By Name按名称分解簇函数 4、 Bundle By Name按名称合成簇函数 5、Build Cluster Array 建立簇数组函数 6、Index & Bundle Clust
28、er Array按索引组合簇数组函数7、簇和数组相互转换Cluster To Array和 Array To Cluster,例如:学生情况表中有这样一些数据:姓名(字符型)、性别(字符型)、年龄(数字型)、党员否(布尔型)等,形成一个簇 。,Bundle函数(Cluster子模板中),2.4.3 字符串,字符串就是一系列文本字符,以ASCII码表示。 在数据传送中,通常将数字型的数据转换成字符串进行传送。在很多情况下,往磁盘上存储的数字型数据也要求是字符串格式。 创建:在控制模板的String&Path子模板中, 字符串的输入:使用字符串控制器 字符串输出:使用字符串指示器 可以改变文本显示
29、区的尺寸。当文本显示不完时,可以在字符串控制器或指示器上弹出快捷菜单,选择Visible Items Scrollbar选项,将出现滚动条。,部分ASCII码表,字符的四种显示模式,可以在字符串控制器和指示器上弹出快捷菜单来改变字符显示模式。 (1)Normal Display,这是正常默认显示模式 (2)Password Display,这是口令显示模式,即在前面板上字符串显示为星号。 (3)Hex Display,显示字符的十六进制表示的ASCII代码。 (4)Codes Display,这是代码显示模式,可以显示或输入通常情况下不可显示的字符,例如空格、回车、跳格字符等,不可显示字符以反
30、斜杠后跟相应代码的形式表示,不可显示字符代码表,字符串处理函数,字符串常用函数,(1)字符串长度函数,(2)连接字符串函数Concatenate String把所有的输入字符和字符串数组按顺序连接成一个输出字符串。,(3)提取子字符串函数String Subsetoffset指定提取子字符串在原字符串中的起始位置(从0开始计数),参数length指定子字符串的长度。,(4)大小写转换函数To Upper Case和To Lower Case,(5)替换子字符串函数Replace Substring此函数有3 种用法: 用substring参数输入的字符串,替换原字符串中从offset参数指定的
31、位置开始,length参数指定长度的子字符串。, substring没连,从offset指定的位置开始,删除length长度的子字符串。, length输入值为0,一个字符也没删除,在原字符串中从offset指定的位置开始插入substring参数输入的字符串。,(6)查找替换字符串函数Search and Replace String查找参数search string指定的字符串,并用replace string指定的字符串替换查找到的字符串。,若replace string未连接数据,那么就删除查找到的字符串。,(7)查找匹配字符串函数Match Pattern查找到,就把string分为
32、三个子串输出: before substring match substring after substring offset past match:输出查找到匹配字符串后的下一个字符的位置。,三个子串输出,如果没查找到regular expression,匹配字符串输出为空,offset past match端口输出-1。,(8)转换为字符串函数Format into String将输入数据(字符串、数值、路径或布尔量)转换为字符串并和initial string连接在一起。,举例:字符串大小写转换、合成字符串、 求字符串长度、查找和替换,The quick brown fox jumped
33、 over the lazy dog,前面板,框图程序,字符串和数字转换,Format Into String函数,该函数可以把任何格式下的argument(例如,数字型)转换成指定格式的字符串。在下例中,此函数将浮点数1.28转换成6位字符串“1.2800”,Scan From String函数,该函数可以把一个包含数字字符的字符串转换成一个数字。在下例中,将字符串“电压值为: 1.28E+2”转换成数字128.00。,附加的字符串功能,1.Search/Split String 2.Pick Line 3.Match First String 4.Match True/False Stri
34、ng 5.Scan String for Tokens6.Rotate String 7Reverse String 8.Index String Array 9.Append True/False String,字符串和数据相互转换函数,字符串可转换为多种进制和多种格式的数据,如十进制、十六进制、八进制,浮点数、工程数、分数。 数据可转换为字符串,字符串和数组及路径的转换,例:String To Byte Array: 字符串转换为字节数组 反之, Byte Array To String: 字节数组转换为字符串,习题:2.4,1.设计一个VI,产生一维数组,然后将相邻的一对元素相乘(从元素
35、0和元素1开始),最后输出结果数值。例如,输入数组值为1, 23, 10, 5, 7 , 11,输出数组为23, 50 ,35, 77。2.产生一个数组,熟悉数组函数。设计一个VI用来连接两个数组。把一个初始化后的数组以指定的偏移量添加到连接好的数组中,并指出最后数组的中间元素。,3.用Graph显示数据并使用分析程序。设计一个VI来测量温度,每隔0.25秒测一次,共测定10秒。在数据采集过程中,VI将在波形Chart上实时地显示测量结果。采集过程结束后,在Graph上画出温度数据曲线及最佳拟合曲线,并算出温度的最大值,最小值和平均值。 4.将一个簇分解,并将另外几个数据组合成另一个簇,且将不同的数据整合成数组输出。另外创建一个程序实现簇与数组的转化。,5.计一个VI,把一个数字转换成字符串,并将此字符串与其他字符串相连,形成一个输出字符串,同时,显示输出字符串的长度。另外,可以进行密码验证,当密码匹配时,将密码显示出来,并通过一个指示灯来表示密码正确与否。,参考答案,第1题,第2题,第3题,第4题,第5题,
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1