较深入的问题和技巧.DOC

上传人:国*** 文档编号:1006221 上传时间:2018-11-15 格式:DOC 页数:14 大小:1.89MB
下载 相关 举报
较深入的问题和技巧.DOC_第1页
第1页 / 共14页
较深入的问题和技巧.DOC_第2页
第2页 / 共14页
较深入的问题和技巧.DOC_第3页
第3页 / 共14页
较深入的问题和技巧.DOC_第4页
第4页 / 共14页
较深入的问题和技巧.DOC_第5页
第5页 / 共14页
点击查看更多>>
资源描述

1、第八章 较深入的问题和技巧本章介绍局部变量、全局变量、属性节点和其他一些有助于提高编程技巧的问题,恰当地运用这些技巧可以提高程序的质量。 局部变量严格的语法尽管可以保证程序语言的严密性,但有时它也会带来一些使用上的不便。在 LabVIEW 这样的数据流式的语言中,将变量严格地分为控制器(Control)和指示器(Indicator) ,前者只能向外流出数据,后者只能接受流入的数据,反过来不行。在一般的代码式语言中,情况不是这样的。例如我们有变量 a、b 和 c,只要需要我们可以将 a 的值赋给 b,将 b 的值赋给 c 等等。前面所介绍的 LabVIEW 内容中,只有移位积存器即可输入又可输出

2、。另外,一个变量在程序中可能要在多处用到,在图形语言中势必带来过多连线,这也是一件烦人的事。还有其他需要,因此 LabVIEW 引入了局部变量。 局部变量的创建我们在框图上设置三个变量,两个控制器分别为 Numeric 和 Numeric 2,现在增加局部变量。选择 FunctionStructuresLocal Variable 然后将其拖到框图上,就可得到一个代“?”的图标,下一步将其与框图中已有的变量建立关联,有鼠标右键单击图标,进入Select Item 选择 “input1” ,最后框图就变成了图右边的样子。图 局部变量的创建局部变量只是原变量的一个数据拷贝,但是它的属性可以修改,并

3、且这种改变不会影响原变量。例如上图中的这个局部变量可以利用快捷菜单中的 Change To Read 变成一个指示器。这样的一对变量的组合,就使它既可读又可写了。局部变量有三种基本的用途:控制初始化、协调控制功能、临时保存数据和传递数据。下面我们通过练习来说明。 应用举例练习 用一个开关控制两个循环该练习中有两个 While 循环,现在我们用一个开关同时控制它们的运行。面板与框图如上所示。在左边的一个循环中设定了一个开关。右边的循环中做了这个开关的局部变量。并且在快捷菜单中选 Chang To Read,最后与循环的条件端子连接。这样就实现了所须的功能。练习 结束练习 创建一组互锁的开关面板及

4、框图如上所示。这是一个精巧的程序,它非常简洁地实现了所须的功能,面板上的四个按钮开关,在任何时刻只允许有一个被按下(True 状态) 。当另一按钮被按下时,原先在按下状态的按钮将自动弹起。下面对程序做几点说明。程序的基本算法:在 While 循环中通过一对移位寄存器将当前数组内容(开关状态)与前一次循环时的数组内容不断比较。如果没有变化,则通过“相等判断”将选择器上输入端的数据送到选择器输出端,并送到移位寄存器。如果有变化,则“相等判断”的输出端将把“F”送到选择器,选择器将选取其下输入端的数据到输出。那么下输入端的数据是什么呢?现在我们举例说明,假如个开关原来的状态从左到右是“0100”,即

5、开关闭合。现在按下开关,则当前数组内容立即变为“1100”与前一状态“0100”逐位做异或运算后,在异或门输出端得到的结果是“1000”,这个结果送给了选择器下输入端,在选择器输出端送到移位寄存器的同时还通过一个 Array 的局部变量,使数组内容更新为“1000” ,即使开关弹起。局部变量的作用:循环内的局部变量使得更新后的数据可以写入数组,没有它数组 Array 只能读,不能写。循环外的局部变量用来将数组初始化。这个程序的巧妙之处还在于直接对整个数组操作,而不是对一个个数组元素操作,如果需要增加面板上的开关个数,只需要改变数组初始化中的元素个数,并在面板上拖出需要的开关个数。练习 结束练习

6、 仪器面板控制按钮的完善在前面的练习中,我们曾给出了一个非常简洁的连续正弦波发生器的例子。框图如上所示。但从使用的角度这个程序不够完善。例如程序启动后开始发生波形,这时如果你希望调试改变波形的频率和幅值。则改完后必须再次重新启动运行。因为这些值是作为程序的初值出现的。这显然不太方便。如果我们希望能在任意时刻调整参数波形都能“立即”响应,则可以利用局部变量来完善按钮的控制作用。一个较完善的程序如下所示。这是一个正弦波信号发生器,它允许在运行中随时调整参数而不必重新启动。这个程序增加了内外两层循环,并且对幅值、频率设置了两套局部变量,利用内层循环监视当前时刻和前一时刻的值。如果没有变化,信号源持续

7、工作,内循环一直执行下去。如果发现当前时刻和前一时刻的参数发生了变化,则结束内层循环,并使外循环前进一步(执行第二次外循环) ,相当于程序重新启动,则信号源按新的设置参数运行。另外注意开关的作用,当开关按下时,先终止内层循环,然后终止内层循环,同时 Clear generation。练习 结束 全局变量全局变量是 LabVIEW 中一个与 VI 地位等同的模块,它以独立文件的形式保存在磁盘中,文件后缀为 .gbl。通过全局变量不同 VI 之间可以交换数据。 全局变量的创建和调用创建步骤如下:在 FunctionStructures 下选择 Global Variable,将其图标拖到框图中,得

8、到双击 Global Variable 图标,得到其前面板在其前面板上放上所需要的变量,例如一个数组、一个布尔量、一个字符串变量如下图所示。保存这个变量,例如文件名称为 a.gbl。至此,全局变量创建完备,下面我们通过例子来说明它的调用。练习 全局变量的调用该例中我们首先在一个 VI 中产生十个随机数,然后将它传给全局变量 a.gbl,然后再创建第二个 VI,让它由全局变量 a.gbl 中读取数据,并用 Graph 显示出来。下图分别是 VI1 的框图和 VI的面板及框图。在做调用全局变量的 VI 中有三个问题要注意: 在一个 VI 中调用全局变量的方法同调用子 VI 的方法,即在 Funct

9、ion 下选择Select a VI,然后打开所需的全局变量文件。 全局变量中所需变量的选定。本例中 a.gbl 中含个变量,如果需要的是字符串变量,可用鼠标指向全局变量图标,然后点右键,在出现的快捷菜单中选择 Select Item,即可出现该全局变量中包含的变量列表,选择其中的 String。如下图所示。 有时需要从全局变量中读数,有时需要向全局变量写数。这时可利用快捷菜单改变其属性,以上图为例,选择 Change To Write 就可以向全局变量写数。练习 结束练习 用全局变量控制程序流程这是一个使用全局变量控制程序流程的例子。下图的左上边是主程序的前面板,有三个按钮,分别控制调用子程

10、序和子程序和终止程序运行。右边是对应的框图,下方是两个子程序的框图。所期望的功能是在打开子程序的同时还在主面板上打开子程序,同时也可在主面板上直接关闭程序,不管子程序是否在运行。为了在主程序上关闭子程序的运行,设置了全局变量 quit,当按下 EXIT 按钮时,其值(TURE)同时传给全局变量 quit,如果有子程序在运行,则按照设定的逻辑(STOP 按钮为 T OR Quit 为 T 停止运行)子程序退出运行,同时主程序也退出运行。如果没有这个全局变量,则在主程序上无法控制子程序的退出。为了保证程序中开关初态的正确,需要在程序开始运行前置初态,为此主程序增加了分为两步的顺序结构。程序开始运行

11、时,首先置全局变量为 F.在顺序结构的第二步中,外循环中的三个循环是并行的,程序运行中将巡回执行这三个循环,这样保证 Exit 按钮能起作用。练习 结束 使用全局变量和局部变量的注意事项全局变量不仅可以在不同 VI 间传递数据,而且可以通过它传递消息,控制各 VI 的协调执行。它在程序设计中很有用但无论是全局变量,还是局部变量使用过多也会带来一些其它问题,必须引起注意。首先,从程序的静态结构上看,会使程序结构不直观,造成混乱。其次在程序运行过程中可能带来数据状态的竞态现象,这主要指因为全局变量作为一种可读可写的中间变量,应当严格控制读写的操作,最好是使它们处于“一写多读”的状态。否则可能带来问

12、题。 属性节点(Property Node)作为面向对象的软件,其前面板对象自然应当有其属性,不同类型的对象可能的属性种类和个数也不同。通过属性的控制,可以使程序界面更加丰富多彩,实现更好的人机交互功能。Labview 引入属性节点(Property Node)的概念来设置前面板对象的属性,并且允许在程序运行中动态地改变属性。 属性节点的创建我们举例来说明属性节点的创建。在前面板上创建一个对象,例如 Tank 如下图左。在 Tank 图标上点右键,在出现的快捷菜单上选 Create Property Node,则在框图上出现属性节点如上图右,注意这是显示了一个属性 Visible。用鼠标右键点

13、击 Tank 的属性节点,在出现的快捷菜单上选 Properties 项,可以看到大量的属性供选择。如果需要从中提出种属性使用,可以先用鼠标在属性节点的右下角向下拖拉,直到出现个默认的属性描述拦。然后在快捷菜单下逐个选择所需的属性修改其内容。这样就完成了一个属性节点的创建一个面板对象所具有的属性可能有数十个,不同面板对象所具有的属性也有差别。例如对于一个数字控制量对象,它的属性有 Visible 数据类型为布尔型。当 Visible 值为 False 时,面板对象被隐藏。相反则可见。 Disabled 数据类型为整型。当输入参数为或时,用户可以访问该对象,当输入参数为时,用户不能访问。 Bli

14、nking 数据类型为布尔型。当输入值为 True 时,面板对象闪烁,相反为正常状态。但是这里闪烁的速度和颜色是由 LabVIEW 主菜单下的 ToolsOptionsFront Panent(和Colors) 两个对话框完成的。 属性节点的使用练习 使用属性节点控制屏幕初始化和指示灯闪烁通常 Chart 图有一个默认的特点,第二次运行程序时,前一次运行时画出的曲线不会抹去,而是接着往后画,有时我们希望先清屏,再从头画起。该例子中将实现这个功能。同时还希望制作一个闪烁的指示灯。程序面板和框图如下。该程序产生 101 个随机数,在一个 Chart 图表上显示,当产生的数据大于 0.5 时面板上的

15、指示灯闪烁。为此给指示灯配了一个 Blinking 属性节点,并将其置为可写状态。连接框图如上右所示。为了在程序开始运行时先对 Chart 清屏,为 Chart 配了一个 History 属性节点,在循环开始之前,首先将 0.00 赋给 History。注意这里在程序执行顺序上的一个技巧。本来我们可以画分两步执行的一个顺序结构,但那样做不仅程序不直观,也复杂化了。这里只画了一个单步的顺序框,省去了第二步的框,通过一条(可以认为是虚设的)由初始化 50ms 的延时连线,规定了执行的顺序,保证初始化在先。练习 结束 程序流控制在 LabVIEW 编程中程序流程的控制是一个值得注意的问题。在这里多个

16、相对独立的程序单元默认的执行顺序是并行,而不是传统文本代码式语言中的串行方式。在那里“并行”是件麻烦的事,在这里“串行”或为程序执行定序反而是额外的负担。在介绍Sequence 结构时我们已经解释过这件事,现在我们要说,为此过分地使用 Sequence 结构也不是一个好办法。正确理解数据流的含义,不仅可以使编程简化,而且可以提高程序执行效率。下面我们再次讨论一下相关的问题。 慎用流程图描述算法用程序流程图描述数据流式语言的算法流程可能会出问题。假如现在有一个简单的程序:INPUT A;INPUT B; PROCESS A AND BDISPLAY RESULT与这个程序对应的流程图如右所示,但

17、是如果严格按照这个流程图编制的 LabVIEW 程序,就变成了下面的样子。这是一个分四步的 Sequence 结构,这显然是荒唐的。我们已经知道正确的程序流程应当是显然,程序流程图描述 LabVIEW 编写的程序的算法流程要慎重。 使用数据线控制程序流过多地使用 Sequence 结构来控制程序流不仅不直观,而且显得非常愚蠢,刚刚讲过的练习就是一个使用数据线程序流的例子。数据流程序的一个基本特性是一个节点只有当它所有的输入数据都到达后才能开始执行,我们可以适当地应用这个特性控制程序流程。现在假如我们需要打开一个文件,读文件,然后关文件。这是一个典型的顺序结构,但是如果使用 Sequence 结

18、构来控制程序流就不妥了。使用如下图所示的程序即可。这个程序只可能从左到右依次执行。反映文件信息的 refnum 数据线和反映错误信息的 error 数据线在这里控制了节点执行顺序,实现了一个 Sequence 结构。类似的处理方法在 LabVIEW 中不少,例如在中级 DAQ 函数中,就是用 task ID 数据线和 error 数据线控制各模块的执行顺序。INPUT AINPUT BPROC.A & BDISPLAYrefnum errorINPUT A AAINPUT B AAPROCESS A AND BDISPLAY RESULT 触发与同步在 A/D 和 D/A 中都有触发与同步问题

19、。这些问题可能用软件方法解决,也可能用硬件方法解决,在用硬件的方法中可以用数字口,也可以有模拟口。下面我们将讨论这些问题。实际上前面的程序设计中 Easy I/O DAQ 使用的就是软件触发,这里不再涉及。 硬件数字触发对 E 系列卡,通过将外部的 TTL 电平信号连接到 TRIG1(PFI0) 或 TRIG2(PFI1)脚就可以实现触发,其他的 PFI 脚也可用于触发,但那不是默认的设置。练习 数字触发的模入采集这个程序是用 DAQ Solution 形成的,在模入通道单样本采集、数字触发,为了便于阅读,最后对程序做了适当简化。需要做的说明是:程序运行之前的线路连接有:将外部信号源连接到模入通道,将 PFI0/TRIG1通过用于触发的按钮开关连接到 DGND。程序运行开始后,前面板 data 指示器无反映,按一下用于触发的按钮开关,data指示器将显示采集到了数据。程序设定了等待时间,如果程序运行后秒内不触发,则停止运行,超时指示灯亮。与通常的程序相比,这里多了一些控制参数,现在分别介绍一下:AI START 上多引出了个控制端Trigeger type : 触发类型,选择 Digital APretrigger scan: 预触发扫描,选择Trigger edge: 触发沿AI READ 多引出了 2 个控制端

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 重点行业资料库 > 1

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。