XNode
读者们应该都已经非常熟悉如何创建子 VI 了,甚至创建一些能处理多种数据类型的子 VI。但是我们是否还能创建一些功能更强大的节点呢,就像 LabVIEW 自带的那些函数(比如簇捆绑),甚至是结构(比如循环结构)等等?
还真的可以,LabVIEW 已经提供了相应的功能:XNode。XNode 看名字,会马上联想到 XControl。二者确实有一些相似之处,XNode 与 XControl 是差不多同时出现的技术。使用 XControl,用户可制作出具有复杂外观和行为的控件;而使用 XNode 则可以制作出具有复杂功能和行为的节点,并且它与 XControl 相同,也是使用 G (LabVIEW) 代码进行开发。XControl 很早就已经开放给 NI 的外部用户使用了,而 XNode 至今也没有正式开放给外部用户。但是,因为 LabVIEW 安装包已经包含了制作 XNode 的全部组件,用户只要改动一些设置就可以使用这个功能了,网上也可以找到很多用户制作的 XNode 产品。
开启 XNode 的相关功能
XNode 本质上就是一组有特定格式要求的库和 VI (类似的,XControl 本质上也是一组有特定格式要求的库和 VI),所以,理论上,用户即使不对 LabVIEW 做任何特殊设置,只要提供了符合要求的这样一组构成 XNode 的文件,就可以在程序里使用这个对应的 XNode 了。但在实际应用中,凭空创建这个些 VI 即繁琐又容易出错。如果激活了 LabVIEW 的 XNode 功能,LabVIEW 会提供一些模板以及文档来帮助搭建 XNode,极大的方便 XNode 的制作过程。
Windows
在 Windows 系统下,用户如果想方便的创建 XNode,有两个途径可选。一是官方途径,从 NI 官方得到一个启用 XNode 功能的证书,然后在电脑上激活这个功能。如果此路不通,也可以使用一些免费的第三方的工具。利用这些第三方工具,同样可以方便快捷的创建 XNode。比如,XNode Editor (Google 这个工具名,可以搜索到详细信息)。
此外,最好可以在 LabVIEW 的配置文件中添加以下设置,它们可以激活 LabVIEW 中与 XNode 相关的辅助开发和调试工具,使得 XNode 开发更容易。
XnodeWizardMenu=True
XnodewizardMode=True
XTraceXnode=True
XNodeDebugWindow=True
SuperSecretPrivateSpecialStuff=True
在 Windows 系统下,LabVIEW 的配置文件是与 labview.exe 同文件夹下的 labview.ini 文件。
Linux
笔者主要在 Linux 系统下使用 LabVIEW。在 Linux 系统下启用 XNode 功能还要更方便一些,只需要将如下配置拷贝到 LabVIEW 的配置文件中即可:
XNodeDevelopment_LabVIEWInternalTag=True
XnodeWizardMenu=True
XnodewizardMode=True
XTraceXnode=True
XNodeDebugWindow=True
SuperSecretPrivateSpecialStuff=True
在 Linux 系统下,LabVIEW 的配置文件的路径是: /home/<username>/natinst/.config/LabVIEW-x/labview.conf
。
其中的 XNodeDevelopment_LabVIEWInternalTag=True 设置可以让 LabVIEW 的新建功能增加 XNode 选项。
XNode 的调试菜单
LabVIEW 自带的一些节点也是使用 XNode 技术制作的。比如 Match Regular Expression,这个节点在函数选板“Programming -> String” 上。它看上去就是一个普通的 LabVIEW 自带函数,区别在于开发方式,Match Regular Expression 是用 XNode 制作的,其它的多数 LabVIEW 自带函数都是使用 C++ 编写的。当我们按照上文介绍的方法开启 XNode 调试工具之后,再用鼠标右键点击这个节点,会发现鼠标右键菜单多了 XnodeWizardMenu 这一组菜单。这组菜单列出了这个 XNode 所有的功能 VI。XNode 的功能 VI 与 XControl 的功能 VI 概念相似,用来控制 XNode 的各种行为和功能,下文会详细介绍。
在这个调试菜单上选取一个功能 VI,就会打开相应功能 VI 的程序框图。如果将来在编写 XNode 时遇到困难,可以用此方法打开一个别人做好的 XNode 的功能 VI,用于参考借鉴。
我们在上图看到的程序框图上的 Match Regular Expression 节点只是这个 XNode 的图标,就好像是子 VI 在调用 VI 程序框图上显示的图标。当我们双击一个子 VI 的图标,会打开这个子 VI 的执行代码;相应的,如果我们想查看这个 XNode 的执行代码是什么,可以在 XnodeWizardMenu 菜单中选取 “GeneratedCode”,LabVIEW 会把这个 XNode 的执行代码显示出来。比如下图是这个 Match Regular Expression 节点的执行代码:
上图中的运行代码似乎什么事都没做,其实这是因为这段代码不是人手工编写的,而是程序程生成出来的(所以叫 GeneratedCode),并且代码生成时候也没有排列得当。点击一下“Cleanup Diagram”按钮,就会看到完整的程序代码了:
XNode 与子 VI 有一些不同:子 VI 的代码是固定的,写好的什么样,就一直是什么样;XNode 的执行代码是程序动态生成的,它会根据配置选项,连接的数据线等条件的改变而改变。XNode 的功能强大,可用于制作很多不同类型的节点。比如,“Error Ring”是一个比较类似于数据接线端节点的 XNode,“定时循环结构(Timed Loop)”是一种结构(比如循环结构)的 XNode。