找回密码
 注册
LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 2870|回复: 2

[分享] 转帖:labview中多次动态调用一个VI如何实现?

[复制链接]
发表于 2010-7-27 09:40:07 | 显示全部楼层 |阅读模式
labview中多次动态调用一个VI如何实现?
圈子类别:自动化软件 (未知)   2006-5-18 14:05:00

请问在一个主VI中,能否同时多次动态调用另一个VI。比如说,有一个SubVI能够产生矩形波,三角波,正弦波三种波形,并显示。然后我在主VI中三次动态调用这个子VI,弹出三个窗口,分别显示矩形波,三角波,正弦波三种波形,该如何实现?

1:可以使用"copy vi" 功能.可以拷贝一个vi为**1.vi, **2.vi ......然后依次调用,调用完成后全部删除。

2:把Subvi做成reentrant  vi(vi properties\execution中设置reentrant execution项)就能解决该问题了,在动态调用vi时也要把Open VI Reference 的options属性设为8,这样在调用该Subvi时就会克隆一个副本到内存中从而可以无限次的调用,就不需要再硬盘上复制。

这两种方法不一定是最好的方法,欢迎大家发表自己的看法。
http://labviewnote.weebly.com/424-vi3034021160245773584329992.html
 楼主| 发表于 2010-7-27 09:41:15 | 显示全部楼层

http://labviewnote.weebly.com/42 ... 45773584329992.html
4.2.4  VI的动态调用

--------------------------------------------------------------------------------

1、为什么要动态调用VI?
       在图形化程序设计时,一个vi中可以包含一个或若干个子vi。这些子vi通常是被直接放置在程序框图中。习惯上,称这些子vi为:静态链接子vi。当程序加载时,这些子vi也同时也被加载到内存中。这个过程不仅费时,还浪费内存,在应用程序较小时还问题不大,可是当应用程序较复杂时,有可能会带来不便。

       为了解决这个问题,可以使用vi动态调用的方法。与静态链接的vi不同,动态调用vi只有在需要运行该vi时才会将其加载,并在操作结束后又可将其从内存中释放。如果VI调用程序较大,采用动态加载VI的方式可以节省加载时间和内存。

       有时候我们希望能够自由地、任意切换操作界面和测量程序界面,并且希望在任何时候,前面板上仅运行一个程序界面。这样就能够保证良好地、准确地实现“人机对话”。完成这样的操作,同样可以采用动态调用vi的方法。

       前面我们曾经讨论过,vi分为两种类型:通用型vi和严格类型vi ,动态调用时对于不同类型的vi其动态调用的方式也不会相同。



--------------------------------------------------------------------------------

2、通用型vi的动态调用方式
      我用一个修改后的应用程序的实例来说明动态调用的过程(只有程序的外壳,仅用来说明动态调用的过程)。
首先建立一个“力测量项目”
假如:“力测量应用程序”运行时,将根据测量目的调用二个不同的vi,它们都被存放在下图所示的力测量项目文件夹中:
力测量主程序.vi(打包时的主vi)
应力测量.vi
压力测量.vi
动态调用subvi.vi(我将它作成个子vi,便于以它地方使用)



下面运行主程序“力值测量主程序”,其前面版图如下图。



       通常在我的设计中,前面版右上部的三个按键通过vi的属性设定为:仅允许“最小化”有效。其它两个全部“灰化”,不可操作。
       现在,来看前面版,上面共有三个按键开关,分别是:[压力测量]、[拉力测量]和[退出测量]。两个图片分别表示压力传感器和拉力传感器。
       它的程序框图见下图,按键的响应处理采用事件结构,下一节将会讲到,这里先不讨论。



       上图中的事件结构为:“压力测量”鼠标按下。拉力测量的事件结构与此图相近,只是将“文件名”换成“拉力测量.vi“。
       从程序框图中,可以清楚的看到,键处理程序及动态调用的程序很简单(使用了动态调用子vi)。
       下面看看“动态调用子vi”的前面版和程序框图。



。      从动态调用子vi的程序框图来说明动态调用的过程:
1、首先创建一个本vi的“引用”
      因为是“力测量住程序”vi在作动态调用,所以这个“引用”就是本vi的“引用”。
      该“引用”直接链接到"FP.State"属性节点,并设定枚举常数为“Hidden”。此时,“力测量住程序”的前面板被隐藏、不可见(前面板是存在的,但不可见)。
      该“引用”同时向后传递。
      同时建立被动态调用的vi通道
      按数据流的工作方式,同时也完成了被动态调用的vi通道的路径建立(被调用vi必须在该路径下存在,否则系统将报错)。
2、创建被调用vi的“引用”并执行动态调用
      通过内置函数“打开vi引用”,创建该路径下被调用vi的引用。通过该引用调用“FP.Open”方法,该方法中的“Activate"设定为:真(F)。
      这时意味着被调用vi的前面板被打开,屏幕上仅显示”压力测量“程序的前面板。
      通过该引用调用“Run VI”方法,该方法中的“Wait Until Done"设定为:真(F)。等待,直到被调用vi运行结束。
      此时,”压力测量“程序运行............,直到操作者点击”压力测量“前面板上的”退出“按键后,执行下一步操作。
3、动态调用结束
      当操作者点击”压力测量“前面板上的”退出“按键后,程序作两个操作,一是:利用"FP.State"属性节点,将枚举常数设定为“Standard”。此时,“力测量住程序”的前面板被打开、可见。二是:利用调用“FP.Ope”方法,将”压力测量“前面板关闭。同时关闭所有的“引用”。
       动态调用结束,屏幕上看到的还是:“力测量住程序”的前面板。

       注意:这种动态调用的关系是一种“握手”的关系,也就是说:主vi实施动态调用,并等待被调用vi运行完毕后,再返回到主vi。还有一种动态调用是非“握手”的关系,就是直接关闭主vi,仅运行被调用vi,这种方式不太安全,这里就不展示了。
      



被调用的“压力测量”和“拉力测量”前面板见上图。它们的程序框图很简单见下图。



3、严格类型vi的动态调用方式
        我看到许多书的例子都是严格类型VI的调用,这里也就不再说的更多了,仅以LabVIEW帮助文件中的一个实例来表明。查看LabVIEW帮助文件中的:“引用节点调用和严格类型VI引用句柄调用”。
       假如:有一个严格类型的“频率响应.vi”,其动态调用程序框图见下图。



注意:不论对VI的调用还是对节点的调用,在引用打开后,必须销毁(关闭),防止内存泄露。

       VI的动态调用为程序设计提供了灵活的设计方法,这也是我常用设计方法。关于这里涉及的事件结构,我会在下面另做表述。

回复 顶

使用道具 举报

 楼主| 发表于 2010-7-27 09:54:46 | 显示全部楼层
回复 顶

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2026-9-29 06:04 , Processed in 0.030218 second(s), 6 queries , Gzip On, File On.

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表