使用LabVIEW共享变量

您所在的位置:网站首页 labview如何获取文件权限 使用LabVIEW共享变量

使用LabVIEW共享变量

#使用LabVIEW共享变量| 来源: 网络整理| 查看: 265

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

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

NI-PSP

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

LogosXT的工作原理

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

图7.共享变量网络堆栈

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

8 KB传输缓冲区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#环境​下​读写​共享​变量。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3