LabVIEW为创建分布式应用提供了多种多样的技术接口。LabVIEW 8中引入的共享变量为简化编程应用向前迈出了重大一步。本文将介绍共享变量,并讨论LabVIEW 8.20和LabVIEW 8.5中它的特征和性能。 创建共享变量使用共享变量,您可以在同一个程序框图的不同循环之间或者网络上的不同VI之间共享数据。与LabVIEW中其他现有的数据共享的方法如UDP/TCP, LabVIEW 队列, 及实时 FIFO不同,您通常在编辑时使用属性对话框来配置共享变量,而不需要在您的应用中包括配置代码。 图1单进程共享变量属性 数据类型您可以从大量的标准数据类型中为一个新的共享变量选择数据类型。除了这些标准数据类型外,您还可以从数据类型下拉列表中选择“来自自定义控件”来选择一个自定义控件作为自定义的数据类型。然而,当使用自定义数据类型时,LabVIEW不能够使用实时FIFO或者缩放(Scaling)。另外,如果您安装了LabVIEW的DSC 模块,则不良状况的提示会很有限。 图2项目中的共享变量 从共享变量所属的目标LabVIEW可以部署和托管该共享变量。想要了解更多有关部署和托管共享变量的内容,请参见部署和托管部分。 变量参考当您添加共享变量到一个LabVIEW项目后,您可以将其拖至VI的程序框图中来进行读或写操作,如图3所示。程序框图中读和写节点被称为共享变量节点。 图3运用共享变量节点来对共享变量进行读和写 您可以根据共享变量节点连接至变量的方式来指定一个节点是绝对或相对目标的。绝对共享变量节点连接到创建共享变量的目标上的共享变量。相对目标的共享变量节点连接到包含该节点的VI所运行的目标上的共享变量。 默认的共享变量节点都是绝对的。右键单击一个节点,并选择更改为相对目标或者更改为绝对,来改变共享变量节点连接到共享变量的方式。 单进程共享变量使用单进程变量在同一个VI中不能用连线传输的不同位置间传递数据,例如同一个VI的并行循环之间,或者同一应用实例中的两个不同VI之间。单进程共享变量的底层实现与LabVIEW中全局变量相似。单进程共享变量相对于传统的全局变量的主要优点是能够将一个单进程共享变量转换成一个网络发布的共享变量,这样网络上的任何节点都可以访问。
即使共享变量有多重写入或者读取的对象,LabVIEW为每个单一进程共享变量创建的实时FIFO是单一的。因此,为确保数据的完整性,多重写入操作会彼此阻塞,多重读取操作也同样。不过,读操作和写操作并不会彼此阻塞。美国国家仪器公司建议避免对时间严格循环中的单进程共享变量进行多重写入或读取操作。 图5多重写入或读取操作共享一个单一的FIFO 使能实时FIFO后,您可以选择两种稍有不同类型的FIFO功能变量:单元素和多元素缓冲。这两种类型缓冲区的一个重要区别是:单元素FIFO在溢出和下溢情况下不进行报警。第二个区别是对一个空的缓冲区进行多重读取时LabVIEW返回的值。多重读取单元素FIFO时将得到相同的值,直到下次写入者写入该变量。多重读取多元素FIFO时,每个读取者均得到它们最后一次从缓冲区中得到的值,如果它们以前并没有读过该变量,则会得到变量所属数据类型的默认值。如下所示。 图6多元素FIFO共享变量读取最后一次值的特性 如果要求每个读取者得到写入到多元素FIFO共享变量的每个数据点,请为每个读取者使用各自单独的共享变量。 网络发布的共享变量利用网络发布的共享变量,您可以在以太网上对共享变量进行读写操作。网络应用的处理完全由网络发布的变量完成。 部署和托管 图7 共享变量引擎和网络共享变量值的改变 网络发布变量和LabVIEW实时 您可以实现使能一个网络发布共享变量的实时FIFO,但FIFO使能的网络发布共享变量与实时FIFO使能的单进程共享变量相比有一个重要的行为差异。在单进程共享变量中,所有写入和读出操作共享一个单一的实时FIFO;但网络发布的共享变量并非如此。网络发布共享变量的每一个读出操作,在单元素和多元素情况下都有各自的实时FIFO,如下所示。 图8 实时FIFO使能的网络发布变量 网络缓冲区 图9 在网络发布的共享变量中使能缓冲区 通过缓冲区,您可以解决对于一个变量读/写速度的临时波动问题。读出操作偶尔比写入慢的情况可能会导致一些更新数据的丢失。如果应用可以容忍偶尔的数据丢失,则较慢的读取速率并不会影响应用,此时您就不需要使能缓冲区。但是,如果读取操作必须获得每个更新数据,您就需要使能缓冲区。您可以在共享变量属性对话框中的变量页设定缓冲区大小,这样您就可以确定在旧数据被覆盖之前,应用中可以保存多少更新数据。 当您在上述对话框中配置一个网络缓冲区后,您实际上是配置了两个不同缓冲区的大小。服务器端的缓冲区,如图10中标有共享变量引擎( SVE )的方框中的缓冲区所示,是自动创建的,并被配置为和客户端缓冲区同样大小。客户端的缓冲区即您在使能共享变量缓冲区时逻辑上认为的缓冲区。在客户端缓冲区 (如图10右边所示)是用于保持先前值队列的缓冲区。正是这种缓冲区避免了您的共享变量受到循环速度或网络流量波动的影响。 在LabVIEW 8.5中,网络缓冲区经历了一个改变。底层NI-PSP协议的重新设计使的数据传输变得大致无损。同样如图10所示,标记有共享变量引擎( SVE )的方框中的缓冲区是服务器端的缓冲区。这个缓冲区当且仅当底层协议需要流量控制时使用,即只发生在下述的两种情形中: 1.如果您将数据写入到一个或多个共享变量的速度比客户端可响应的速度快。 注意,以上两种情况都是网络层在共享变量通信栈下(并不受其控制)的限制。 与所有读写操作共享同一实时FIFO的FIFO使能单进程变量不同,网络发布的共享变量每一个读用户都有自己独立的缓冲区,所以读用户不受彼此影响。 图10 缓冲区 仅当读/写速率有短暂的波动时,缓冲区才发挥其作用。如果程序运行的时间不确定,而读取速率总是低于写入速率,则不管你指定多大的缓冲区最终都会出现数据丢失。由于缓冲技术为每一位用户都分配了一个缓冲区,因此,为避免不必要的内存使用,仅当需要时再使用缓冲区技术。 网络和实时缓冲 如果您同时采用网络缓冲和实时FIFO,则共享变量的执行中将同时包含一个网络缓冲区和一个实时FIFO。前面讲过,如果实时FIFO使能时,将为每一个读和写用户创建新的实时FIFO,从而多重写入和读出将不会彼此阻塞。 图11 网络缓冲和实时FIFO 虽然您可以独立设置这两缓冲区的大小,在大多数情况下,美国国家仪器公司建议您让它们保持同样大小。如果您使用实时FIFO,LabVIEW将为每一个读和写用户创建新的实时FIFO,从而多重写入和读出将不会彼此阻塞。 缓冲区有效期 LabVIEW在初始写或读操作时创建网络和实时FIFO缓冲区,具体由缓冲区的位置决定。服务器端的缓冲区在写入者初始写入一个共享变量时创建。客户端的缓冲区在一个用户初始读取一个共享变量时创建。如果对共享变量的写操作发生在用户的读操作之前,则该用户将不能得到这些初始数据。 图12缓冲区有效期 缓冲区溢出/下溢 停止托管该变量的VI或重启机器并不影响共享变量在网上的可用性。如果您需要删除网络上共享变量,您必须明确地在该项目浏览窗口中对该变量解除部署。您也可以选择工具»共享变量»变量管理器来对共享变量或整个变量项目库来解除部署。 图13 绑定一个前面板控件到一个共享变量 通过在属性对话框中的数据绑定页面来获取和改变任意输入和显示控件的绑定。当使用LabVIEW实时模块或LabVIEW的DSC模块时,您可以选择工具»共享变量»前面板批量绑定配置,来得到前面板批量绑定配置对话框,来创建一个绑定多个输入和显示控件到共享变量的用户界面。 编程访问
图14 用Datasocket 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 ?
表1 网络发布的共享变量兼容性概况 应用需要数据记录和监控功能吗?
计算设备有足够的处理器和内存资源吗? SVE是一项需要处理和内存资源的额外进程。为了在分布式系统中得到最佳的表现,请选择具有最大内存和最高处理能力的机器安装SVE。 哪个系统经常在线? 如果您的分布式应用中,一些系统可能定期离线,则请将SVE托管在一台一直在线的系统上。 图15列出了SVE的很多功能。除了管理网络发布的共享变量外,SVE还负责:
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数据项上,并对这些变量进行读和写操作。 图16 绑定OPC数据项 性能本节为使用共享变量创建高性能应用提供了一般准则。
图18给出了一个较好的应用框架。应用中采用一个单进程共享变量在高优先级循环和低优先级循环中传递数据,极大地减少了等待时间。低优先级回路记录数据,并通过网络发布共享变量为主机端的用户写入数据更新。 图18 在实时系统中有效使用网络发布变量 标定本节比较了共享变量和LabVIEW中其他数据共享方法的性能,如LabVIEW的全局变量,实时FIFO ,TCP / IP 。下表总结了以下各节讨论的测试。
表2 标定预览 以下章节描述了美国国家仪器公司为每一个标定创建的代码,并给出了实际的标定结果。方法和配置一节详细给出了每种标定选择的方法和每种标定运行的软硬件环境的配置细节。 单进程共享变量与LabVIEW全局变量 单进程共享变量类似LabVIEW的全局变量。事实上,单进程共享变量的实现是在LabVIEW全局变量上增加了时间标识功能。 为了比较单进程共享变量相对LabVIEW的全局变量的性能,美国国家仪器公司编写了标定VI来衡量VI每秒钟可以对一个LabVIEW全局变量或一个单进程共享变量进行读写的次数。图19给出了单进程共享变量的读取标定。单进程共享变量写入标定和LabVIEW的全局变量读/写标定遵循同一模式。
综合读/写测试中,还包括了验证每个写入点都在同一循环中没有数据损失的被读回的验证代码。 T1的测试结果 图20给出了T1的测试结果。研究结果表明,单进程共享变量的读性能低于LabVIEW全局变量。写性能,以及读/写性能来看,单进程共享变量略低于LabVIEW全局变量。单进程共享变量的性能会受到是否开启时间标识功能的影响,因此如果没有必要的话,推荐关掉时间标识功能。 方法和配置一节讲述了本测试具体的标定方法和配置的细节。 图20 单进程共享变量与全局变量的性能比较 单进程共享变量与实时FIFO 图21 简化的实时FIFO标定VI 另一个等效的测试中采用了单进程共享变量。图22给出了程序框图的简化描述。
T2的测试结果 图23和24给出了T2测试的结果,并比较了FIFO使能的单进程共享变量和实时FIFO VI函数的性能。结果表明,用单进程共享变量稍微慢于使用实时FIFO。 图23 单进程共享变量与实时FIFO VI的性能比较(PXI) 图24单进程共享变量与实时FIFO VI的性能比较( cRIO 9012 ) 网络发布的共享变量与实时FIFO+TCP / IP 对于预变量方式,标定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的测试结果 图27 网络发布的共享变量与实时FIFO和TCP VI性能比较( PXI) T3的结果表明,网络发布共享变量的吞吐量与TCP方法的接近,而且对两种方法来说,从小到大不同大小的负载吞吐量基本都是一致的。共享变量使您的编程工作更容易,但并不是没有代价的。但应该看到,如果仅使用简单的TCP方法,它的性能很容易不如共享变量,特别对于在8.5中新的NI-PSP实现而言。 T4的测试结果 注意:在LabVIEW 8.5中,没有对变量占用内存做出明显改变。因此,这个标定并未重新运行。 图28 具有不同数据类型的网络发布共享变量的内存使用 图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亿迭代按分钟记录执行时间,分辨单位是毫秒。 主机硬件
T2的方法及考虑因素 T2测试是通过确定不同优先级任务之间的最大可持续通信速率来确定吞吐量的。一个具有毫秒分辨率的定时循环用于数据产生。数据的消费者是一个自由运行、正常优先级的循环,它从实时FIFO或者单进程共享变量读取数据直到空为止。在没有错误的条件下重复这一过程至一定的时间。 当下列所有条件满足时,测试结果是有效的:
单进程共享变量接收端循环执行简单的数据完整性检查,例如确保预期数量的数据点均收到,而且收到的信息模式并不缺乏中间值。 T2的软/硬件配置 PXI的硬件
PXI的软件 |
|
来自: dingxinshe > 《待分类》