简略而言,动态调用指的是经过程序操控别的一个程序的运转、中止、赋值和获取值等。LabVIEW供给了多种动态调用的办法,从底层而言是经过VI Server技能完成的。
图 31所示为LabVIEW中的Application Control选板,动态调用所运用的节点都坐落这个选板。当调用一个在硬盘、内存乃至是网络途径上的vi时,首要要运用Open VI Reference以将该VI载入内存并获取VI的“句柄(Reference)”;然后再运用该句柄进行其它的操控操作;最终再封闭该VI的句柄防止内存走漏,这就完成了一次对VI的调用。
图 31 Application Control选板
图 32是一个动态调用的详细完成代码,首要运用Open VI Reference获取被动态调用VI的Reference(比如中是C:average.vi);再运用Call By Reference Node节电动态运转该VI;最终封闭VI的Reference。在运用Call By Reference Node时需求事前指定被调用VI的输入输出接口,也就是说这种动态调用的条件是有必要知道被调用VI的输入输出接口,不然无法进行动态调用。
图 32 VI的动态调用
Open VI Reference的途径输入是一个多态的输进口,也能够运用String输入,如图 33所示。此刻被调用的VI有必要在内存中,且输入的是被调用VI的文件名。值得一提的是这种“文件名”调用办法在可履行程序中是无法被调用的,因而主张最好选用途径的调用办法。
图 33 Open VI Reference的多态性
【运用5】
明显这是一个比较了解的递归调用,可是在LabVIEW中好像很难完成。因为LabVIEW不允许同名的VI一起在内存中,因而一个VI是无法VI调用自身的。可是,经过VI的可重入技能和动态调用技能却能够完成VI的递归调用。
图 34所示为Fibonacci数列在LabVIEW中递归的完成办法。case结构有两个分支,当n<=2时直接输出f(n)=1;当n>=3时,输出f(n)=f(n-1)+f(n-2)。此刻需求把VI设置为可重入状况。
图 34 Fibonacci数列
翻开Highlight东西,在Call By Reference Node运转时,程序是处于等候状况的,只要被调用的VI运转完毕,主程序才会持续履行。这好像无法处理在本节最初说到的问题,那么是否存在一种动态调用办法使被调用的VI与主VI之间别离独立运转呢?答案是必定的。
VI自身是有许多的特点和办法的,如图 35所示。运用这些办法就能够动态操控VI的运转、中止和赋值,各个特点节点和办法的详细意义见LabVIEW的协助文档。运用这种办法动态调用VI时,并不需求知道VI的输入输出接口。
图 35 VI Method
图 36是该运用“特点节点和办法”完成动态调用的一个实例。在大多数运用程序发动时会显现一个发动画面用来显现版权、开发单位、软件版别等信息,等候2秒之后封闭发动界面并发动运用程序主界面。图中运用了动态调用的办法发动主程序(Main.vi)并使主程序独立运转,首要运转程序后设置2秒钟的延时;其次,将发动画面的界面设置为“躲藏”(并没有退出内存,仅仅躲藏了前面板),而且运用Open VI Reference获取VI的句柄;然后运用FP.Open特点翻开主程序的前面板(仅仅翻开了前面板并没有运转);运用Run VI办法运转主程序,将Wait Until Done设置为false,这样就能够确保被调用VI的独立运转;最终,封闭当时VI的前面板。
图 36 VI的动态调用
经过Highlight东西看出该VI的运转是独立的,并没有等候Main.vi运转完毕才持续履行。