子面板控件介绍 子面板控件是LabVIEW中的一种容器类型控件,借助于这个控件可以在当前VI前面板上动态加载并运行另一个子VI前面板程序。 它同选项卡类似,但又不同于选项卡控件,如子面板控件没有选项卡控件的页选择器,一次只能显示一个页面,但它可以在内存中动态加载已运行的子程序,且一个在内存中被加载的子程序(模板程序)可以被多个子面板控件同时加载运行,这样可以实现主面板程序与子面板程序的分离编写,便于一个复杂软件的多人协作分工完成。 另外,也可以通过子面板控件方便的设计类似向导的用户界面程序,如在顶层VI的前面板上放置上一步和下一步按钮,并用子面板动态加载向导中每一步的前面板。 下面通过一个例子详细介绍子面板控件的使用方法。 示例说明 该示例运行界面如下图所示,通过点击按钮"子面板1"和"子面板2"在"子面板"控件中动态加载并运行对应的子程序,实现不同的功能。其中,在左图中显示的是加载子面板1时的运行情况,动态显示不断变化的正弦曲线;在右图中显示的是加载子面板2时的运行情况,显示了一个字符串"HelloLabVIEW!"。点击"退出"按钮时结束程序的运行。 其中,子面板1程序(名称为"子面板1.vi")的前面板及框图程序如下图所示,主要实现利用"正弦信号"函数,每隔50ms产生100个正弦信号的采样点,其幅值为1,在"波形图"控件上显示,程序框图为一始终运行的循环结构,便于主程序面板加载到内存中时能够始终运行。 子面板2程序(名称为"子面板2.vi")的前面板及框图程序如下图所示,为简单起见,本例仅仅是每隔500ms显示一个字符串"Hello LabVIEW!",同上,程序架构为一始终运行的循环结构,以便加载到内存中时能够始终运行。 框图程序实现过程 主框架采用while循环+事件结构的形式,在事件结构中响应三个按钮控件的"值改变"事件,完成相应的功能。其中,在按钮控件"子面板1"和"子面板2"的值改变事件代码实现过程中,需要重点考虑下面两个主要问题: (1) 如何在内存中动态加载、运行并将子程序的前面板显示到子面板控件中? (2) 如何在一个子面板控件中能够随时动态切换显示不同的子程序面板? 对第1个问题,当在前面板上放置子面板控件时,LabVIEW自动在程序面板上生成一个子面板控件的调用节点函数"Insert VI",其只需一个参数"VIRef",为子面板控件中待加载的子程序引用,因此只需在内存中打开一个VI引用并运行即可。实现方式如下图所示,在事件处理结构中,使用了一个包含2帧的顺序结构,在第2帧中取得待加载子程序的路径后使用了三个关键步骤,分别为打开VI引用、运行VI及插入VI到子面板控件,即可实现将子程序的前面板显示到子面板控件中的功能。其中,运行VI步骤中使用了VI引用的调用节点函数"Run VI",其一个关键参数"Wait Until Done"设置为假,确保在子面板控件中显示子程序前面板时,无需等待子程序运行完成后才能加载显示。注意,此处最后将打开的VI应用添加到"子VI引用"局部变量中进行保存,以便在动态切换不同子面板时能够将其在内存中成功关闭。 对第2个问题,本例要求在子面板控件中能够随时切换加载两个不同的子程序面板,此时需考虑的是,当加载另一个子程序面板时,若当前子面板控件中已经加载了一个子程序面板,那么如何将其卸载掉,从而加载新的子程序前面板进行显示。本例的解决方案是在程序中通过一个局部变量来保存当前已加载的VI引用,当加载新的子程序前面板时需判断该变量的值,若该值不为非法的引用句柄,则表示当前子面板控件中已经加载了一个子程序面板,此时调用VI引用的调用节点函数"AbortVI"来终止当前VI的运行并从子面板控件中卸载,然后关闭该VI的引用即可。 另外,在处理按钮"子面板1"和"子面板2"的事件代码时,由于其完成的功能都是加载对应的子程序前面板,代码除了被加载程序的路径外几乎完全相同,因此本例将这两个事件放在了一个"值改变"的事件结构中。根据当前事件源的控件引用来判断当前是点击了哪个按钮触发了事件。本例中,由于在设计前面板程序时,两个事件源即按钮"子面板1"和"子面板2"其标签是不同的,因此可以利用控件的引用调用控件的属性节点即可得到当前控件的标签,进而判断当前加载哪个子程序面板。这种方法可以大大简化LabVIEW的代码量,使程序更简洁、易读,是LabVIEW中常用的高级编程技巧之一。 总结 对于子面板控件的使用,本文通过一个例子,详细给出了如何在内存中动态加载、运行、显示及切换不同的子程序前面板的方法。