LabVIEW动态调用VI及调用路径问题

在LabVIEW程序设计中,调用VI一般分为静态调用和动态调用,静态调用是指被调用VI在VI调用程序的程序框图上直接放置子VI,它与VI调用程序同时加载,而且常驻内存 ,直至调用它的VI运行结束。动态调用VI是指在调用程序运行时动态加载VI,执行完后从内存卸载,自动释放内存,动态调用VI又分为通过引用调用节点(严格类型的VI引用)的动态调用和通用(我这么称呼的)动态调用。通过引用调用VI不仅指向被调用的VI,还指向被调用VI的连线板,这样我们就可以向被调用VI传递参数,并获得被调用VI的输出参数。
在实际应用中,对于需要向其传递参数、进行复杂数据处理、且不需要显示界面的子VI调用,我一般采用通过引用节点的动态调用;如果只是动态调用子VI,显示其界面进行相关操作,我通常采用通用动态调用。下面我们通过示例说明两种动态调用方法。

1. 通过引用调用节点的动态调用

先创建一个子VI,文件名为add.vi,其作用是两个浮点数相加,设置连线板,输入端分别指向两个加数,输出端指向两个加数的和,其前面板和程序框图如下图所示。
LabVIEW动态调用VI及调用路径问题

设计一个调用VI,文件名为CallVIByRef.vi,实现通过引用节点动态调用add.vi(调用时add.vi不显示前面板),其前面板和程序框图如下图所示。
LabVIEW动态调用VI及调用路径问题

2. 通用动态调用

除了通过引用动态调用VI外,还有一种动态调用VI,我叫它通用动态调用VI,以下是其程序框图。
LabVIEW动态调用VI及调用路径问题

上图中,“运行VI”调用节点的“Wait Until Done”属性设置为False,表示被调用VI被执行、显示界面后,调用VI还可以继续去干别的事情,这相当于显示调用了一个无模态对话框。如将“Wait Until Done”属性设置为True,则表示执行模态对话框调用,即被调用VI关闭后,调用VI才能继续干别的事情程序框图如下图所示。
LabVIEW动态调用VI及调用路径问题
以上两种(模态和无模态调用VI)调用方式,被调用VI执行完毕后需要自己关闭前面板,如下图所示。
LabVIEW动态调用VI及调用路径问题

3. 被调用VI的路径问题

在动态调用VI时,经常发生在开发环境下能正常调用VI,一旦打包成执行文件后,调用就出现了异常,原因是打包后LabVIEW会把exe文件看作是一层目录,这样按以前相对路径关系就找不到被调用VI了,所以出现了异常。
读者可以参考网上的解决办法,笔者也提出一种解决办法:先看下面的项目。
LabVIEW动态调用VI及调用路径问题
通过测试分析,不管是开发环境下还是打包成执行文件,如果把LabVIEW项目根目录的Main.vi作为当前VI,那项目下所有VI和main.vi的相对路径关系就确定了(注意必须是磁盘上文件路径关系,不是虚拟文件夹中的文件路径关系)。在程序中,先调用“拆分路径”函数节点得到main.Vi所在文件的绝对路径,再调用“创建路径”函数节点得到所调用VI的路径(含被调用VI文件名),如下图所示。
LabVIEW动态调用VI及调用路径问题
在Main.vi中,如要调用项目中的“VIFromSubPath.vi”文件,则上图中的“调用VI路径及文件名”赋值为“SubPath\VIFromSubPath.vi”,如要调用“VIFromSubVI.vi”,则“调用VI路径及文件名”赋值为“SubPath\SubVI\VIFromSubVI.vi”。这样,不管是打不打包,调用路径关系都是正确的。
撰写此文主要是备忘,也希望对读者有所帮助。

以上示例vi(LabVIEW 2012下设计)放在百度网盘上,有兴趣的读者可以下载使用 。
vi下载地址:DynamicCall.rar