问题提出
在使用LabVIEW软件编写大型测试软件时,对于某些子程序,考虑到程序执行效率及前面板大小有限等因素,有时需要在主程序中动态加载运行并显示其前面板,同时也要实现主程序与子程序控件之间的值交互,如主程序能够读取或修改子程序前面板中某个控件的值。
那么,如何在LabVIEW平台中实现这种目的呢?实际上,这儿可以分解为下面两个问题:
1. 如何在主程序中动态加载调用子程序面板?
2. 如何动态设置(修改)或获取子程序面板中控件的值?
对于第1个问题,在主程序中可以通过子面板控件动态加载调用子程序。
对于第2个问题,通过子程序中控件的名称可获取控件的引用,进而修改或获取该控件的值。
对于上面两个问题,下面通过一个简单的例子给出LabVIEW中的解决方法。
实例说明
该例运行前面板如下图所示,主界面区域分割成了左右两部分,右半部分功能是使用子面板控件动态加载并显示名为“参数子面板.vi”的子程序前面板,该面板上包含了三个控件,分别为“控件1”、“控件2”和“控件3”三个数值控件;左边部分功能是通过控件名称用以读取或修改子面板上这三个控件的值。
程序框图实现方法
其程序框图使用包含2帧的顺序结构,第1帧目的是在子面板中动态加载运行子程序并显示其前面板,第2帧目的是读或写子面板某个控件的值。
第1帧代码如下图所示,在子面板中动态加载子程序前面板并显示时,分别使用了VI的调用节点函数“Run VI”和子面板的调用节点函数“Insert VI”。另外,该帧中,也将打开的子程序的VI引用通过顺序结构的局部变量传递给了下一帧。
在第2帧中使用了事件结构,主要完成通过子程序中控件的名称设置或获取某个参数的值,代码如下图所示:
第2帧中实现的关键技术是怎样得到子程序中被修改控件的引用,为此,本例单独写了一个子程序,对应上图中红色矩形框内的图标,其实现代码如下图所示。该子程序包含2个输入参数ControlName和VIRef,即控件的名称和其所在的VI引用,1个输出参数“ControlRef”,即根据名称查找到的控件的引用。其原理是通过VI的引用得到当前VI的面板引用,由面板引用得到当前面板上所有控件的引用,然后由控件引用得到每个控件的名称,然后在While循环中逐一与被查找的控件名称比较,与其相等即为查找到的控件的引用。
在第2帧框图程序中,得到被设置或获取的控件引用后,就可以利用控件的“值”属性对其进行修改或读取了。
需要说明的是,这儿得到的控件引用是一个通用型的引用,在直接使用其“值”属性时,由于该类型的引用对应的值属性可能是数值型的值、布尔型的值或路径型的值等等,程序本身是无法判断的,所有对其“值”属性读或写时,其输出或输入参数都是变体类型的变量。如下图所示,当设置其值时(左图),可以将前面板上的“参数值”控件的值直接输入到属性节点,LabVIEW内部自动可以将任意的数据类型转换为变体类型。但当获取其值时(右图),由于其变体类型可以表示任意类型的数据,需要开发者显式的通过“变体至数据类型转换”函数将变体类型的值转换已知类型的值。对于本例,需将变体类型转换为“双精度”类型的变量。
总结
本文通过一个具体的例子,详细演示了如何在LabVIEW平台中实现子程序前面板的动态加载及主/子程序间控件值的交互功能。通过这个例子学到的编程知识点包括:子面板的使用方法,属性节点的使用方法、变体类型的使用等。
大家加关注并私信回复:LabVIEW038,可获取该文章对应的LabVIEW原程序下载。
本文暂时没有评论,来添加一个吧(●'◡'●)