跳到主要内容

动态创建和修改 VI

读者应该已经很熟悉如何编写或者修改一个 VI 了。但是有些 VI 的编写工作可能过于繁琐,我们会希望,如果能有个程序去自动处理这些工作就好了。比如说,有一个项目,它有几百个 VI,但是我们需要为每一个 VI 都加上一段包括版权信息文字;又或者我们需要把其中所有名为“xx句柄”的控件都改为“xx引用”等等。手动一个一个 VI 去修改,不但麻烦,并且容易出错或遗漏。这一节我们介绍如何编写程序,让程序去完成这些针对 VI 的编辑修改工作。

VI 脚本授权

前文提到的 VI 脚本相关的属性和方法都是不需要特别授权的,在 LabVIEW 专业版中直接就可以使用。还有一些更加强大的 VI 脚本功能在默认情况下并没有打开。比如,需要使用 VI 脚本创建新的 VI 或 VI 上的控件、函数等,或者需要修改 VI 的程序框图等功能。从 LabVIEW 2010 开始,打开这些高级功能的开关被放置在 LabVIEW 的选项对话框中。在选项中的 VI 服务器页面,可以看到 VI 脚本选项,只要选中这一选项,VI 脚本功能就被激活了:

在激活了 VI 脚本的授权之后,“应用程序控制”函数选板上会多出一个名为 VI 脚本的子选板:

这个子选板中有一些新增加的函数。“新建 VI”用于创建新的 VI;“打开 VI 对象引用”用于通过标签打开 VI 上的对象,比如控件、函数等。利用 VI 前面板的“控件[]”、程序框图的“节点[]” 等属性,也可以实现类似的功能。“新建 VI 对象”函数用于创建新的对象;“遍历查找图形对象”用于得到一个 VI 上某一类的对象的所有引用。这一功能与前文“得到对象的引用”一节提到的“Get Control.vi”的功能非常类似,以后可以使用这个函数替代 Get Control.vi。

激活 VI 脚本的授权后,可使用的属性和方法也会增加很多。下图是一个 VI 类型对象的属性节点的选择属性的菜单,其中列出的几个属性,比如“包含已编译代码”、“程序框图”、“程序框图窗口”等属性都是在激活授权后出现的。

这些授权后获得的属性和方法功能更加强大,比如可以使用它们创建或修改 VI 的代码。在选择了这些需要授权的属性或方法后,属性节点或者调用节点会变成浅蓝色,而不是之前那种淡黄色的背景。

创建 VI

使用 "新建 VI" 函数,可以创建出一个新的 VI,并得到它的引用。通过设置 VI"前面板 -> 打开" 和 "程序框图 -> 打开" 属性,可以让它的前面板以及程序框图显示出来:

这个程序运行之后,计算机屏幕上会出现一个新建的 VI。它的行为与在 LabVIEW 的菜单中选择 "文件 -> 新建 VI" 是相同的。

创建新的控件

在创建了空的 VI 之后,就需要考虑为其添加一些内容了。例如,首先为其添加两个数值控件。创建新的控件使用的是 "创建 VI 对象" 函数。给 "创建 VI 对象" 函数提供正确的控件类型、控件引用类型、控件位置和新控件的所有者(在这里指新建 VI 的引用),它就可以在这个 VI 上创建出一个新的控件。创建新控件的程序框图如下所示:

运行上面的程序,创建出来的 VI 的前面板如下:

创建程序框图

创建程序框图上的节点的方法与在前面板上创建控件的方法是相同的。下图是示例程序的一部分代码,它省略了程序前面创建新 VI 的部分,只显示了创建程序框图内容的部分:

运行上图中的代码,将会在新 VI 的程序框图上创建出一个新的加法函数和一个数值常量。

对于程序框图,除了要创建节点之外,还要把它们用数据线连接起来。连接数据线使用的是接线端的方法 "连接数据线",它可以把两个接线端连接起来。下图所示的程序是把新生成的数值常量和加法函数连线:

其它的接线端也需要被连接起来,整个的程序框图如下所示:包括创建 VI、创建控件、创建程序框图上的节点以及对它们连线:

运行上图这个程序,生成的新 VI 的程序框图如下图所示。

在这一章的某些示例图中,为了保持代码结构简单,省略了一个极其重要的步骤:关闭引用(Close Reference)。在实际编写 VI Scripting 程序时,通过“创建 VI 对象”或任何属性节点获取的每一个对象引用(无论是节点、连线还是接线端),在使用完毕后都必须显式调用“关闭引用”函数。如果不关闭这些引用,LabVIEW 会产生严重的内存泄漏。在处理批量生成或修改任务时,这会迅速耗尽系统内存导致 LabVIEW 崩溃。

需要通过编写程序从零创建一个新 VI 的用例其实并不多,除非是需要生成大量高度模板化的硬件驱动程序 VI。VI Scripting 最主要的用途是开发编辑器辅助工具,例如:编写“快捷放置插件 (Quick Drop Plugins)”来一键自动连线、编写自定义的右键菜单插件,或者开发代码审查和自动重构工具。此外,运行程序来编写 VI 的程序框图也是 XControlXNode 的实现方法。

批量修改 VI

在实际应用中,比较常用的是需要对已有的 VI 进行某种批量修改。比如,已经编写好了一个由几十个 VI 组成的项目。随后,又有新的需求,要求修改所有 VI 的某属性,或者统一修改所有 VI 中某些不规范的控件标签名,甚至修改所有 VI 的前面板背景色等。这些修改在每个 VI 中都是相似的,这种情况就非常适合通过 VI Scripting 编程来统一处理。

以一个简单的任务为例。当我们需要把自己所写的一批 VI 发布给外部用户时,可能需要给这些 VI 加上密码,以保护知识产权。

要完成这样一个任务,首先要得到所有需要被修改的 VI 的路径。在这个例子中,我们采用最简单的策略,列出一个文件夹下的所有 VI 文件名。然后一一打开每个 VI 的引用,通过属性和方法对 VI 进行修改。在这个例子中,我们使用 VI 的“锁定状态 -> 设置 (Lock State -> Set)”方法给 VI 添加密码。

修改了 VI 之后,一定要执行保存操作。如果不保存,一旦 VI 引用被关闭,内存中的所有修改都会随着 VI 卸载而丢失。保存 VI 使用的是 VI 的“保存 -> 仪器 (Save -> Instrument)”方法。(注:这里的“仪器”是早期英文版 Virtual Instrument 缩写带来的历史直译,它实际上指代的就是内存中的这个 VI 实例本身)。

最后,千万不要忘记在每次循环结束前关闭当前 VI 的引用。整个任务的逻辑流程如下图所示: