在进行LabVIEW程序设计时,一个VI中可以包含一个或若干个子vi。这些子vi是被直接放置在程序框图中,习惯上称这些子vi为:静态链接子vi。这些子vi在VI载入的同时也被加载到内存中。
在应用程序设计时,我们希望能够自由地、任意切换操作界面和测量程序界面,并且希望在任何时候,前面板上仅运行一个程序界面。这样就能够保证良好地、准确地实现“人机对话”。完成这样的操作,就需要动态的调用不同的VI。
与静态链接的子vi不同,动态加载VI只有在打开VI引用时VI的调用程序才会将其加载。如果VI调用程序较大,采用动态加载VI的方式可以节省加载时间和内存,这是因为在调用程序需要运行该VI以前无需将其加载,在操作结束后又可将其从内存中释放。
举例:假如程序设计要求先后分别动态调用两个VI,它们被存放在项目中的某个文件夹中,名字分别为A.vi(打包时的主Vi)、B.vi。当希望程序运行时,首先运行A.vi(比如欢迎界面、办卡验证等操作),待正确执行完成制定操作后,关闭A.vi,调用运行B.vi(可以使实际的应用程序)。最后关闭B.vi程序停止运行。并保证前面板上仅运行一个程序界面。
图1 A.vi的程序框图
图2 B.vi的程序框图
图3 动态调用VI的程序框图
运行流程为:A.vi实现加法功能,当按下停止按钮时运行动态调用VI程序,对B.vi调用并运行实现乘法功能,同时A.vi关闭。当按下B中的停止键时,程序结束。
动态调用的本质就是利用VI的“属性节点”和“调用节点”来实现的:
1.VI引用句柄:由于A.VI已经载入内存,所以使用“本VI”(也就是A.VI)的引用”。
2.属性节点FP.State:根据A.VI的引用,确定A.VI的前面板状态,这里是:“Hidden”。
3.打开VI的引用:根据B.VI的路径和文件名,打开B.VI的引用,此时载入B.VI程序。
4.调用节点FP.Open:根据B.VI的引用, 确定B.VI的前面板状态。
5.调用节点Run VI:根据B.VI的引用, 确定B.VI开始运行,参数:不必等待运行结束和不自动关闭引用。
6.关闭引用:已完成B.VI的动态调用,关闭B.VI的引用。
7.调用节点FP.Close:根据A.VI的引用,关闭A.VI的前面板(A.VI退出内存)。
8.关闭引用:关闭A.VI的引用。整个动态调用过程结束,只有B.VI运行。