使用LabVIEW共享变量

概览


LabVIEW​为​创建​分布​式​应用​提供​了​多种​多样​的​技术​接口。​共享​变量​可以简化​此类​应用的编程。​本文​将​介绍​共享​变量,并讨论其​功能​和​性能。

 

借助​共享​变量,​您​可以​在​同​一个​程序​框​图​的​不同​循环​之间​或者网络上​的​不同VI之间​共享​数据。与LabVIEW中的许多​其他数据​共享​​方法(如UDP/TCP、LabVIEW队列及实​时FIFO)不同,共享​变量​通常​可在​编辑​时​使用​属性​对话​框​进行​配置​,而​无需在应用​中​添加​配置​代码。


您​可以​创建​两​种​类型​的​共享​变量:​单​进程共享变量和网络发布共享变量。​本文​将详细​讨论​​单​进程​共享变量和网络发布共享​变量。

内容

创建共享变量

创建​共享​变量,必须先打开​一个LabVIEW​项目​。​在项目浏览器窗口中,右键单击终端、项目库或项目库中的文件夹,从快捷菜单中选择新建(New) » 变量(Variable),打开共享变量属性(Shared Variable Properties)对话框。选择所需的​共享变量配置​选项,​然后单击​确定(OK)​按钮。

如果右键单击终端或不在项目库中的文件夹,并从快捷菜单中选择新建(New) » 变量(Variable)来创建共享变量,则LabVIEW会自动创建一个新项目库,并将共享变量置于该库中。如需​详细了解变量​和​库,​请​参见共享​变量​生命周期部分。

图1显示的是​一个​单​进程​共享​变量的共享​变量​属性(Shared Variable Properties)对话​框。LabVIEW Real-Time模块和LabVIEW数据​记录​和​监​控(DSC)模​块​为​共享​变量​提供​了​额外的​功能​和​可​配置​属性。​尽管​在​这个​例子中LabVIEW Real-Time模块和LabVIEW DSC模​块​都​已经​安装,​但您仍可以使用LabVIEW DSC模​块​​仅针对网络发布共享​变量而​增加​的功能。

图1.单进程共享变量属性

 

数据类型

您​可以​从​大量​的​标准​数据​类型​中​为​新建的​共享​变量​选择​数据​类型。​除了​这些​标准​数据​类型​外,​您​还​可以从数据​类型(Data Type)下​拉​列表​中​选择自定义(Custom),并​选择​​一个自​定义​控​件​作为​自​定义​​数据​类型。​然而,缩放和实时FIFO等部分功能将无法​与某些自​定义​数据​类型结合使用。 而且,如果​您​安装了LabVIEW DSC模块,那么在使用自​定义​数据​类型​时,​警报将仅限于不良状态通知。

在​配置​完​共享​变量​的​属性​并单击确定(OK)按钮​后,​共享​变量​将​显示​在项目​浏览​器窗口的​所​选​库​或终端下,​如图2所​示。

图2.项目​中的​共享​变量


共享​变量​所属​的​终端就是LabVIEW​部署​和​托管​该​共享​变量的终端。​如需详细了解如何部署​和​托管共享​变量,​请​参见​部署​和​托管​部分。

 

变量引用

在将​共享​变量​添加到​LabVIEW项目​后,​​可​将​其​拖至VI的​程序​框​图​中来​进行​读​或​写​操作,​如图3所​示。​程序​框​图​中​读​和​写​节点​​称为​共享​变量​节点。

图3.使用共享变量节点读取和写入共享变量

您​可以​根据​共享​变量​节点​连接​至​变量​的​方式​来​指定​节点​是​绝对节点​或终端​相对​节点。绝对共享变量节点与创建该变量的终端上的共享变量连接。终端相对共享变量节点与该节点所属VI所在的终端上的共享变量连接。

如果​将含有终端相对​共享​变量​节点的VI移动​到​新的终端,​则该共享变量也必须​移动​到​新终端。因此,如果需要将VI和变量移至其他终端,建议使用终端相对共享变量节点。

默认​的​共享​变量​节点​都是​绝对​的。​如需更改​共享​变量​节点​连接​到​共享​变量​的​方式,可右​键​单击​该节点,然后​选择引用模式(Reference Mode) » 终端相对(Target Relative)或者引用模式(Reference Mode) » ​绝对(Absolute)。 

​您随时可以通过在项目​浏览器​窗口中​右​键​单击​共享​变量来​编辑​共享​变量​的​属性。LabVIEW项目​会将​新的​设置自动传递​给​内存​中​引用​的​所有​共享​变量。​保存​变量​库后,​这些更改也将应用到存储在磁盘​上​的​变量​定义。

进程共享变量


单​进程​变量​用于传输同​一个VI中不同​位置间无法用连线​连接的​数据,​例如​同​一个VI的​并行​循环​,​或者​同一​应用​实例​中的​两​个​不同VI。​单​进程​共享​变量​的​底层​实现与LabVIEW中​全局​变量​相似。​单​进程​共享​变量​相​对于​传统​全局​变量​的​主要​优点​是​能够​将​​单​进程​共享​变量​转换​成​网络发布​共享​变量,​以便网络上​的​任何​节点​都可以​访问。

单​进程​共享​变量和LabVIEW Real-Time

为了​保证​确定​性,​实​时​应用​需要​使用​一种​无​阻塞、​确定​性的​机制​来​​将​数据​从​代码​的​​确定​性​部分​(如较​高​优先​级​定​时​循环​和实时优先级VI)​传输​到​非​确定​性​部分。​安装LabVIEW Real-Time模块后,​您​可以通过​配置​共享变量来​使用​实时FIFO,​只需从共享​变量​​属性(Shared Variable Properties)对话​框​中选择​启用​实时FIFO功能即可。NI建议​采用​实时FIFO在实时​和​较低​优先​级​的​循环​之间传输​数据。​在​单​进程​共享​变量中,可通过启用​实时FIFO来​尽量​避免​使用​底层​实时FIFO VI。

当VI保留为执行时,LabVIEW会创建​一个​实时FIFO(这时大部分情况下应用程序的顶层VI开始运行),​因此首次执行共享变量节点时,无需任何特别的考虑。 

注意: 在旧版本的LabVIEW(8.6之前的版本)中,LabVIEW会在​共享​变量​节点​首次尝试​写​入​或​读取​共享​变量​时​创建​一个​实时FIFO。​这一行为​使得​首次​使用​共享​变量​的​执行​时间会比​随后​使用​时​稍​长。​如果​应用​中​要求​极其​精确​的​定​时,​可以​在​实时优先级循环​内部​放置​初始“热身”迭代​来​解决​接​入​时间​波动的问题,​或者​​在​实时优先级循环​外部​至少​对​该​变量​进行​一次​读​取操作。

图4.已启用​实时FIFO的共享变量


即使​共享​变量​有​多个​写​入线程或​读​取​线程,LabVIEW也是为​每​个​单进程​共享​变量​创建​单一的实时FIFO。为了保证数据的完整性,多个写入线程(读取线程)之间互斥。但读取线程和写入线程之间并不互斥。NI建议在实时优先级循环​中,单​进程​共享​变量应避免使用多个写入线程或读取线程。

图5.多个写入和​读​取线程​共享​一个​FIFO


启用实时FIFO后,启用FIFO的变量就有两种类型可供选择:即单元素和多元素缓冲区。这两类缓冲区之间的一个区别是:​单​元素FIFO不会对​溢出或​下​溢​情况​进行​​报警。第二个区别是,多个读取线程读取空缓冲区时,LabVIEW返回的值不同。单元素FIFO的多个读取线程接收相同值,且单元素FIFO返回相同值直至写入线程再次写入该变量。空的多​元素FIFO的多个读取线程​将各自获得它们​最后​一次​从​缓冲​区​读取​的​值;​如果​之前​没有​读取​过​该​变量,​则会​得到​变量​所属​数据​类型​的​默认​值。该行为如下图所示。

图6.最后一次读取行为以及多​元素实时FIFO共享​变量​


如果应用要求每个读取线程获取写入多元素FIFO共享变量的每个数据点,则每个读取线程应使用独立的共享变量。

网络发布共享变量


利用网络发布​共享​变量,​您​可以​在​以太​网网络上读写​共享​变量​。​网络应用的处理​完全​通过网络发布​变量​完成。

除了​使​数据可在网络外使用,网络发布共享​变量​中​还​增加​了​许多​单​进程​共享​变量​所不具备的​功能。​由于这些增加的​功能,网络发布​共享​变量​的​内部​实现​要​比​单​进程​共享​变量​要复杂​得​多。​后面几节​将​讨论​这方面的内容,并​给​出​利用网络发布​共享​变量​来​获得​卓越性能​的​一些​建议。

NI-PSP

NI发布-订阅​协议(NI-​PSP)​是​专为传输网络共享​变量​而​优​化的网络协议。 NI-PSP的最底层协议是TCP/IP,已重点针对桌面系统和NI RT终端的性能进行了全面的调整(参见以下基准测试性能比较)。  

LogosXT的工作原理

图7显示的是网络共享变量的软件栈。 由于此处所述的工作原理专门针对LogosXT堆栈级别,因此理解这一点很重要。 LogosXT是软件栈中负责优化共享变量吞吐量的层。

图7.共享变量网络堆栈

图8显示的是LogosXT传输算法的主要组成部分。 本质上,它非常简单。 其中两个最重要的组成部分是:

    1. 8 KB传输缓冲区
    2. 10 ms定时器线程

图8.LogosXT的主要组成部分。 当缓冲区满了或者10 ms过去之后,缓冲区的数据将传输出去

这些数字是在经过彻底分析各种数据包大小和时间后得出的,旨在优化数据吞吐量。 算法如下:

    • 如果在10 ms定时器触发之前传输缓冲区容量已满(8 KB),则缓冲区中的数据会立即通过与启动写入操作相同的线程发送到TCP。 对于共享变量,该线程将是共享变量引擎线程。
    • 如果10 ms过去了,缓冲区还没有填满,那么数据将通过定时器的线程发送出去。

重要说明:两个不同端点之间的所有连接共有一个传输缓冲区。 也就是说,代表两台不同机器之间的连接的所有变量将共享一个缓冲区。 但不要将此传输缓冲区与共享变量的缓冲属性混淆。 这个传输缓冲区是一个非常底层的缓冲区,它将变量多路复用到一个TCP连接中,从而优化了网络吞吐量。

由于网络堆栈这一层的功能会对LabVIEW程序框图上的代码产生负面作用,因此理解该功能很重要。 从吞吐量的角度来看,在单个发送操作中发送尽可能多的数据显然效率更高,因而该算法会等待10 ms。 从时间和数据包大小的角度来看,每个网络操作都有固定的开销。 如果我们发送许多小数据包(N个数据包),这些数据包总共包含B字节,那么我们需要支付N次网络开销。 然而,如果我们发送一个包含B字节的大数据包,那么我们只需支付一次固定开销,这样整体吞吐量要高得多。

如果需要以尽可能高的吞吐量与终端流式传输数据,则此算法非常适用。 另一个方面,如果不需要经常发送小数据包,例如向终端发送命令以执行某些操作(如断开继电器[1个字节的布尔数据]),但希望命令能尽快到达终端,则需要优化延迟。 

如果对于应用来说,优化延迟更为重要,则需要使用“刷新共享变量数据”函数。  该VI将强制LogosXT中的传输缓冲区通过共享变量引擎和网络进行刷新。 这将极大降低延迟。 

注意: 在LabVIEW 8.5中,不存在强制LogosXT刷新其缓冲区的情况,也不存在“刷新共享变量数据”函数。 由于程序会先等待传输缓冲区被填满,然后再按10 ms的定时频率将缓冲区接收到的数据发送出去,因此系统基本上至少会有10 ms的延迟。 

但如上所述,将一台机器连接到另一台机器的所有共享变量均共享同一个传输缓冲区,因此如果调用“刷新共享变量数据”,将会影响系统上的许多其他共享变量。 而如果有其他依赖于高吞吐量的变量,调用“刷新共享变量数据”则会对其产生不利影响(图9)。

 

图9.刷新共享变量数据

 

部署与托管

网络发布共享​变量必须​部署​到​​网络上​托管​该​变量值​的​共享​变量​引擎(SVE)中。​当​写​入​一个​共享​变量节点时,LabVIEW会将​这个​新​值​发送​给​部署​和​托管该​变量的SVE。SVE处理​循环将发布该​值,​使得订阅者​可以​得到​更新值。图10显示的就是这一过程。从​客户端/服务​器​的角度来看,SVE是​共享​变量的服务器,​所有​对​其​的​引用​(不论是​对变量进行写入还是读取​操作)​都是客户端。SVE客户​端​是每个​共享​变量​节点​实现​中的​一部分,​在​本文​中,客户端订阅者这两个术语是​可​互换​的。

图10.共享​变量​引擎​以及网络共享​变量​值​的变化



网络发布变量和LabVIEW Real-Time

实时FIFO可以​通过网络发布共享​变量来启用​,但​与​启用实时FIFO​的单​进程​共享​变量​相比​,启用FIFO的网络发布共享​变量有​一个​重要​的​行为​差异。​上面说过,在​单​进程​共享​变量​中,​所有​写​入​和​读​出​操作​共享​一个​单一​的​实时FIFO;​但网络发布​共享​变量​并非​如此。无论是​单​元素​和​多​元素​情况​下​,网络发布共享​变量​的​每​一个​读取线程都有​各自​的​实时FIFO,​如下所示。

图11.已启用实时FIFO的网络发布变量



网络缓冲

对于网络发布​共享​变量,​您​可以​使用​缓冲​功能。在共享变量属性(Shared Variable Properties)对话框中,可以配置缓冲,如图12所示。

图12.在网络发布​​共享​变量​中​启用​缓冲功能


启用缓冲功能后,您能以数据类型的单位指定缓冲区的大小,在本例中,该数据类型为双精度。

​缓冲​功能​可以​解决​对于​​变量读取/写入速度​的​临时​波动​问题。​读​取线程​偶尔​比​写​入​线程慢​的​情况​可能​会​导致​一些​更新​数据​的​丢失。​如果​应用​可以​容忍​偶尔​的​数据​丢失,​则​较​慢​的​读​取​速率​并不​会​影响​应用,​此时​就​不需要​启用​缓冲​功能。​但是,​如果​读​取线程​必须​获得​每​个​更新​数据,请启用​缓冲​功能。​您​可以在共享​变量​属性(Shared Variable Properties)对话​框​中的变量(Variable)页面​设定​缓冲​区​大小,​这样就​可以​确定​在​旧​数据​被​覆盖​之前,​应用​​可以​保存​多少​更新​数据。

在​上述​对话​框​中​配置网络缓冲​区时,​您实际​上​是​配置​了​两​个​不同​缓冲​区​的​大小。  服务​器​端缓冲区,即图13中标​有​共享​变量​引擎(SVE)​的​方框​中的​缓冲​区​,这​是​自动​创建​的,​并​被​配置​为​与客户​端​缓冲​区​同样​的大小,稍后再详细介绍该缓冲区。  客户​端缓冲区就是在启用​共享​变量​缓冲​区​时​逻辑​上​认为​的​缓冲​区。  客户​端​缓冲区(如图13右边​所​示)​是​负责维持​先前​值​队列​的​缓冲​区。​  正是​这一缓冲​区​避免​了​​共享​变量​受到​循环​速度​或网络流量​波动​的​影响。

与启用实时FIFO的单进程变量(所有写入线程和读取线程共享相同的实时FIFO)不同,网络发布共享变量的每个读取线程都有自己的缓冲区,因此读取线程不会相互影响。

图13.缓冲


​缓冲​功能只适用于​​变量读取/写入速度​存在​临时​波动​的情况。​如果​程序​运行​的​时间​不​确定,​而​读​取​线程速率​总是​低于​写​入​线程速率,​则​不管​将​缓冲​区设置为多大,​最终​都会​出现​数据​丢失的情况。由于缓冲功能会为每个订阅者分配一个缓冲区,为避免不必要的内存占用,请仅在必要时使用缓冲功能。

网络和​实​时​缓冲

如果​同时启用网络缓冲​和​实时FIFO,​则​共享​变量​的​执行​中将​同时​包含​一个网络缓冲​区​和​一个​实时FIFO。​前面​讲​过,​启用实时FIFO​后,​将​为​每​个​读​取​线程和​写入​线程​创建​新的​实时FIFO,使得多个​写​入​​线程和​读​出​线程之间不会​彼此​阻塞。

图14.网络缓冲​和​实时FIFO



虽然这​两个​缓冲​区​的​大小​可以​独立​设置​,但​在​大​多数​情况​下,NI​建议​将其设为​同样的​大小。​如果​启用​实时FIFO,LabVIEW将​为​每​个​读​取线程和​写​入线程​创建​新的​实时FIFO。因此,多个​写​入线程​和​读​出​线程之间不会​彼此​阻塞。

缓冲​区​生命周期

LabVIEW在​初始​写入或读取操作​时​创建网络和​实时FIFO缓冲​区,​具体​取决于缓冲​区​的​位置。

  • ​服务​器​端​缓冲​区​在​写​入​线程初始​写​入​​共享​变量​时​创建。
  • ​客户​端​缓冲​区​在建立订阅​时​创建。 

当包含共享变量节点的VI开始执行时,即会触发这些行为。 ​如果写入线程在特定读取线程订阅共享变量之前将数据写入共享变量,​则​该​订阅者​将​无法得到​这些​初始​数据值。

注意: 在LabVIEW 8.6之前,首次执行共享变量读取或写入节点时会创建缓冲区。  

图15.缓冲​区​生命周期



缓冲区溢出/下溢

网络发布​共享​变量​会​报告网络缓冲​区​的​溢出和​下​溢​情况。​不管是哪个​版本​,​实时FIFO都会​通过返回​错误​来​指示​溢出/下​溢​情况。

注意: 旧版LabVIEW不会报告网络缓冲区的溢出/下溢情况。 在LabVIEW 8.0或8.0.1,​可以​用​下列两​种​方式​检查网络缓冲​下​溢。​由于​共享​变量​时间​标识的​分辨​率为1 ms,​当​以​低于1 kHz的​速率​更新​共享​变量​时,​可以​将​变量​的​时间​标识​与后续读取操作​的​时间​标识​进行​比较​来​检测​缓冲​区​下​溢。​或者​读​取​线程可以使用与数据绑定的​序列​号​来​报告​缓冲​区​溢出/下​溢。但如果数据类型是数组,则在实时优先级循环内不能对共享变量使用第二种方法,因为如果簇中的某个元素是数组,则启用实时FIFO的共享变量不支持自定义控件(簇)数据类型。

共享​变量​生命周期

如​前​所述,​所有​共享​变量​都是​项目​库​的​一部分。SVE将会​注册​项目​库​和​库​中​包含​的​共享​变量(当LabVIEW需要​调​用其中某个变量​时)​。​默认​情况​下,​只要​运行​引用​任意​所包含共享​变量的VI时,SVE即​会​部署​并​发布​共享​变量​库。​由于SVE将​部署​包含​该​共享​变量​的​整个​库,​因此​无论​所​运行的VI是否​引用​库​中的​全部​共享​变量,SVE都​将​发布​库​中​所有​的​共享​变量。​您随时可以手​动​​部署​任意​​项目​库,​只需要​右​键单击项目​浏览器​窗口的​库​即可。

停止VI或​重​启​托管​该​变量的​机器​并不​影响​共享​变量​在​网络上​的​可用性。​如果​​需要​删除网络上​的共享​变量,​则​必须​明确​地​在项目​浏览器​窗口中解除​该​变量​所属库的部署。​​也可选择工具(Tools) » 分布式系统管理器(Distributed System Manager)来解除共享​变量​或​整个​变量​项目​库​的​部署。

注意: 旧版LabVIEW使用变量管理器(工具[Tools] » 共享​变量[Shared Variable] » 变量​管理器[Variable Manager])而不是分布式系统管理器来管理共享变量的部署。 

前面板数据绑定

另一个​仅​适用​于网络发布共享​变量​的功能是​前​面板​数据​绑​定。在项目​浏览器窗口中,​将共享​变量拖​拽到VI前面板,即可​创建​​共享​变量​的​绑​定​控​件。​当控件启用数据绑定时,​改变​控​件​的​值​将改变​​与其​绑​定​的​共享​变量​的​值。在VI运行​时,​如果​成功​连接到SVE,​则在VI的​前​面板​对象​旁边​会​出现​一个​绿色​标记,​如图16所​示。

图16.将​前​面板​控​件绑定​到​​共享​变量


通过​属性(Properties)​对话​框​中的数据​绑定(Data Binding)页​面​,可实现​和​改变​任意​输入​控​件​和​显示​控​件​的​绑​定。​当​使用LabVIEW Real-Time模块或LabVIEW DSC模​块​时,​​选择工具(Tools) » 共享​变量(Shared Variable) » 前​面板​批量​绑​定​配置(Front Panel Binding Mass Configuration),​即可显示前​面板​批量​绑​定​配置(Front Panel Binding Mass Configuration)对话​框,​然后​创建​一个将​多个​输入​​控​件和显示​控​件​​绑​定到​共享​变量​的操作​界面。

针对在LabVIEW Real-Time系统上运行的应用程序,NI​不​建议​使用​前​面板​​数据​绑​定功能,​因为​前​面板​可能​不存在​。

编程访问

如上所述,​您​可以​使用LabVIEW项目来​交互​式​地创建、​配置​和​部署​共享​变量,​​还​可以​使用​程序​框​图​上​的​共享​变量​节点​或​前​面板​的​数据​绑​定​来​读​写​​共享​变量。LabVIEW 2009及之后版本​还​提供​​对于​以上​功能的​编​程​访问​。

在​需要​创建​大量​共享​变量​的​应用​中,​可使用VI服务​器​,通过编程方式​来建立​项目​库​和​共享​变量。​此外,LabVIEW DSC模​块​提供​了​一套​全面的VI,让您能够通过​编​程方式来​创建​和​编辑​共享​变量​和​项目​库​以及​管理SVE。​以​编​程方式​创建​共享​变量​库只能在Windows系统​上实现,但通过编程来​部署​这些​新库可在Windows或LabVIEW Real-Time​系统​上完成。

在需要动态更改VI读写的共享变量或需要读写大量变量的应用程序中,可使用编程共享变量API。您可以通过编程方式创建URL,然后动态更改共享变量。 

图17.使用编程共享变量API来读写​共享​变量



此外,​由于NI LabWindows/​CVI 8.1和NI Measurement Studio 8.1引入​了网络变量​库,​您​可以在ANSI C、Visual Basic .NET或者Visual C#环境​下​读写​共享​变量。

共享变量引擎


SVE是​一个软件​框架,​使网络发布​​共享​变量​可​通过网络将值传送出去​​。在Windows系统中,LabVIEW将SVE配置为​一个​服务,​并​在​系统​启动​时​启动SVE。​在​实​时终端上,SVE是​一个在系统​开机时​加​载的​​可​安装​启动​组​件​。

要使用网络发布​共享​变量,SVE必须至少​在​分布式​系统的​一个​节点​上​运行。网络上​的​任何​节点​都可以​读写SVE发布​的​共享​变量。​如表1所​示,​节点可以引用变量,无需安装SVE。​如果​需要​根据​应用​需求在​不同​的位置​部署​共享​变量,​则可以​在​多个​系统​中​同时​安装​多个SVE。

共享​变量​托管​位置​推荐

在​​分布​式​系统​中,​需要​考虑​一系列​因素​来​决定​由​哪​个计算​设备​部署​和​托管网络发布共享​变量。

计算​设备​是否​兼容SVE?

下表​汇​总了SVE适用​的​平台,​并​给​出了​可​通过​参考​节点或DataSocket API使用网络发布共享​变量​的​平台。NI​要求所有适用平台​至少​能​提供32 MB内存,但针对SVE建议采用64 MB内存。

注意,Linux或Macintosh系统尚不支持共享变量的托管。

Windows PC
Mac OS
Linux
PXI
Real-Time
Compact FieldPoint
CompactRIO
Compact视觉系统
商用PC
(LabVIEW Real-Time ETS)
SVE
X
X
引用节点
X
X
DataSocket API(启用PSP)
表1.网络发布共享变量兼容性概述

应用​需要​数据​记录​和​监​控​功能​吗?

如果​您​想​使用LabVIEW DSC模​块​的​功能,​则​必须在Windows上​托管​共享​变量。LabVIEW DSC模​块​对网络发布​共享​变量​新增​如下​功能:
·NI总​数据​库​的​历史​记录。
·联​网警​报​和​警​报​记录。
·缩​放。
·基于​用户​的​安全。
·初始值。
·创建​自​定义I/O服务​器。
·将共享变量集成到LabVIEW事件结构中。
·以编​程方式​控制​共享​变量​各个​方面​和​共享​变量​引擎的LabVIEW VI。此类VI对于​管理​大量​共享​变量特别有帮助。

计算​设备是否​有​足够​的​处理​器​和​内存​资源​?

SVE是​一项​需要​处理​和​内存​资源​的​额外​进程。​为了​在​分布​式​系统​中​获得优异性能,​请​选择​具有​最大​内存​和​最高​处理​能力​的​机器​安装SVE。

 

哪个​系统​始终在​线?

如果​在​分布​式​应用​中,​某些​系统​可能​定期​离线,​则​需将SVE托管​在​始终在​线​的​系统​上。

共享​变量​引擎​的​其他​功能

图18列出了SVE的​许多​功能。​除了​管理网络发布​​共享​变量​外,SVE还​负责:
·采集来自I/O服务​器​的​数据。
·通过OPC和PSP的服务​器​为​订阅者​提供​数据。
·为​任何​配置​了​缩​放、警报和​记录​服务​的​共享​变量​提供​这些​服务。这些​服务​仅在使用LabVIEW DSC模​块时可用。
·监测警​报​​条件​并​进行​相应​响应。​

I/O服务器

I/O服务​器是SVE的​插​件,​借助这些插件,程序​​可以使用SVE来​发布​数据。NI FieldPoint包含了​一个I/O服务​器,​该​服务​器​可直接将FieldPoint存储库的数据​发布​到SVE。​由于SVE是OPC服务​器,​因此SVE和FieldPoint I/O服务​器​的结合​构成了FP OPC服务​器。​注意FieldPoint安装程序​中​不​包括SVE,您需要通过其他​软件​组​件(如LabVIEW)​安装SVE。

NI-DAQmx中也​有一个I/O服务​器,​它​可以​自动将NI-​DAQmx全局​虚拟​通道​发布到SVE。​这个I/O服务​器​取代​了​传统​的DAQ OPC服务​器和RDA。NI-​DAQmx​包含SVE并且​可以在未安装LabVIEW的情况下进行​安装。

使用LabVIEW DSC模​块,​用户​可以新​建I/O服务​器。

图18.共享变量引擎(SVE)



OPC

SVE是3.0兼容​的,​并​可用作Windows机器​上的OPC服务​器。​任何OPC客户​端​可​对​托管于Windows机器​上​的​共享​变量​进行​读写​操作。​在Windows机器​上​安装LabVIEW DSC模​块​后,SVE也可以​用作OPC客户​端。​Windows托管​的​共享​变量可以​绑​定到DSC的OPC数据​项​上,​并​对​这些​变量​进行​读​写​操作。

因为OPC是​基于COM(一个Windows API)​的​技术,​实时终端并不与OPC直接​通信。​如图19所​示,​​您​仍可以​通过​将​共享​变量托管到Windows来访问​实​时终端的OPC数据​项。

图19.绑定至OPC数据项

性能


本​节​为​使用​共享​变量​创建​高性能​应用​提供​了​一般​准则。

由于​单​进程​共享​变量​的​实现​类似LabVIEW全局​变量​和​实时FIFO,因此NI对于​单​进程​共享​变量​如何获得卓越性能​并没有给​出​特别的​建议。​以下​各节​均​侧重于网络发布​共享​变量。

共享​处理器

网络发布​共享​变量​通过​隐藏网络编​程​的​许多实现细节,​简化了LabVIEW的​程序​框​图。​一般​来讲,​应用程序​中​会​包括LabVIEW VI、SVE以及SVE客户​端​代码。​为了​获得​共享​变量​的​卓越性能,​开发​应用​时​需要​注意​​定期​释放​处理​器​以让SVE线​程​运行。为了实现这一点,一种方法​是在​处理​循环​中​添加​等待,​并​确保​应用​中​不​使用未定时循环。​实际​需要​等待​的​精确​时间​取决于​具体​应用、处理​器​和网络;​每​个​应用​都​需要根据经验进行​一定​程度​的​微调​来​达到​优异性能。

SVE位置​的​考虑

共享​变量​托管​位置​推荐部分讨论​了​在​选择​安装SVE的​位置​时​需要​考虑​的​一系列​因素。图20显示了​另​一个​会明显影响​共享​变量​性能​的​因素。​本例​包含​了​实​时​终端,​但​它的​基本​原则​也​适用​于​非​实​时​系统。图20所示的是​一个​低​效​运用网络发布共享​变量​的​例子:在​实​时​终端上生成​数据,​然后​需要​将​处理​完​的​数据​记录​到​本地,​并​通过​远程​机器​进行​监​控。​由于变量​的​订阅者​必须从SVE接收​数据,因此​在​高​优先​级​循环​中的​写入操作​和标准优先​级​循环​中的​读取​操作​之间​将​存在​很大​的​延​时,​而且​这​一​操作涉及​整个网络中的​两​个​来回。

图20.实​时​系统​中​低​效​使用网络发布变量


图21给​出了​一个​较好​的​应用​程序框架。该​应用​程序​采用​​单​进程​共享​变量​在​高​优先​级​循环​和​低​优先​级​循环​之间传输数据,​极大​地​减少​了​等待​时间。​低​优先​级​循环负责​记录​数据,​并​通过网络发布共享​变量​为​主机端的订阅者​写​入​数据​更新。

图21.实​时​系统​中​高​效​使用网络发布变量

基准测试

本​部分比较​了​共享​变量和LabVIEW中​其他​数据​共享​方法​的​性能,如LabVIEW的​全局​变量、实时FIFO、TCP/IP。​下表​总结​了​以下​各节讨论​的​测试。

测试

描述

SVE位置

说明

T1

单​进程​共享​变量与全局​变量

N/A

确定​最大读取/写入速率

T2

启用实时FIFO的单​进程​共享​变量与实时FIFO VI

N/A

采用​实时FIFO时,​确定最大读取/写入速率。

确定​在​定​时​循环中​写​入​到共享变量或实时FIFO并​同时​从​标准​优先​级循环​读​回数据​的​最高​可​持续​速率。

T3

启用实时FIFO的网络发布共享​变量与启用TCP的双循环​实时FIFO

运行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.基准测试概述


以下​章节​描述​了​NI​为​每​个​基准测试创建​的​代码,​并​给​出了​实际​的基准测试结果。方法​和​配置部分详细讨论了​每​种​基准测试​选择​的​方法​以及​运行​​每个基准测试的​软​硬件​环境​的​配置​细节。

单进程共享变量与LabVIEW全局变量

单​进程​共享​变量​与LabVIEW​全局​变量​相似。事实​上,​单​进程​共享​变量​的​实现​是在LabVIEW全局​变量​的基础上增加​了​时间标识​功能。

为了​比较​单​进程​共享​变量与LabVIEW​全局​变量​的​性能,​NI​编写​了多个基准测试VI,以测量VI每秒​钟​​对​LabVIEW全局​变量​或​单​进程​共享​变量​进行​读写​的​次数。图22显示的是​单​进程​共享​变量​读​取​基准测试的程序框图。​单​进程​共享​变量​写​入​基准测试和LabVIEW​全局​变量读取/写入基准测试遵循​同一​模式。

图22.单进程共享变量读取基准测试VI


综合读取/写入测试​还​包括​了​验证​每​个​写​入​点​都在​同一​循环​中​被无损读​回​的​验证​代码。

T1测试结果

图23给​出了T1的​测试​结果。​结果​表明,​单​进程​共享​变量​的​读取​性能​低于LabVIEW全局​变量。而从​写入​性能以及读取/写入性能​来看,​单​进程​共享​变量​略低于LabVIEW全局​变量。​单​进程​共享​变量​的​性能​会​受到​是否启用​时间标识功能​的​影响,​因此​如果​没有​必要​,​建议关闭时间标识功能。


方法​和​配置部分讲述​了基准测试的具体​方法​和测试​配置​的​细节。

 


图23.单​进程​共享​变量​与​全局​变量​的​性能​比较



单进程共享变量与实时FIFO

NI通过可​持续​​吞吐量的基准测试​来​比较启用了FIFO​的​单​进程​共享​变量​和​传统​​实时FIFO VI的性能。此基准测试中​还​测试​了​传送​数据​的​大小​或​负载​对​以上​两​种​实时FIFO实现​的​影响。

​测试​包括​一个​用于​生成​数据的实时优先级​循环(TCL)​,以及​一个用于​消耗数据的​标准优先级​循环(NPL)​。 NI​通过​对​一系列​双​精度​标量​和​数​组​数据​类型​进行​测试​来​确定​负载​大小​的​影响。​标量​类型​决定​了​负载为​双​精度​数值​时​的​吞吐量,数​组​类型​决定​了​其余​负载​类型​的​吞吐量。​​在无数据丢失的情况下执行​上述​两​个循环​时​的​最大​可​持续​速度​就是​该​测试​记录​的​最大​可​持续​吞吐量。

图24给​出了​实时FIFO基准测试​的​简化​程序​框​图,​其中​略​去了​许多​用于​创建​和​注销FIFO的​必要​代码。​需要​注意​的是从LabVIEW 8.20开始,​引入​了​一个​可以​替代此处所示FIFO子VI的​新FIFO函数。​本文​中的​数据​图表​即​通过该FIFO函数​得到,​它比​之前8.0.x中FIFO子VI​的​性能更好。

图24.简化​的​实时FIFO基准测试VI


另​一个​等效​的​测试​中​采用​了​单​进程​共享​变量。图25​显示的是该程序​框​图​的​简单描述。

图25.启用FIFO的单​进程​共享​变量​基准测试的简化VI



T2测试结果

图26和27给​出了T2测试​的​结果,​并​比较了启用FIFO​的​单​进程​共享​变量​和​实时FIFO函数​的​性能。​结果​表明,​​使用单​进程​共享​变量的吞吐量略​低​于​使用​实时FIFO的吞吐量。

图26.单​进程​共享​变量与​实时FIFO VI的​性能​比较(PXI)

图27.单​进程​共享​变量与​与​实时FIFO VI的​性能​比较​(cRIO 9012)



网络发布共享变量与实时FIFO和TCP/IP

由于​共享​变量​的​灵活​性,​只需更改​几个​配置​,​​就​可以​在网络中​快速​发布​单​进程​共享​变量。​特别是​对于​实​时​应用,​要在早期​版本的LabVIEW中​完成​同样​的传输​,则需要​引入​​大量​的​代码​来​读取RT系列​控制器​上​的​实时FIFO,​然后​从众多可用的网络协议​中选择一个来实现​数据的网络传输。​为了​比较​二者​性能​的​不同,​NI​同样​创建​了​基准测试VI来​测量​在​一系列​负载​条件下​无​数据​丢失​时​的​可​持续​吞吐量。

对于​预​变量​方式,​基准测试VI采用​了​实时FIFO和TCP/IP。​TCL负责生成数据​并​将​其​放置​在​实时FIFO中;​NPL负责从FIFO中​读​出​数据​并​通过TCP/​IP发送​至​整个网络。PC主机接收数据​并​验证​没有丢失任何​数据​。

图28给​出​了实时FIFO和TCP/IP基准测试的​简化​程序​框​图。​与​上面​相同,此程序​框​图​对实际​基准测试VI做了​大幅​简化。

图28.简化​的​实时FIFO和TCP/IP基准测试VI


NI给​出了​一个​使用网络发布共享​变量​的​等效​测试​版本。图29显示的是​简化​的​程序​框​图。

图29.启用了实时FIFO的网络发布共享​变量​基准测试的简化VI



T3测试结果

本​部分给​出了T3测试的​结果,​比较​了启用​实时FIFO​的网络发布共享​变量​和​基于​实时FIFO VI和LabVIEW TCP/​IP的​等效​代码​的​性能。图30显示的是当LabVIEW Real-Time​终端采用​嵌入式RT系列PXI控制器​时​的​结果。

图30.网络发布共享变量与​实时FIFO和TCP VI的​性能​比较(PXI)


 T3的​结果​表明,网络发布共享​变量​的​吞吐量与TCP方法​的​接近,​而且在中高负载下,​​两​种​方法的​吞吐量​基本​保持一致​。  ​共享​变量​使​编​程​工作​更​容易,​但​并不​是​没有​代价​的。​  但​应注意,​如果​仅​使用​简单的TCP方法,​其性能​很可能不如​共享​变量,​特别​是对于在8.5中​新增加的NI-​PSP而言。

 

T4测试结果

网络发布共享​变量​的内存占用

注意在​LabVIEW 8.5​中,​没有​对​变量​占用​内存​做出​明显​改变。​  因此,​这个​基准测试并​未​重新​运行。

确定​共享​变量​的​内存​占用并非易事,​因为​其​占用​的​内存​取决于配置。​例如,​带有​缓冲​区​的网络发布共享​变量​会​根据​需要​在​程序​中​动态​分配​内存。除了网络缓冲​区外,LabVIEW也会为FIFO创建​缓冲​区,​因此为​​共享​变量​启用实时FIFO也​会​增加​内存​使用​。综上所述,本文​的​基准测试​结果仅​提供​内存​的​基本​测量。

图31显示了在LabVIEW将500和1000个​指定​类别​的​共享​变量部署到SVE时​SVE占用​的​内存。​该​图​表明​变量​类型​并不​显著​影响所​部署​共享​变量使用​的​内存。​这里​需要​注意​的是,​这些​变量​都​是非​缓冲​变量。

图31.采用​不同​数据​类型的网络发布共享​变量​的​内存使用量

图32显示了​内存​使用​相​对于​所部署​​共享​变量​数​目的​函数​关系。​这项​测试​只​使用​一种​类型​的​变量,即​空​的​布​尔​数​组。​内存​使用量随​变量​数量的增加而​线性​增大。

图32.不同​大小​的​共享​变量​的​内存​使用量

 

T5测试结果

比较8.2网络发布​共享​变量与8.5变量 - 数据流

在LabVIEW 8.5中,​我们​已经实现​了​用于​传输​共享​变量​数据​的网络协议​底层。  它​能够​提供​更好​的​性能。

在​这里,​我们在cRIO 9012上​托管​一个双​精度​波形类型​的​​变量。​  我们​生成​所有​数据,​然后​在一个小循环​中将​数据​传送​到​主机,这时​主机将尽可能快地​​从​另​一个​波形​共享​变量​节点中读取​数据​。

​从图30可以看到,LabVIEW 8.5中的性能​获得​了​明显​改善,​在本例中提高​了600%以上。

 

图33.LabVIEW 8.5和LabVIEW 8.20(或​更​早​版本)​的​波形​吞吐量​比较

T6测试结果

比较8.2网络发布​共享​变量与8.5变量 - 数据流

在​这项​测试​中,​我们​使用与T5相同​的​两​个​终端,​但是​与​传送​单​变量​不同,​我们​将​数据​类型​设​为​双​精度​并​使​共享​变量​的数量在1 - 1000间​变化,​同时​不断测量​吞吐量。​  同样,​所有​的​变量​都​托管于cRIO 9012,​在​其​上​不断生成​数据​并​传送​到​主机​等待​读​取。

图34再次​显示​出从LabVIEW 8.20至LabVIEW 8.5性能有着​显著的​提升。  ​然而,多个​小​变量​与T5中单一​大​变量的​情形​相比,​吞吐量​显著​减少。  ​这​是​因为​每​一个​变量​都有​与​本身​相关​的​固定​空间​开销。​  当​使用​多个变量​时,​这种​开销​会​乘​以​变量​数目,​因而变得非常明显。

图34.LabVIEW 8.5和LabVIEW 8.20(或​更​早​版本)​的​高通道数​吞吐量​比较


方法​和​配置

本部分提供了上述所有​基准测试​的​详细​信息。

T1方法考虑因素

T1测试​使用​了​一个​简单​的​基准测试​模板,​通过​在大量迭代​后进行简单的求平均值来​确定​读写​速率。​每次​测试​执行​时共5.0亿次​迭代​按​分钟​记录​执行​时间,​分辨率单位​是​毫秒。

T1的软硬件​配置

主机硬件

  • Dell Precision 450
  • Intel Xeon 2.4 GHz奔腾​双核​处理​器
  • 1 GB DRAM

主机软件

  • Windows XP SP2
  • LabVIEW 8.20


T2方法考虑因素

T2测试​是​通过​确定​不同​优先​级​任务​之间​的​最大​可​持续​通信​速率​来​确定​吞吐量。​具有毫秒分辨率的​定​时​循环用于​生成数据。自由​运行​的​标准优先级​循环用于消耗​数据,​它​从​实时FIFO或者​单​进程​共享​变量​读​取​数据​直到​空​为止,​在​没有​出错​的​条件下​重复​这​一​过程,并持续​一定​的​时间。当满足​​下列​所有​条件​时,​测试​结果​是​有效​的:

  • 没有发生​缓冲​区​溢出​
  • 数据​完整性​得以​保持:​没有​丢失数据,​且​收到​的​数据​和​发送​的​数据​次序​一致
  • 定​时​循环​在​指定​的​热身​时间1秒​后​可以​准​确定​时

单​进程​共享​变量​接收​端​循环​执行​简单​的​数据​完整性​检查,​例如​确保​预期​数量​的​数据​点​均已​收到,​而且​收到​的​信息​模式​并不​缺乏​中间​值。

对于​所有​测试​变量​和​涉及​到​的​数据​类型,​NI​针对实时FIFO和​共享​变量FIFO缓冲​区将缓冲​区​大小配置为100个元素。
 

T2的软硬件​配置

PXI硬件

  • NI PXI-8196 RT系列控制器
  • 2.0 GHz奔腾处理器
  • 256 MB DRAM
  • Broadcom 57xx(1 Gb/s​内​置​式​以太​网​适​配​器)


PXI软件

  • LabVIEW 8.20 Real-Time模块
  • 网络变量引擎1.2.0
  • 变量​客户​端​支持1.2.0
  • Broadcom 57xx千​兆​以太​网​驱动​程序2.1,​配置​为​轮​询​模式

CompactRIO硬件

  • NI cRIO 9012控制器
  • 400 MHz处理器
  • 64 MB DRAM

CompactRIO软件

  • LabVIEW 8.20 Real-Time模块
  • 网络变量引擎1.2.0
  • 变量​客户​端​支持1.2.0  

 

T3方法考虑因素

T3测试​通过​直接​记录网络上​的​数据​传输​数量​和​整体​测试​时间​来测量​吞吐量。​具有​毫秒​分辨​率​的​定​时​循环​用于​生成数据,​它​负责​将​特定​的​数据​模式​写​入网络发布​共享​变量​或​实时FIFO VI。

对于网络发布共享​变量​,​NPL运行​于​主机​系统,​并从​一个​自由​运行​的​While循环的变量​中​读​取​数据。而​对于​实时FIFO VI的​测试​情况,NPL运行​于​实​时​系统,​按​一定​的​速率​检查FIFO的​状态,​读​取​所有​的​可读​数据,​并​通过TCP发送​至网络。​基准测试结果​表明,​该​轮询有效期​可​设定为1或10 ms。

当满足​​下列​所有​条件​时,​测试​结果​是​有效​的:

  • 不管​在FIFO还是网络上,​没有发生​缓冲​区​溢出​
  • 数据​完整性​得以​保持:​没有​丢失数据,​且​收到​的​数据​和​发送​的​数据​次序​一致
  • TCL VI中的定​时​循环​在​指定​的​热身​时间1秒​后​可以​准​确定​时


读​取​完​每​个​数据​点​以后,网络变量​测试的NPL会检查​数据​模式​的​正确​性。​对于​实时FIFO测试​,TCL负责​根据​实时FIFO是否​发生​溢出​进行​数据​验证。

为了​避免​数据​丢失,​NI会​将​缓冲​区​大小​配置​为​不小于NPL和TCL循环​周期​之​比,​对于​实时FIFO缓冲区则设置最小100个​元素​的​下​边界。


T3的软硬件​配置

主机硬件

  • Intel Core 2 Duo 1.8 GHz
  • 2 GB DRAM
  • Intel PRO/1000(1 Gb/s以太网适配器)


主机软件

  • Windows Vista 64 
  • LabVIEW 8


网络配置

  • 1Gb/s开关网络


PXI硬件

  • NI PXI-8196 RT控制器
  • 2.0 GHz奔腾处理器
  • 256 MB DRAM
  • Broadcom 57xx(1 Gb/s​内​置​式​以太​网​适​配​器)


PXI软件

  • LabVIEW 8.5 Real-Time模块
  • 网络变量引擎1.2.0
  • 变量​客户​端​支持1.2.0
  • Broadcom 57xx千​兆​以太​网​驱动程序2.1


T4方法考虑因素

在T4测试​中,NI采用​具有​下列​数据​类型​的​非​缓冲网络发布共享​变量:​双​精度、​单​精度、​布​尔​型、​双​精度​数据、​单​精度​数​组、布​尔​数​组​等。

T4的软硬件​配置


PXI硬件

  • NI PXI-8196 RT控制器
  • 2.0 GHz奔腾处理器
  • 256 MB DRAM
  • Broadcom 57xx(1 Gb/s​内​置​式​以太​网​适​配​器)


PXI软件

  • LabVIEW Real-Time模块8.0
  • 网络变量引擎1.0.0
  • 变量​客户​端​支持1.0.0
  • Broadcom 57xx千​兆​以太​网​驱动程序1.0.1.3.0

 

T5T6方法考虑因素

在T5和T6测试中,NI采用​双​精度​波形​类型​的​非​缓冲网络发布共享​变量。

T5和T6的软硬件​配置

主机硬件

  • 64位Intel Core 2 Duo 1.8 GHz
  • 2 GB RAM
  • 千兆以太网

主机软件

  • Windows Vista 64
  • LabVIEW 8.20和LabVIEW 8.5

CompactRIO硬件

  • cRIO 9012
  • 64 MB RAM

CompactRIO软件

  • 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)

Was this information helpful?

Yes

No