当您在上述对话框中配置一个网络缓冲区后,您实际上是配置了两个不同缓冲区的大小。服务器端的缓冲区,如图10中标有共享变量引擎( SVE )的方框中的缓冲区所示,是自动创建的,并被配置为和客户端缓冲区同样大小。客户端的缓冲区即您在使能共享变量缓冲区时逻辑上认为的缓冲区。在客户端缓冲区 (如图10右边所示)是用于保持先前值队列的缓冲区。正是这种缓冲区避免了您的共享变量受到循环速度或网络流量波动的影响。
在LabVIEW 8.5中,网络缓冲区经历了一个改变。底层NI-PSP协议的重新设计使的数据传输变得大致无损。同样如图10所示,标记有共享变量引擎( SVE )的方框中的缓冲区是服务器端的缓冲区。这个缓冲区当且仅当底层协议需要流量控制时使用,即只发生在下述的两种情形中:
概览
LabVIEW为创建分布式应用提供了多种多样的技术接口。LabVIEW 8中引入的共享变量为简化编程应用向前迈出了重大一步。本文将介绍共享变量,并讨论LabVIEW 8.20和LabVIEW 8.5中它的特征和性能。
目录
创建共享变量
数据类型
变量参考
单进程共享变量
网络发布的共享变量
共享变量引擎
性能
标定
1. 创建共享变量
使用共享变量,您可以在同一个程序框图的不同循环之间或者网络上的不同VI之间共享数据。与LabVIEW中其他现有的数据共享的方法如UDP/TCP, LabVIEW 队列, 及实时 FIFO不同,您通常在编辑时使用属性对话框来配置共享变量,而不需要在您的应用中包括配置代码。
您可以创建三种类型的共享变量:单进程,网络发布,以及时间触发的共享变量。本文详细讨论了单进程和网络发布共享变量。请参考文档:“使用时间触发网络和LabVIEW 8的实时模块完成以太网上的确定性通信”来了解更多有关时间触发共享变量的内容。创建一个共享变量时,需要右键点击一个计算机设备,如项目树中的"我的电脑"或实时目标,并选择新建»变量来显示共享变量属性对话框。在对话框中可对新的变量进行具体配置。
您必须在一个打开的项目中创建共享变量。在项目中添加共享变量时,需要在项目浏览窗口中右键单击一个目标,一个项目库,或者项目库内的一个文件夹,在快捷菜单中选择新建»变量来打开共享变量属性对话框。配置各个选项,之后单击确定按钮。
如果您右键点击一个不在项目库中的目标或文件夹,并选择新建»变量从快捷菜单中创建一个共享变量, LabVIEW会自动创建一个新的项目库并将共享变量包含在其中。想要了解更多关于变量和库的信息,请参见共享变量有效期部分。
图1给出了一个单进程共享变量的共享变量属性对话框。LabVIEW实时模块和LabVIEW数据记录和监控(DSC)模块为共享变量提供了额外功能和可配置特性。尽管在这个例子中LabVIEW实时模块和LabVIEW的DSC模块都已经安装,但是只有在网络发布共享变量中您才可以使用LabVIEW的DSC模块所增加的特性。
图1单进程共享变量属性
至页首
2. 数据类型
您可以从大量的标准数据类型中为一个新的共享变量选择数据类型。除了这些标准数据类型外,您还可以从数据类型下拉列表中选择“来自自定义控件”来选择一个自定义控件作为自定义的数据类型。然而,当使用自定义数据类型时,LabVIEW不能够使用实时FIFO或者缩放(Scaling)。另外,如果您安装了LabVIEW的DSC 模块,则不良状况的提示会很有限。
当您配置完共享变量的属性并点击确定按钮后,共享变量将出现在您项目浏览窗口中所选择的库或者目标中,如图2所示。
图2项目中的共享变量
从共享变量所属的目标LabVIEW可以部署和托管该共享变量。想要了解更多有关部署和托管共享变量的内容,请参见部署和托管部分。
至页首
3. 变量参考
当您添加共享变量到一个LabVIEW项目后,您可以将其拖至VI的程序框图中来进行读或写操作,如图3所示。程序框图中读和写节点被称为共享变量节点。
图3运用共享变量节点来对共享变量进行读和写
您可以根据共享变量节点连接至变量的方式来指定一个节点是绝对或相对目标的。绝对共享变量节点连接到创建共享变量的目标上的共享变量。相对目标的共享变量节点连接到包含该节点的VI所运行的目标上的共享变量。
如果您将含有相对目标的共享变量节点的VI移动到一个新的目标,您也必须将共享变量移动到新目标。当您想移动VI和变量到新的目标时,可采用相对目标的共享变量节点。
默认的共享变量节点都是绝对的。右键单击一个节点,并选择更改为相对目标或者更改为绝对,来改变共享变量节点连接到共享变量的方式。
任何时候您都可以在项目浏览窗口中右键单击共享变量来编辑共享变量的属性。 LabVIEW项目将自动传递新的设置给内存中引用的所有共享变量。当您保存变量库,存在磁盘上的变量定义也将发生变化。
至页首
4. 单进程共享变量
使用单进程变量在同一个VI中不能用连线传输的不同位置间传递数据,例如同一个VI的并行循环之间,或者同一应用实例中的两个不同VI之间。单进程共享变量的底层实现与LabVIEW中全局变量相似。单进程共享变量相对于传统的全局变量的主要优点是能够将一个单进程共享变量转换成一个网络发布的共享变量,这样网络上的任何节点都可以访问。
单进程共享变量和LabVIEW实时
为了保证确定性,实时应用需要使用一种无阻塞,确定性的机制来实现将数据从代码的时间确定性部分(如高优先级定时环路或时间严格VI)传递到非时间确定性部分。当您安装LabVIEW实时模块后,您可以配置一个使用实时FIFO的共享变量,只需从共享变量的属性对话框中使能实时FIFO即可。美国国家仪器公司推荐采用实时FIFO在时间严格和低优先级的环路之间传递数据。您可以通过使能一个单进程共享变量上的实时FIFO来尽量避免使用低层次的实时FIFO VI。
LabVIEW在共享变量节点首次写入或读出一个共享变量时创建一个实时FIFO,这使得首次使用共享变量的执行时间会比随后使用时稍长。如果应用中要求极其精确的定时,可以在时间严格循环内部放置一个初始“热身”循环来解决接入时间的波动,或者在在时间严格循环外部至少对该变量进行一次读取。
图4 实时FIFO使能的共享变量
即使共享变量有多重写入或者读取的对象,LabVIEW为每个单一进程共享变量创建的实时FIFO是单一的。因此,为确保数据的完整性,多重写入操作会彼此阻塞,多重读取操作也同样。不过,读操作和写操作并不会彼此阻塞。美国国家仪器公司建议避免对时间严格循环中的单进程共享变量进行多重写入或读取操作。
图5多重写入或读取操作共享一个单一的FIFO
使能实时FIFO后,您可以选择两种稍有不同类型的FIFO功能变量:单元素和多元素缓冲。这两种类型缓冲区的一个重要区别是:单元素FIFO在溢出和下溢情况下不进行报警。第二个区别是对一个空的缓冲区进行多重读取时LabVIEW返回的值。多重读取单元素FIFO时将得到相同的值,直到下次写入者写入该变量。多重读取多元素FIFO时,每个读取者均得到它们最后一次从缓冲区中得到的值,如果它们以前并没有读过该变量,则会得到变量所属数据类型的默认值。如下所示。
图6多元素FIFO共享变量读取最后一次值的特性
如果要求每个读取者得到写入到多元素FIFO共享变量的每个数据点,请为每个读取者使用各自单独的共享变量。
至页首
5. 网络发布的共享变量
利用网络发布的共享变量,您可以在以太网上对共享变量进行读写操作。网络应用的处理完全由网络发布的变量完成。
除了使您的数据在网络中可用,网络发布共享变量中还增加了许多单进程共享变量不能提供的功能。由于需要提供各种附加功能,网络发布的共享变量的内部实现要比单进程共享变量复杂得多。接下来数节将讨论本方面内容,并给出利用网络发布的共享变量来获得最佳性能的一些建议。
NI-PSP
NI发布-订阅协议(NI-PSP )是用于传输网络共享变量的优化网络协议。
LabVIEW 8.5中的新特性!
NI-PSP的下层被重写以充分提高效率。在运行现代操作系统内核的现代机器中,我们发现TCP的性能显著优于在用户模式中对它的一些功能进行复制,因此,在LabVIEW 8.5中用到了这个优点。NI-PSP下的最底层协议已经重新设计以使用TCP / IP,并且根据桌面系统和NI的RT目标的性能进行了彻底调整(见下文的标定比较)。NI-PSP层保持不变,因此,您可以不更改您的应用就能够看到性能提升。
重要说明:
仅当通信链路的两端都已经安装了LabVIEW 8.5, LabVIEW才会使用这个新的NI-PSP实现,也就是当且仅当通信中的所有目标都安装了LabVIEW8.5时。如果其中一个目标是运行老版本LabVIEW的,那么两个终端都将使用旧的协议。
部署和托管
您必须将网络发布共享变量部署到一个用于在网络上托管该变量的共享变量引擎(SVE)上。当您写入到一个共享变量节点,LabVIEW将这个新值发送给部署和托管这个变量的SVE,SVE处理环路发布这个值,从而用户可以得到更新值。图7说明了这一过程。使用客户端/服务器术语来讲,SVE是共享变量的服务器,所有对其的应用(不论它们是读还是写变量)都是客户端。SVE客户端是共享变量节点实现中的一部分,在本文中,客户端和用户的定义是可互换的。
图7 共享变量引擎和网络共享变量值的改变
网络发布变量和LabVIEW实时
您可以实现使能一个网络发布共享变量的实时FIFO,但FIFO使能的网络发布共享变量与实时FIFO使能的单进程共享变量相比有一个重要的行为差异。在单进程共享变量中,所有写入和读出操作共享一个单一的实时FIFO;但网络发布的共享变量并非如此。网络发布共享变量的每一个读出操作,在单元素和多元素情况下都有各自的实时FIFO,如下所示。
图8 实时FIFO使能的网络发布变量
网络缓冲区
对于网络发布的共享变量,您可以使用缓冲区。您可以在共享变量属性对话框中配置缓冲区,如图9所示。
图9 在网络发布的共享变量中使能缓冲区
通过缓冲区,您可以解决对于一个变量读/写速度的临时波动问题。读出操作偶尔比写入慢的情况可能会导致一些更新数据的丢失。如果应用可以容忍偶尔的数据丢失,则较慢的读取速率并不会影响应用,此时您就不需要使能缓冲区。但是,如果读取操作必须获得每个更新数据,您就需要使能缓冲区。您可以在共享变量属性对话框中的变量页设定缓冲区大小,这样您就可以确定在旧数据被覆盖之前,应用中可以保存多少更新数据。
当您在上述对话框中配置一个网络缓冲区后,您实际上是配置了两个不同缓冲区的大小。服务器端的缓冲区,如图10中标有共享变量引擎( SVE )的方框中的缓冲区所示,是自动创建的,并被配置为和客户端缓冲区同样大小。客户端的缓冲区即您在使能共享变量缓冲区时逻辑上认为的缓冲区。在客户端缓冲区 (如图10右边所示)是用于保持先前值队列的缓冲区。正是这种缓冲区避免了您的共享变量受到循环速度或网络流量波动的影响。
在LabVIEW 8.5中,网络缓冲区经历了一个改变。底层NI-PSP协议的重新设计使的数据传输变得大致无损。同样如图10所示,标记有共享变量引擎( SVE )的方框中的缓冲区是服务器端的缓冲区。这个缓冲区当且仅当底层协议需要流量控制时使用,即只发生在下述的两种情形中:
1.如果您将数据写入到一个或多个共享变量的速度比客户端可响应的速度快。
2.如果您将数据写入到一个或多个共享变量的速度比内核的驱动程序可从物理层获取数据的速度快(大多数情况下是以太网)。
注意,以上两种情况都是网络层在共享变量通信栈下(并不受其控制)的限制。
与所有读写操作共享同一实时FIFO的FIFO使能单进程变量不同,网络发布的共享变量每一个读用户都有自己独立的缓冲区,所以读用户不受彼此影响。
图10 缓冲区
仅当读/写速率有短暂的波动时,缓冲区才发挥其作用。如果程序运行的时间不确定,而读取速率总是低于写入速率,则不管你指定多大的缓冲区最终都会出现数据丢失。由于缓冲技术为每一位用户都分配了一个缓冲区,因此,为避免不必要的内存使用,仅当需要时再使用缓冲区技术。
网络和实时缓冲
如果您同时采用网络缓冲和实时FIFO,则共享变量的执行中将同时包含一个网络缓冲区和一个实时FIFO。前面讲过,如果实时FIFO使能时,将为每一个读和写用户创建新的实时FIFO,从而多重写入和读出将不会彼此阻塞。
图11 网络缓冲和实时FIFO
虽然您可以独立设置这两缓冲区的大小,在大多数情况下,美国国家仪器公司建议您让它们保持同样大小。如果您使用实时FIFO,LabVIEW将为每一个读和写用户创建新的实时FIFO,从而多重写入和读出将不会彼此阻塞。
缓冲区有效期
LabVIEW在初始写或读操作时创建网络和实时FIFO缓冲区,具体由缓冲区的位置决定。服务器端的缓冲区在写入者初始写入一个共享变量时创建。客户端的缓冲区在一个用户初始读取一个共享变量时创建。如果对共享变量的写操作发生在用户的读操作之前,则该用户将不能得到这些初始数据。
图12缓冲区有效期
缓冲区溢出/下溢
在LabVIEW 8.20以上,网络发布的共享变量将报告网络缓冲区的溢出和下溢情况。而任何版本的实时FIFO都会返回错误来指示溢出/下溢情况。在LabVIEW 8.0或8.0.1,可以用以下两种方式检查网络缓冲下溢。由于共享变量时间标识的分辨率为1毫秒,当您以低于1kHz的速率更新共享变量时,您可以将变量的时间标识与其后读操作的时间标识进行比较来检测缓冲区下溢。或者,对于非实时应用,读取者可以将一个序列号与数据绑定来通知缓冲区溢出/下溢。您不能在时间严格循环中针对共享变量使用第二种方式,因为实时FIFO使能的共享变量不支持自定义控件(簇)的数据类型。
共享变量有效期
如前所述,所有共享变量都是项目库的一部分。SVE负责注册项目库和库中包含的共享变量(当LabVIEW需要调用这些变量时)。默认情况下,只要您运行引用任意共享变量的VI时,SVE即会部署并发布共享变量库。因为SVE将部署包含该共享变量的整个库,因此无论所运行的VI是否引用库中的全部共享变量,SVE都将发布库中所有的共享变量。您也可以在任何时候手动来部署任意的项目库,只需要右键点击项目浏览窗口的库即可。
停止托管该变量的VI或重启机器并不影响共享变量在网上的可用性。如果您需要删除网络上共享变量,您必须明确地在该项目浏览窗口中对该变量解除部署。您也可以选择工具»共享变量»变量管理器来对共享变量或整个变量项目库来解除部署。
前面板数据绑定
另一个适用且仅适用于网络发布共享变量的特性是前面板数据绑定。从项目浏览窗口拖拽一个共享变量到VI的面板来创建一个共享变量的控件绑定。当您为某个控件使能了数据绑定后,改变控件的值就改变了与其绑定的共享变量的值。在VI运行时,如果成功连接到SVE,则在VI的前面板对象旁边会出现一个绿 {MOD}指示,如图13所示 。
图13 绑定一个前面板控件到一个共享变量
通过在属性对话框中的数据绑定页面来获取和改变任意输入和显示控件的绑定。当使用LabVIEW实时模块或LabVIEW的DSC模块时,您可以选择工具»共享变量»前面板批量绑定配置,来得到前面板批量绑定配置对话框,来创建一个绑定多个输入和显示控件到共享变量的用户界面。
美国国家仪器公司不建议运行在LabVIEW实时的应用中使用前面板的数据绑定,因为前面板可能是不存在的。
编程访问
如上所述,您可以使用LabVIEW项目交互式的创建,配置和部署共享变量,您还可以使用程序框图上的共享变量节点或前面板的数据绑定来读取和写入共享变量。 LabVIEW中还提供了对于以上功能编程访问的方法。
在需要创建大量共享变量的应用中,您需要使用VI服务器来编程建立项目库和共享变量。此外, LabVIEW DSC模块提供了一套全面的VI用来编程创建和编辑共享变量和项目库以及管理SVE。您只能在Windows系统中编程创建共享变量库,然而,您可以编程部署这些新的库应用于Windows或LabVIEW实时系统中。
当您需要动态改变VI读写的共享变量时,可使用Datasocket API。您可以编程改变Datasocket链路的URL以实现动态改变共享变量。您还能够编程控制共享变量的其他功能,比如缓冲区大小等。此外,Datasocket API具有阻塞读取功能,即仅当共享变量更新时才进行读操作。
图14 用Datasocket API实现编程读写共享变量
此外,通过NI LabWindows/CVI 8.1 和NI Measurement Studio 8.1引入的网络变量库,您可以在ANSI C, Visual Basic .NET 或者VIsual C#环境下读写共享变量。
至页首
6. 共享变量引擎
SVE是一个使网络发布的共享变量能够过网络传送数据的软件框架。在Windows下,LabVIEW配置SVE为一个服务,并在系统启动时引导SVE启动。对实时目标,SVE是一个随系统开机加载的可安装启动组件。
为了使用网络发布的共享变量,SVE至少需要在分布系统中的一个节点上运行。网络上的任何节点都可以读写SVE发布的共享变量。如表1所示,只有安装SVE,节点才可以引用到一个变量。如果您需要根据应用需要在不同地点部署共享变量,您也可以在多个系统中同时安装多个SVE。
共享变量托管位置推荐
在一个分布式系统中,您必须考虑一系列因素来决定由哪计算设备部署和托管网络发布共享变量。
计算设备是否兼容SVE ?
下表汇总了SVE可适用的平台,并给出了可通过参考节点或Datasocket API使用网络发布的共享变量的平台。美国国家仪器需要不同平台至少能提供32兆并推荐64 兆内存供SVE使用。
LabVIEW 8.5新特性
Datasocket API现在支持Linux和Macintosh下的NI-PSP。以前,对这些平台我们推荐了一系列复杂的步骤来使用共享变量参考节点。我们现在不再推荐这样做。相反,应该更直接的在这些平台上使用Datasocket技术简化客户端的应用。请注意,在Linux和Macintosh中仍然不支持共享变量的托管。
Windows PCs
Mac OS
Linux
PXI
Real-Time
Compact FieldPoint
CompactRIO
Compact Vision System
Commercial PCs with
LabVIEW Real-Time ETS
RTX
SVE
X
X
Reference Nodes
X
X
DataSocket API w/ PSP
表1 网络发布的共享变量兼容性概况
应用需要数据记录和监控功能吗?
如果您想使用LabVIEW DSC模块的功能,您必须在Windows上托管共享变量。LabVIEW DSC模块对网络发布的共享变量新增如下功能:
·NI总数据库的历史记录。
·联网报警和报警记录。
·缩放。
·基于用户的安全。
·初始值。
·创建自定义I/O服务器。
·共享变量中集合LabVIEW的事件结构功能。
·编程控制共享变量各个方面和共享变量引擎的LabVIEW VI。这些VI特别有利于管理大量共享变量。
计算设备有足够的处理器和内存资源吗?
SVE是一项需要处理和内存资源的额外进程。为了在分布式系统中得到最佳的表现,请选择具有最大内存和最高处理能力的机器安装SVE。
哪个系统经常在线?
如果您的分布式应用中,一些系统可能定期离线,则请将SVE托管在一台一直在线的系统上。
共享变量引擎的其他功能
图15列出了SVE的很多功能。除了管理网络发布的共享变量外,SVE还负责:
·收集来自I/O服务器的数据。
·通过OPC和PSP的服务器为用户提供数据。
·为任何配置了缩放,警告和记录服务的共享变量提供这些服务。这些服务仅在LabVIEW DSC模块存在下可用。
·监测报警条件并进行相应响应。
I/O服务器
I/O服务器是SVE的插件,程序中可以用其使用SVE来发布数据。NI FieldPoint 5.0中包括一个I/O服务器,该服务器直接从FieldPoint存储地发布数据到SVE。因为SVE是OPC服务器,因此SVE和FieldPoint I/O服务器结合构成了FP OPC服务器。注意FieldPoint安装中不包括SVE,SVE需要从其他软件组件中安装,如LabVIEW。
NI - DAQmx 8.0中也包括一个I/O服务器,它可以自动将NI-DAQmx全局虚拟通道发布到SVE。这个I/O服务器取代了传统数据采集的OPC服务器和RDA。NI–DAQmx中包含SVE并且可以在LabVIEW未安条件下进行安装。
使用LabVIEWDSC模块,用户可以自行建立新的I/O服务器。
图15 共享变量引擎(SVE )
OPC
SVE是3.0兼容的,并可以作为Windows机器上的OPC服务器。任何OPC客户端可对托管于Windows机器上的共享变量进行读写操作。当您在Windows机器上安装LabVIEW DSC模块后,SVE也可以作为OPC客户端。您可以将Windows托管的共享变量绑定到DSC的OPC数据项上,并对这些变量进行读和写操作。
因为OPC是基于COM(一个Windows API)的技术,实时目标并不与OPC直接通信。如图16所示,但您仍然可以通过将共享变量在Windows上托管实现从实时目标访问OPC数据项。
图16 绑定OPC数据项
至页首
7. 性能
本节为使用共享变量创建高性能应用提供了一般准则。
Windows API由于单进程共享变量的实现类似LabVIEW全局变量和实时FIFO,美国国家仪器公司没有对单进程共享变量如何取得较好性能给出特殊建议。以下各节均针对网络发布的共享变量。
共享处理器
通过隐藏许多网络编程的实施细节,网络发布的共享变量简化了LabVIEW的程序框图。一般来讲应用中会包括LabVIEW VI,SVE以及SVE客户端代码。为了获得共享变量的最佳性能,开发应用时需要注意使其定期释放处理器以让SVE线程运行。实现其的方法之一是在处理循环中放置等待,并确保应用中不使用未定义次数的循环。实际需要等待的精确时间依赖于具体应用,处理器和网络;每种应用都需要一定程度的实验微调来达到最佳的性能。
SVE位置的考虑
在共享变量托管位置推荐一节中讨论了在选择安装SVE的位置时需要考虑的一系列因素。图17中给出了另一个可大大影响共享变量性能的因素。在这个例子中包含了实时目标,但它的基本原则也适用于非实时系统。图17给出了一个低效运用网络发布共享变量的例子:您在实时目标中产生数据,并需要将处理完的数据记录到本地,并通过远程机器进行监控。因为变量的用户必须从SVE接收数据,在高优先级循环中的写操作和正常优先级循环中的读操作之间将存在很大的延时,而且这一操作包含了整个网络中的两个来回。
图17实时系统中低效使用网络发布变量
图18给出了一个较好的应用框架。应用中采用一个单进程共享变量在高优先级循环和低优先级循环中传递数据,极大地减少了等待时间。低优先级回路记录数据,并通过网络发布共享变量为主机端的用户写入数据更新。
图18 在实时系统中有效使用网络发布变量
至页首
8. 标定
本节比较了共享变量和LabVIEW中其他数据共享方法的性能,如LabVIEW的全局变量,实时FIFO ,TCP / IP 。下表总结了以下各节讨论的测试。
测试
描述
SVE
位置
说明
T1
单进程共享变量vs全局变量
N/A
建立最大读/写速率
T2
单进程共享变量w/ 实时FIFO
vs.实时FIFO VI
N/A
采用实时FIFO时,建立最大读/写速率。
确定在定时回路中写入并同时从正常优先回路读回一个共享变量或实时FIFO数据的最高可持续速率。
T3
网络发布共享变量w/实时FIFO vs. 2-环实时FIFO w/ TCP
运行LV RT 的PXI
确定单点数据流经网络的最高速率。
共享变量: 读 VI 总在主机。RT-FIFO + TCP:类似T2,但具有TCP通信/IP网络。
T4
网络发布共享变量内存
RT系列目标
建立共享变量部署后的内存使用情况。
T5
比较8.2 网络发布共享变量和8.5变量-流
RT 系列目标
比较NI-PSP在 8.5中的实现和在8.20或更早版本中的实现。
本标定测试一台cRIO将波形数据流至桌面主机上时的吞吐量。
T6
比较8.2 网络发布共享变量和8.5变量-高通道计数
RT 系列目标
比较NI-PSP在 8.5中的实现和在8.20或更早版本中的实现。
本标定测试一台cRIO在高通道计数应用中的吞吐量。
表2 标定预览
以下章节描述了美国国家仪器公司为每一个标定创建的代码,并给出了实际的标定结果。方法和配置一节详细给出了每种标定选择的方法和每种标定运行的软硬件环境的配置细节。
单进程共享变量与LabVIEW全局变量
单进程共享变量类似LabVIEW的全局变量。事实上,单进程共享变量的实现是在LabVIEW全局变量上增加了时间标识功能。
为了比较单进程共享变量相对LabVIEW的全局变量的性能,美国国家仪器公司编写了标定VI来衡量VI每秒钟可以对一个LabVIEW全局变量或一个单进程共享变量进行读写的次数。图19给出了单进程共享变量的读取标定。单进程共享变量写入标定和LabVIEW的全局变量读/写标定遵循同一模式。
图19 单进程共享变量读取标定VI
综合读/写测试中,还包括了验证每个写入点都在同一循环中没有数据损失的被读回的验证代码。
T1的测试结果
图20给出了T1的测试结果。研究结果表明,单进程共享变量的读性能低于LabVIEW全局变量。写性能,以及读/写性能来看,单进程共享变量略低于LabVIEW全局变量。单进程共享变量的性能会受到是否开启时间标识功能的影响,因此如果没有必要的话,推荐关掉时间标识功能。
方法和配置一节讲述了本测试具体的标定方法和配置的细节。
图20 单进程共享变量与全局变量的性能比较
单进程共享变量与实时FIFO
美国国家仪器标定可持续的吞吐量来比较FIFO使能的单进程共享变量和传统的实时FIFO VI。标定中还检查了传送数据的大小或负载对以上两种实时FIFO实现的影响。
本测试包括一个时间严格循环(TCL)用来生成数据,以及一个正常优先级循环(NPL)用来消费数据。美国国家仪器通过对一系列双精度标量和数组数据类型进行测试来确定负载大小的影响。标量类型确定了负载是一个双精度数值是的吞吐量,数组类型确定了其余负载类型的吞吐量。当您执行上述两个环路无数据丢失时的最大可持续速度就确定了该测试记录的最大可持续吞吐量。
图21给出了实时FIFO标定的简化程序框图,其中略去了许多用于创建和注销FIFO的必要代码。需要注意的是从LabVIEW 8.20开始,引入了一个可以替代这里的FIFO子VI的新的FIFO函数。本文中的数据图表即由该FIFO函数得到,它比之前8.0.x 中的FIFO子VI有着更好的性能。
图21 简化的实时FIFO标定VI
另一个等效的测试中采用了单进程共享变量。图22给出了程序框图的简化描述。
图22 简化的FIFO使能单进程共享变量标定VI
T2的测试结果
图23和24给出了T2测试的结果,并比较了FIFO使能的单进程共享变量和实时FIFO VI函数的性能。结果表明,用单进程共享变量稍微慢于使用实时FIFO。
图23 单进程共享变量与实时FIFO VI的性能比较(PXI)
图24单进程共享变量与实时FIFO VI的性能比较( cRIO 9012 )
网络发布的共享变量与实时FIFO+TCP / IP
由于共享变量的灵活性,只需几个配置的改变,您就可以在网络中快速发布一个单进程共享变量。特别对于实时应用,早期版本的LabVIEW中完成同样传输需要引进了大量的代码来读取RT系列控制器上的实时FIFO,然后使用许多现有的网络协议之一在网络上传送数据。为了比较二者性能的不同,美国国家仪器公司同样创建了标定VI来衡量在一系列负载条件下无数据丢失时的可持续吞吐量。
对于预变量方式,标定VI采用了实时FIFO和TCP / IP 。一个TCL产生数据并将其放置在实时FIFO中;一个NPL从FIFO中读出数据并通过TCP/IP发送至整个网络。PC主机收取数据并验证没有数据丢失发生。
图25给出一个实时FIFO和TCP / IP标定VI的简化程序框图。与上面相同,这个框图大大对于实际的标定VI做了大幅简化。
图25 简化的实时FIFO和TCP / IP标定VI
美国国家仪器公司给出了一个使用网络发布共享变量的等效测试版本。图26给出了简化的程序框图。
图26 简化的实时FIFO-网络发布共享变量标定VI
T3的测试结果
本节给出了T3的测试结果,比较了实时FIFO使能的网络发布共享变量和基于实时FIFO VI和LabVIEW TCP/IP的等效代码的性能。图27给出了当LabVIEW的实时目标是一个PXI嵌入式RT系列控制器时的结果。
图27 网络发布的共享变量与实时FIFO和TCP VI性能比较( PXI)
T3的结果表明,网络发布共享变量的吞吐量与TCP方法的接近,而且对两种方法来说,从小到大不同大小的负载吞吐量基本都是一致的。共享变量使您的编程工作更容易,但并不是没有代价的。但应该看到,如果仅使用简单的TCP方法,它的性能很容易不如共享变量,特别对于在8.5中新的NI-PSP实现而言。
T4的测试结果
网络发布共享变量的内存占用
注意:在LabVIEW 8.5中,没有对变量占用内存做出明显改变。因此,这个标定并未重新运行。
确定共享变量的内存占用是很难的,因为其占用的内存依赖于配置。例如,带有缓冲区的网络发布共享变量会根据需要在程序中动态分配内存。配置一个共享变量使用实时FIFO也会增加内存使用,因为除了网络缓冲区外LabVIEW也为FIFO创建缓冲区。因此本文的标定测试只提供一个内存的基本测度。
图28给出了在LabVIEW部署了500和1000个指定类别的共享变量到SVE时它占用的内存。该图表明变量的类型并不显著影响部署的共享变量占用的内存。这里需要注意的是,这些变量都是非缓冲变量。
图28 具有不同数据类型的网络发布共享变量的内存使用
图29给出了内存占用相对于部署的共享变量数目的函数关系。这项测试只使用一种类型的变量,一个空的布尔数组。内存的占用随变量数目线性增长。
图29不同大小的共享变量的内存使用
T5的测试结果
8.2网络发布的共享变量和8.5变量-流比较
在LabVIEW 8.5中,我们重新实现了用于传输共享变量数据的网络协议底层,它能够提供更好的性能。
在这里我们在cRIO9012上托管一个双精度波形类型的单变量。我们生成所有数据,然后在一个循环中将数据传送到主机,主机尽快的从另一个波形共享变量节点将数据读取出来。
您可以从图30看到,在LabVIEW 8.5中获得了明显的性能改善,在这个例子中超过600%。
图30 LabVIEW的8.5和LabVIEW 8.20(或更早版本)的波形吞吐量比较
T6的测试结果
8.2网络发布的共享变量和8.5变量-高信道计数
在这项测试中,我们使用与T5相同的两个目标对象,但是与传送单变量不同,我们将数据类型设为双精度并使共享变量数目在1 -1000间变化,同时测量传送中的吞吐量。同样,所有的变量都托管于cRIO9012,在其上生成增长的数据并传送到主机等待读取。
图31再次显示出从LabVIEW 8.20至LabVIEW的8.5性能的显著提升。然而,许多小变量的情形与T5中单一大变量的情形相比,吞吐量显著减少。这是因为每一个变量都有与本身相关的固定空间开销。当使用许多变量时,这种开销会乘以变量数目,从而变得不能忽略。
图31 LabVIEW 8.5和LabVIEW 8.20(或更早版本)高通道计数吞吐量比较
方法和配置
本节给出了前面讲述的标定测试的详细信息。
T1方法及考虑因素
T1测试使用了一个简单的标定模板,通过大量的迭代后取简单平均的方法以确定读写速率。每次测试执行时共5.0亿迭代按分钟记录执行时间,分辨单位是毫秒。
T1 软/硬件配置
主机硬件
Dell Precision 450
Dual Intel Xeon2.4GHz奔腾级处理器
1 GB DRAM
主机软件
Windows XP SP2
LabVIEW 8.20
T2的方法及考虑因素
T2测试是通过确定不同优先级任务之间的最大可持续通信速率来确定吞吐量的。一个具有毫秒分辨率的定时循环用于数据产生。数据的消费者是一个自由运行、正常优先级的循环,它从实时FIFO或者单进程共享变量读取数据直到空为止。在没有错误的条件下重复这一过程至一定的时间。
当下列所有条件满足时,测试结果是有效的:
没有缓冲区溢出发生
数据完整性得以保持:没有数据损失的发生,且收到的数据和发送的数据次序一致
定时循环在指定的热身时间1秒后可以准确定时
单进程共享变量接收端循环执行简单的数据完整性检查,例如确保预期数量的数据点均收到,而且收到的信息模式并不缺乏中间值。
美国国家仪器对于所有试验的变量和涉及到的数据类型,均为实时FIFO和共享变量FIFO缓冲器配置缓冲区大小为100元素。
T2的软/硬件配置
PXI的硬件
NI PXI - 8196 RT系列控制器
2.0GHz奔腾级处理器
256MB DRAM
Broadcom 57xx ( 1 GB /秒内置式以太网适配器)
PXI的软件
LabVIEW的8.20实时模块
网络变量引擎1.2.0
变量客户端支持 1.2.0
Broadcom 57xx千兆以太网驱动程序2.1,配置为轮询模式
CompactRIO 硬件
NI cRIO 9012控制器
400MHz处理器
64 MB DRAM
CompactRIO 系统软件
LabVIEW的8.20实时模块
网络变量引擎1.2.0
变量客户端支持1.2.0
T3的方法及考虑因素
T3测试通过直接记录网络上的数据传输数量和整体测试时间获得测试吞吐量。一个具有毫秒分辨率的定时循环用于数据产生,它负责将一个特定的数据模式写入网络发布的共享变量或实时FIFO VI。
对于网络发布共享变量的情况,一个NPL运行于主机系统,并从一个自由运行的循环中读取数据。对于实时FIFO VI的测试情况,NPL运行于实时系统,按一定的速率检查FIFO的状态,读取所有的可读数据,并通过TCP发送至网络。标定结果表明,该轮流有效期可设定为1或10毫秒。
当下列所有条件满足时,测试结果是有效的:
不管在FIFO还是网络上,没有缓冲区溢出发生
数据完整性得以保持:没有数据损失的发生,且收到的数据和发送的数据次序一致
定时循环在指定的热身时间1秒后可以准确定时
读取完每个数据点以后,网络变量测试的NPL检查数据模式的正确性。对于实时FIFO测试中,TCL负责根据实时FIFO是否发生溢出进行数据验证。
为了避免数据丢失,美国国家仪器会将缓冲区大小配置为不小于NPL和TCL循环周期之比,对于实时FIFO另外具有100个元素的下边界。
T3的软/硬件配置
主机硬件
Intel Core2 Duo 1.8GHz
2 GB DRAM
英特尔pro/1000 ( 1 GB /秒以太网适配器)
主机软件
Windows Vista 64
LabVIEW 8
网络配置
1 GB/秒交换网
PXI硬件
NI PXI - 8196 RT控制器
2.0GHz奔腾级处理器
256 MB DRAM
Broadcom 57xx (1 GB /秒内置式以太网适配器)
PXI软件
LabVIEW 8.5实时模块
网络变量引擎1.2.0
变量客户端支持 1.2.0
Broadcom的57xx千兆以太网驱动 2.1
T4的方法及考虑因素
T4测试中,NI采用具有下列数据类型的非缓冲网络发布共享变量,包括:双精度,单精度,布尔型,双精度数据,单精度数组,布尔数组等。
T4软/硬件配置
PXI的硬件
NI PXI - 8196 RT控制器
2.0GHz奔腾级处理器
256 MB DRAM
Broadcom的57xx (1 GB /秒内置式以太网适配器)
PXI的软件
LabVIEW实时模块8.0
网络变量引擎1.0.0
变量客户端支持 1.0.0
Broadcom的57xx千兆以太网司机1.0.1.3.0
T5和T6方法及考虑因素
在T5和T6测试中 ,NI采用双精度波形类型的非缓冲网络发布共享变量。
T5和T6软/硬件配置
主机硬件
64位Intel Core 2 Duo 1.8GHz
2GB DRAM
千兆以太网
主机软件
Windows Vista 64
LabVIEW 8.20和LabVIEW 8.5
Compact RIO 硬件
cRIO 9012
64MB DRAM
Compact RIO 软件
LabVIEW RT 8.20和LabVIEW RT 8.5
网络变量引擎1.2 (LabVIEW 8.20 )和1.4 (LabVIEW 8.5 )
变量客户端支持1.0 (LabVIEW 8.20 )和1.4 (LabVIEW 8.5 )
一周热门 更多>