XNode
请勿在生产环境中使用 XNode
本节介绍的 XNode 是完全不受支持的底层实验性技术。滥用 XNode 极易导致 VI 文件永久性损坏和开发环境崩溃,且代码跨版本升级时极易失效。
在 LabVIEW 开发中,如果仅仅是为了实现“适应多种输入数据类型”、“动态处理数组/簇”等泛型功能,请务必优先使用自适应 VI (Malleable VI, .vim)。VIM 官方原生支持、完全安全,已经取代了 90% 过去不得不依赖 XNode 才能实现的需求。本节内容仅供作为探究 LabVIEW 底层编译机制的技术极客研究之用。
读者们应该都已经非常熟悉如何创建子 VI 了,甚至创建一些能处理多种数据类型的子 VI。但是我们是否还能创建一些功能更强大的节点呢,就像 LabVIEW 自带的那些函数(比如 Bundle 簇捆绑),甚至是结构(比如循环结构)等等?
还真的可以,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 节点的执行代码:
