动态创建和修改 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 的程序框图如下图所示。
需要编程序创建一个新 VI 的用例不多,除非是需要生成大量的 VI。比如,某公司开发硬件驱动程序,需要生成大量面板和程序框图都类似的 VI。此外,运行程序来编写 VI 的程序框图也是 XControl 和 XNode 的实现方法。
批量修改 VI
在实际应用中,比较常用的是,需要对已有的 VI 进行某种批量修改。比如,已经编写好了一个由几十个 VI 组成的项目。随后,又有新的需求,要求修改所有 VI 的某属性,或者修改所有 VI 中某些相似的代码片段,或者修改所有 VI 的前面板布局等。这些修改在每个 VI 中都是相似的,这种情况就非常适合通过编程来统一修改。
以一个简单的任务为例。当我们需要把自己所写的一批 VI 发布给用户时,可能需要给这些 VI 加上密码,以保护产权。要完成这样一个任务,首先要得到所有需要被修改的 VI 的路径。在这个例子中,我们还是采用最简单的策略,列出一个文件夹下的所有 VI。然后一一打开每个 VI,通过属性和方法对 VI 进行修改。在这个例子中,我们使用 VI 的 "锁定状态 -> 设置" 方法给 VI 添加密码。修改了 VI 之后,一定要保存。如果不保存,VI 引用被关闭后,所有的修改都会丢失。保存 VI 使用的是 VI 的 "保存 -> 仪器" 方法(VI 的全称是 "虚拟仪器")。整个任务的代码如下图所示: