VI Scripting
1. 什么是VI Scripting
VI Scripting是LabVIEW中一项非常重要和强大的功能,简而言之,就是使用LabVIEW编程语言创建LabVIEW中的程序元素。这些程序元素当然包含一般的node, wire, structure等等。有个不太恰当的比方,比如众所周知,Eclipse是一套开发java程序语言的工具,但是Eclipse本身也是用java自己编写的,也就是说我们在使用java开发java。VI Scripting也类似,我们可以用LabVIEW开发LabVIEW。
一种比较准确的定义是:VI Scripting是LabVIEW提供的一种基于VI Server技术,让用户创建、修改以及了解VI信息的强大功能。使用VI Scripting可以得到VI的属性和行为,此外,我们还可以用VI Scripting改变VI的属性和行为。VI Scripting包含了一个接受指令的引擎,这些指令可以通过VI Server得到翻译,用来传给LabVIEW本身。VI中的所有东西都可以被认为是一种VI对象(object),包括FP/BD上的任何对象、Connect Panel、Icon以及几乎所有保存在VI中信息。所有对VI对象的修改都可以在编辑时期利用Property Node和Invoke Node完成。比如,VI接线柱的位置、颜色、接线情况都可以在编辑时期得到或修改。
一种比较准确的定义是:VI Scripting是LabVIEW提供的一种基于VI Server技术,让用户创建、修改以及了解VI信息的强大功能。使用VI Scripting可以得到VI的属性和行为,此外,我们还可以用VI Scripting改变VI的属性和行为。VI Scripting包含了一个接受指令的引擎,这些指令可以通过VI Server得到翻译,用来传给LabVIEW本身。VI中的所有东西都可以被认为是一种VI对象(object),包括FP/BD上的任何对象、Connect Panel、Icon以及几乎所有保存在VI中信息。所有对VI对象的修改都可以在编辑时期利用Property Node和Invoke Node完成。比如,VI接线柱的位置、颜色、接线情况都可以在编辑时期得到或修改。
2. 如何使用VI Scripting
VI Scripting在LabVIEW6.0以后的版本中均可以使用。但使用之前需要得到VI Scripting的license,关于如何得到license,可以与NI公司联系(目前已公开)。
使用VI Scripting需要安装VI Scripting的menu,当中有三个node,这三个node会经常被使用到,如下图所示:
使用VI Scripting需要安装VI Scripting的menu,当中有三个node,这三个node会经常被使用到,如下图所示:
此外,Application Control面板中的Property Node和Invoke Node也被广泛地使用到,常常与以上VI Scripting面板中的三个node配合使用,如下图所示:
配合使用以上几个node,几乎可以完成VI Scripting的所有功能。
下面首先介绍一下VI Scripting面板中的三个node。
首先是New VI。
下面首先介绍一下VI Scripting面板中的三个node。
首先是New VI。
这个node的主要功能就是新建一个VI,新建一个VI又有什么作用?一方面,正如字面意思,它能够创建一个新的VI,而这个新的VI便是接下来后续工作的母体,或者称为容器;另一方面,通过创建一个新的VI,可以极大的方便调试其余主要VI Scripting程序,你可以清楚地看到你是如何创建node,如何连线,甚至可以逐步地看到这些步骤。笔者就经常将某些VI Scripting的程序,单独拿出来,然后再用这个node创建一个新的VI,后面连上要调试的VI Scripting程序,事实证明,这样的调试,效率还是颇高的。
关于这个node,还有一点补充,笔者在使用这个node时,经常还在后面关联上一个Property Node,用来打开创建的VI的前后面板,如下图所示:
关于这个node,还有一点补充,笔者在使用这个node时,经常还在后面关联上一个Property Node,用来打开创建的VI的前后面板,如下图所示:
接下来介绍 New VI Object。
顾名思义,就是创建一个新的VI Object,这个object可以说是多种多样的,node、structure、SubVI,甚至连XNode都可以创建。
这个node,需要提供一个owner refnum,通常是一个diagram的refnum,比如可以是上面介绍的New VI输出的refnum。还有些情况下,比如使用XNode或者External Node时,程序会自动提供一个diagram的refnum。
接下来比较重要的是这个node上方的一个接线柱,vi object class。通常我们可以create constant来提供这个参数,这个constant是一个class specifier constant。可以通过单击它选择要创建的VI Object的类型,比如我想创建一个SubVI,可以按照下图所示操作:
这个node,需要提供一个owner refnum,通常是一个diagram的refnum,比如可以是上面介绍的New VI输出的refnum。还有些情况下,比如使用XNode或者External Node时,程序会自动提供一个diagram的refnum。
接下来比较重要的是这个node上方的一个接线柱,vi object class。通常我们可以create constant来提供这个参数,这个constant是一个class specifier constant。可以通过单击它选择要创建的VI Object的类型,比如我想创建一个SubVI,可以按照下图所示操作:
当然,接下来还需要指定这个New VI Object的其他参数,比如variety、path、position等等。这个node的输出就是创建好的这个object的refnum,可以连上Property Node或者Invoke Node得到或修改这个object的属性和行为。
最后是Open VI Object Reference。
最后是Open VI Object Reference。
这个node的功能在于取得一个已有的VI Object的refnum。比如说我们已经创建了一个Wait (ms) 函数,这个函数有一个terminal输出,现在我们向得到这个terminal的refnum以便于后续操作,这时候就可以用这个Open VI Object Reference node了,如下图所示:
下面将举一个简单的例子说明如何使用VI Scripting。
利用VI Scripting编写程序还是有一点工作量的。因为需要对程序中的每个object作处理,所以,即便是一个比较简单的LabVIEW程序,如果用VI Scripting写出来也需要耗费相当的工作量。比如,我们想利用VI Scripting编写如下的程序:
程序运行结果大致应如下图所示:
这在LabVIEW中应当说是一个比较简单的程序,但是用VI Scripting来写这个程序,还是有一定的工作量的,下面我们将逐步演示如何编写。
我们先仔细观察该程序的Back Diagram。
我们先仔细观察该程序的Back Diagram。
我们首先需要一个Waveform Chart,还需要一个Stop Button,以及一个While Structure,并且需要把While Structure设置成为Stop if true我们的程序中必须首先构造这些部分,如下所示:
接下来,显然,我们还需要构造一个Random Number和一个Wait Until Next ms Multiple Node。当然,这两个node可以同时构造,如下图所示:
这还不够,还需要把Random Number和Waveform Chart的输入接线柱连接起来,我们也可以用VI Scripting配合Property Node和Invoke Node来实现:
好,接下来是最后的步骤了,将While Structure的Stop if true与Stop Button连接起来,并且处理error code。
到此为止,我们的程序才告一段落(以上程序在Windows XP SP2 + LabVIEW 8.2下运行通过)。
可能读者会有疑问,既然用VI Scripting来编写程序这么麻烦,比直接使用LabVIEW写程序麻烦多了,为何还需要VI Scripting呢?答案是,VI Scripting的强项以及优势就在于可以在LabVIEW的运行时期,生成这些代码,这个功能十分强大,具体可以参考下一节中给出的解释。
3. VI Scripting的地位以及与LabVIEW中其他组件的关系
VI Scripting在LabVIEW中的地位至关重要,LabVIEW的几乎每个功能,都会有对应的VI Scripting属性和方法。如果某个LabVIEW的新功能对VI Scripting有影响,那么,该新功能的开发者就将被要求开发对应的VI Scripting属性和方法。因此,可以说,VI Scripting是LabVIEW中的一项核心功能,具备强大的功能,处于较高的地位。
在LabVIEW中的其他组件中,VI Scripting得到了广泛的应用。可以这么说,如果没有VI Scripting,那么这些组件将不能充分发挥其功能。笔者有一些编写External Node以及XNode的经验(这两项功能仅限于NI公司内部使用,没有对外开放)。可以提一句,External Node和XNode都提供了一种编写用户自己的Node的功能。因为是用户自定义的node,那么就需要定义其编辑时期和运行时期的行为,而运行时期该node所生成的LabVIEW程序将完全使用VI Scripting来编写。如果没有VI Scripting,External Node和XNode也就只剩下了一副空骨架。
4. 如何调试VI Scripting的程序
如果是类似于上文中示例的纯粹的VI Scripting程序,那么调试也不外乎以下几种,Highlight Execution,设置断点,单步跟踪等等。
但是,VI Scripting常常与其他LabVIEW组件配合使用,如在External Node和XNode中得到使用。在这种情况下,往往,diagram的refnum是由VI Scripting的母体程序(即External Node和XNode)自动提供的,而VI Scripting用来完成在运行时期生成LabVIEW程序。这个时候,调试就变得比较复杂。笔者曾经也常常因此困惑,而最常采用的调试方法就是将母体程序中的VI Scripting代码拷贝到一个比较干净的VI中,运行该VI,便能方便地得到错误信息。
5. VI Scripting的发展展望
VI Scripting在LabVIEW中处于一个核心的重要地位,因此,可以肯定地说,VI Scripting在未来的岁月中将会得到一个长足的发展。另一方面,NI公司已经将VI Scripting技术对用户开放,VI Scripting技术也将逐步走向成熟。
开始VI Scripting的神奇之旅吧!
可能读者会有疑问,既然用VI Scripting来编写程序这么麻烦,比直接使用LabVIEW写程序麻烦多了,为何还需要VI Scripting呢?答案是,VI Scripting的强项以及优势就在于可以在LabVIEW的运行时期,生成这些代码,这个功能十分强大,具体可以参考下一节中给出的解释。
3. VI Scripting的地位以及与LabVIEW中其他组件的关系
VI Scripting在LabVIEW中的地位至关重要,LabVIEW的几乎每个功能,都会有对应的VI Scripting属性和方法。如果某个LabVIEW的新功能对VI Scripting有影响,那么,该新功能的开发者就将被要求开发对应的VI Scripting属性和方法。因此,可以说,VI Scripting是LabVIEW中的一项核心功能,具备强大的功能,处于较高的地位。
在LabVIEW中的其他组件中,VI Scripting得到了广泛的应用。可以这么说,如果没有VI Scripting,那么这些组件将不能充分发挥其功能。笔者有一些编写External Node以及XNode的经验(这两项功能仅限于NI公司内部使用,没有对外开放)。可以提一句,External Node和XNode都提供了一种编写用户自己的Node的功能。因为是用户自定义的node,那么就需要定义其编辑时期和运行时期的行为,而运行时期该node所生成的LabVIEW程序将完全使用VI Scripting来编写。如果没有VI Scripting,External Node和XNode也就只剩下了一副空骨架。
4. 如何调试VI Scripting的程序
如果是类似于上文中示例的纯粹的VI Scripting程序,那么调试也不外乎以下几种,Highlight Execution,设置断点,单步跟踪等等。
但是,VI Scripting常常与其他LabVIEW组件配合使用,如在External Node和XNode中得到使用。在这种情况下,往往,diagram的refnum是由VI Scripting的母体程序(即External Node和XNode)自动提供的,而VI Scripting用来完成在运行时期生成LabVIEW程序。这个时候,调试就变得比较复杂。笔者曾经也常常因此困惑,而最常采用的调试方法就是将母体程序中的VI Scripting代码拷贝到一个比较干净的VI中,运行该VI,便能方便地得到错误信息。
5. VI Scripting的发展展望
VI Scripting在LabVIEW中处于一个核心的重要地位,因此,可以肯定地说,VI Scripting在未来的岁月中将会得到一个长足的发展。另一方面,NI公司已经将VI Scripting技术对用户开放,VI Scripting技术也将逐步走向成熟。
开始VI Scripting的神奇之旅吧!