当通过网络发布的共享变量pspdstpURL以编程方式共享数据时,在默认状态下,LabVIEW仅向所有数据读取方提供最新的数据值。当一个客户端向服务器写入数据的速度比另一个客户端读取数据的速度快时,新数据将在另一客户端读取数据之前覆盖较旧的未处理的数据。如果读取方在收到后续数据之前没有收到被覆盖的数据,就会发生数据丢失。服务器或客户端均可能发生未处理数据的丢失。如果正在读取数据并且只需要接收写入到服务器的最新数据值,那么未处理数据丢失的问题并不会产生影响。但是,如果需要接收写入到服务器的每一个值或者需要进行无损数据传输,就必须在客户端缓冲数据。在共享变量属性对话框的网络页上,勾选使用缓冲复选框可以启用共享变量的数据缓冲。

客户端缓冲

缓冲可以减少数据读取和写入双方潜在的计时差异,但并不能担保数据传递不出问题。如果服务器或客户端缓冲区中的数据超过缓冲区的大小,该缓冲区将丢弃较旧的值来放置较新的值。共享变量属性对话框的网络页可以设定共享变量缓冲区的大小,缓冲区的大小决定了新数据覆盖旧数据之前,共享变量保留多少旧数据包。

缓冲区的最大字节数和每个项的缓冲区能保存的值的最大数量(以信息包为计算单位)也可以通过编程设定。设置缓冲区时,应同时设定缓冲区最大字节数缓冲区最大信息包数两个选项的值。如果输入数据超过了最大字节数或最大信息包数,LabVIEW会删除缓冲区中较旧的数据,以容纳新的数据。

用编程方式配置缓冲区时,将写入数据连接到设置变体属性函数,通过唯一确定写入方每个数据的值并检查读取方已丢弃的序列ID号,来探测数据流中已丢弃的数据值。

如要发布的共享变量包含少于8 K字节的数据,LabVIEW只需10 毫秒即可将其发布至网络。刷新共享变量数据VI允许用户立即刷新缓冲区以避免延迟。

已经启用缓冲的客户端如需接收所有数据,可采用写入DataSocket函数以通过编程写入实时数据。从前面板读取数据可能导致数据丢失。

注: 客户端缓冲也适用于其他协议,比如opcfile协议。但是,在某些情况下,这些服务器可能丢失数据

打开DataSocket函数的模式输入端设为BufferedReadBufferedReadWrite,并使用属性节点设置先进先出(FIFO)缓冲区大小的DataSocket属性。这样做可以确保LabVIEW将那些从客户端接收到的值存储在缓冲区中,而不是在每次数据值发生变化时覆盖原来的值。

注:如果使用DataSocket属性来设置FIFO缓冲区的大小,必须将“打开DataSocket”函数的模式输入设置为BufferedReadBufferedReadWrite。否则,在该数据连接中,服务器的项是不会被缓冲的。

以下程序框图用编程方式来缓冲数据。

通过DataSocket函数共享数据时也可启用缓冲区,只需在URL的末尾添加字符串?maxbytes=1000&maxpackets=10,其中1000是缓冲区所能容纳的最大字节数,10是缓冲区所能包含的信息包的最大数量。

注:使用读取DataSocket函数来读取服务器上写入的数据时,可使用缓冲。当使用前面板DataSocket数据绑定来读取数据时,缓冲是不可用的。如将控件和共享变量绑定,并在共享变量属性对话框的网络页上启用缓冲区,此时对通过共享变量引擎实现的前面板数据绑定而言,缓冲是可用的。

使用DataSocket属性报告诊断信息

通过缓冲区字节使用率缓冲区包使用率属性,可为指定缓冲区请求诊断信息。这些属性可用于查看客户端缓冲区的使用率,以此判断当前缓冲区大小是否够用。如果两个属性中有一个达到了最大值,就需要增加缓冲区大小以确保能够接收到所有服务器发布的值。对While循环中的DataSocket函数提高执行速度可相应提高数据读取的速度。

服务器端缓冲

在对客户端缓冲进行配置时,如服务端发送数据的速度超过了网络的接受能力,某些情况下就会丢失服务端的数据。可在服务端使用NI-PSPdstp缓冲。使用NI-PSP缓冲时,必须连接到现有的已经启用缓冲的共享变量。使用dstp缓冲时,必须用DataSocket服务器管理器来配置服务端缓冲。关于DataSocket服务端缓冲的更多信息,见DataSocket服务器的帮助。对于其他协议,参考相关服务器的文档以获取更多关于服务端缓冲的信息。