ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:407.88KB ,
资源ID:23571497      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/23571497.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(labview动态调用.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

labview动态调用.docx

1、labview动态调用基本概念 众所周知,LabVIEW程序又称虚拟仪器,即VI。VI是由以下三部分构成:前面板即用户界面。程序框图包含用于定义VI功能的图形化源代码。图标和连线板用以识别VI的接口,以便在创建VI时调用另一个VI。当一个vi可以应用在其它VI中,则称为子vi。子vi相当于文本编程语言中的子程序。 在进行LabVIEW程序设计时,一个VI中可以包含一个或若干个子vi。这些子vi是被直接放置在程序框图中,习惯上称这些子vi为:静态链接子vi。这些子vi在VI载入的同时也被加载到内存中。动态调用VI 在应用程序设计时,我们希望能够自由地、任意切换操作界面和测量程序界面,并且希望在任

2、何时候,前面板上仅运行一个程序界面。这样就能够保证良好地、准确地实现“人机对话”。完成这样的操作,就需要动态的调用不同的VI。 与静态链接的子vi不同,动态加载VI只有在打开VI引用时VI的调用程序才会将其加载。如果VI调用程序较大,采用动态加载VI的方式可以节省加载时间和内存,这是因为在调用程序需要运行该VI以前无需将其加载,在操作结束后又可将其从内存中释放。 问题是:在涉及到动态调用的LabVIEW帮助文件中,看到了这样的概念:“严格类型VI”。那么与此相对应一定还存在着:“非严格类型VI”。似乎将VI分成了两种不同的形式?到底“什么是严格类型VI和非严格类型VI”?它们有什么内在联系和不

3、同以及区别呢? 前几天我还和NI的AE讨论这个问题,就是:“什么是严格类型vi和非严格类型VI”?但一直没有得到明确的答复。察看一些LabVIEW的资料,也没有弄明白这个问题。直到开始写这篇博客时,因涉及到这个概念,才开始对这个问题进行了仔细的分析,分析的结果似乎找到了一些答案。严格类型vi: 严格类型vi就是可以被其它VI调用的子vi(静态链接子vi)。进一步说LabVIEW提供的“函数”选板上的vi都是严格类型vi。严格类型的vi能够和其它VI通过连接板的定义与其它VI进行直接的数据交换,既可以独立运行也可以作为子vi被调用,作为子vi调用时通常不打开前面板。非严格类型VI: 非严格类型V

4、I是不能作为子vi来使用的,因为我们没有对它进行类型定义(除非你将它定义为严格类型vi)。非严格类型VI通常是一个独立的VI(或者称为:例程),它不能和其它VI进行直接的数据交换(可以通过全局变量来传递数据),可以独立作为一个程序运行,通常在导入时就将前面板打开。 二者的本质区别就是:是否准确地定义了“连线板”。 为了能够更清楚地说明这个概念,我们通过LabVIEW提供的一个例程,来进一步说明这个问题。该例程可以通过“NI范例查找器”在路径为:硬件输入输出/DAQmx/模拟测量/Acq&Graph Voltage-Int Clk.VI下获得。它的程序框图见下图。图1Acq&Graph Volt

5、age-Int的程序框图 从图1可看到一个“Acq&Graph Voltage-Int Clk.VI”,它本身是由它所包含的6个子vi组成。它到底是什么类型的VI呢?从它的“连线板”看到它的确没有进行过任何定义,应该是非严格类型VI。参见下图。图2非严格类型VI的“连线板”图 我们以图1中的第一个子VI,DAQmx Create Channel (AI-Voltage-Basic).vi的“连接板”为例,可以看出它是个严格类型VI。参见下图。图3严格类型VI的“连线板”图 因为存在非严格类型VI和严格类型vi,所以在进行动态调用时其调用方式也应该有所不同。下面分别列出它们的动态调用方式。非严格

6、类型VI的动态调用的方式 假如程序设计要求先后分别动态调用三个VI,它们被存放在项目中的某个文件夹中,名子分别为:A.VI(打包时的主VI);C.VI。 我们希望程序运行时首先运行A.VI(比如进行:欢迎界面、板卡验证、软件合法性验证等操作),待正确执行完成这些操作后,关闭A.VI,调用运行B.VI(可以是实际的应用程序)然后关闭B.VI,动态打开C.VI(测量结果保存等),关闭C.VI程序停止运行。并保证前面板上仅运行一个程序界面(实际上内存中也是仅保留一个VI,用LabVIEW提供的Memory 可以清楚地看到这点)。 这个示例程序有些像接力赛,A-B-C。 当然这三个VI也可以是严格类型

7、vi,但这里的动态调用方式是针对非严格类型VI的。下面给出每个VI的程序框图。注意:这里将动态调用程序设计成为一个子VI(动态调用)图的程序框图图的程序框图图7动态调用1子VI的程序代码图4、图5、图6的程序都比较简单,大家一看就清楚,无需多说。这里重点谈谈图7的程序代码和编程思路。Case结构选择LabVIEW推荐的子VI形式,点击“文件”/新建/带错误处理的子VI。下面以运行A.VI后,关闭A.VI,动态调用运行B.VI这个过程来对程序代码加以进一步说明(动态调用的本质就是利用VI的“属性节点”和“调用节点”来实现的) :图7的上半部分是利用“属性节点”和“调用节点”对A.VI进行控制;图

8、7的下半部分是利用“属性节点”和“调用节点”对B.VI进行控制。错误簇是它们的“公共线程”。VI引用句柄:由于A.VI已经载入内存,所以使用“本VI”(也就是A.VI)的引用”见图4。属性节点:根据A.VI的引用,确定A.VI的前面板状态,这里是:“Hidden”。打开VI的引用:根据B.VI的路径和文件名,打开B.VI的引用,此时载入B.VI程序。调用节点:根据B.VI的引用,确定B.VI的前面板状态,设定参数见图7。调用节点Run VI:根据B.VI的引用,确定B.VI开始运行,参数:不必等待运行结束和不自动关闭引用。关闭引用:已完成B.VI的动态调用,关闭B.VI的引用。调用节点:根据A

9、.VI的引用,关闭A.VI的前面板(A.VI退出内存)。关闭引用:关闭A.VI的引用。整个动态调用过程结束,只有B.VI运行。上面的描述是依据“公共线程”(数据流)的。在程序设计中还有另一种动态调用的方式:A-B-A也就是说:程序先运行A,然后动态调用B,直到B执行完毕,再返回程序A。程序框图见下图:图8动态调用2子VI的程序代码关于图7与图8的区别,有兴趣的自己进行分析、理解吧。图9动态调用1、2子VI的前面板图严格类型VI的动态调用的方式我看到许多书的例子都是严格类型VI的调用,这里也就不再说的更多了,仅以LabVIEW帮助文件中的一个实例来表明。查看LabVIEW帮助文件中的:“引用节点

10、调用和严格类型VI引用句柄调用”。假如:有一个严格类型的“频率响应.vi”,其动态调用程序框图见下图。图10严格类型VI引用句柄调用实例注意:不论对VI的调用还是对节点的调用,在引用打开后,必须销毁(关闭),防止内存泄露。VI的动态调用为程序设计提供了灵活的设计方法,这仅是我常用设计方法,供大家参考ABVIEW的深入探索之已链接控件引用与未链接(通用)控件引用2011-01-01 20:30高老师评论:是否可以这样说:在控件所属的vi中,使用属性、方法节点不需要创建引用;而在子vi中如果需要向该控件传值,则必须使用该控件的引用控件的引用与引用控件的确理解起来很困难,用语言描述经常会出现误解。今

11、天我们首先明确控件的引用和引用控件这两个不同的概念。一、已链接控件的引用、属性节点、方法节点与未链接的控件的引用、属性节点和方法节点1、已链接控件的引用、属性和方法。对于前面板中创建的控件,通过控件的快捷菜单创建的控件的引用、属性和方法,我们称他们为已链接控件的引用、属性和方法。对于已连接控件的引用、属性和方法,我们知道它们已经指向一个特定的控件,这样的引用、属性和方法是不能随意更改它们的指向的。图中,高老师和CSXCS_366数字控件分别各自创建了引用和属性节点。高老师的引用是指向高老师数字控件的。高老师的可见属性也是指向高老师数字控件的。我们称高老师引用和高老师属性已链接到高老师控件。由于

12、各自指向(链接)到不同的控件,所以对高老师的引用、属性和方法的操作是针对高老师控件的,绝对不会影响到CSXCS_366控件。是否可以这样说:在控件所属的vi中,使用属性、方法节点不需要创建引用;从上图看高老师的说法是正确的2、未链接控件的引用、属性和方法我过去的文章中称未链接控件的引用、属性和方法为通用引用、属性和方法,这里采用未链接控件的引用、属性和方法,更容易区分已链接控件的引用、属性和方法。由于LV中文版出现的很晚,即使现在中文帮助文件中,很多翻译方法很难反映原来的意思,这也造成我们沟通理解的困难。所以我们能理解清楚,我特意强调了这两个概念的不同。在上图中,高老师数字控件和CSXCS_3

13、66数字控件,所代表的数值类型是完全一致的,具有很多共同的属性、方法。-二、为什么要用未链接控件的属性节点和方法节点?假设我们要解决下面的问题,将高老师输入控件和CSXCS_366控件修改为显示控件,这两个控件用来显示随机数,当随机数大于时,控件闪烁。首先我们在一个主VI中解决这个问题。上图中我们使用两个属性节点,分别是已链接到控件的闪烁属性,假设我们有很多的这样的随机数显示,那么按照上图中的编程方法,将会有大量的重复工作。首先我们考虑如何能消除多个同样性能的闪烁属性节点,自然我们会考虑,避免大量重复工作最好的办法是FOR循环。我们设想在FOR循环中只放置一个闪烁的属性节点,很显然循环中是不能

14、放置已链接的控件属性节点,因为那样只会多次修改同一个控件。所以循环中要放置一个为链接控件的闪烁属性节点,然后利用高老师和CSXCS_366显示控件的引用来调用这个未链接的属性节点。假设我们有100个显示随机数的控件,那么之需要创建100个控件的引用,把这些引用创建成数组,FOR循环中不需要任何改动。从上图中我们可以知道,对于已链接控件的属性节点,在运行过程中是无法再次链接到其它同类型的控件中。而未连接(通用)属性节点可以在运行中通过不同的控件引用,动态链接到其它同类型的控件中,这是我们使用未链接控件属性节点关键所在。是否可以这样说:在控件所属的vi中,使用属性、方法节点不需要创建引用;从上图看

15、高老师的说法有局限性,在控件所属VI中,也可能需要创建引用来使用属性、方法节点。三、为什么要用为链接控件的引用(通用引用)任何编程软件都强调模块化的重要性,为了简化上图中的程序框图,我们希望把上图中的FOR循环容封装在一个子VI中。主VI的程序框图简化为:下面我们增加一个“李老师”显示控件,子VI不需要任何改动。程序框图和运行效果图如下所示:从上面两个程序框图中,我们可以领会到这个子VI功能是非常强大的,子VI是如何实现的那?下图是子VI的前面板和程序框图。子VI的输入端子为未链接的数字控件引用数组,输出为双精度数组。我们通过未链接控件的引用成功地操作了调用VI中的三个数字控件:高老师、李老师

16、、CSXCS_366.而在子vi中如果需要向该控件传值,则必须使用该控件的引用高老师实际的意思应该是这样的,如果在“在子VI中操作主VI中的控件,则必须使用该控件的引用”,高老师的这个说法是完全正确的。LV有关引用有几个重要的特点:1、数据流意味着是传值方式而不是传引用(地址)方式,在C语言中,值传递和引用传递都是支持的。2、链接到特定控件的引用代表一个地址,因此同一控件的多个引用,它们的值(地址)肯定是相同的。3、未链接到特定控件的引用(通用引用),它的值为0,相当于C语言中空指针。4、运行时,未链接到特定控件的引用可以指向同类型(严格类型)的特定控件。引用无处不在,应用程序引用、VI引用、窗格引用、控件引用,如果我们获得了一个控件的引用,我们就可以控制这个控件的一切。如果在控件所属VI中控制这个控件,我们自然不需要未链接控件的引用,但是如果需要在子VI中控制,则必须在主VI中先获取这个控件的引用,并把这个引用(地址值)按照值传递的方式传递到子VI中,这样子VI直接获得的是主VI中控件的引用(地址值)。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1