LabVIEW基础之网络与通信

LabVIEW基础之网络与通信

LabVIEW提供的用于数据通信的函数模板如图所示。这里包括“共享变量”“队列操作”以及“协议”等子选板。

数据通信子选板

队列操作函数

队列操作函数子选板

1.获取队列引用

返回队列的引用。获取队列引用的图标及端口定义如图所示。

获取队列引用函数

队列最大值是队列要保持的元素的最大数量。默认值为–1,表示队列的元素数量没有限制。

名称:包含要获取或创建的队列的名称。 默认值为空字符串,用于创建无名称的通知器。

元素数据类型:需要队列包含的数据类型。该输入端可以连线任意数据类型。

如未找到是否创建?:指定名称队列不存在时,是否创建新的队列。 如果值为TRUE(默认值),指定名称的队列不存在时,函数可创建新的队列。

队列输出:对已有队列或函数创建的新队列的引用。

新建?:创建新的队列时,值为TRUE。

2.元素入队列

在队列后端添加元素.元素入队列的图标及端口定义如图所示:

元素入队列函数

队列:是队列引用。通过 获取队列引用 函数获取队列引用。

元素:是添加至队列末尾的元素。数据类型可匹配队列的子类型。

超时毫秒:指定队列满时,函数等待队列可用的时间,以毫秒为单位。 默认值为–1,永不超时。

队列输出:是对未改动队列的引用。

超时?:如函数超时之前,队列中的空位未转为可用状态,超时?返回TRUE。 如函数遇到错误,超时?也返回TRUE。

3.预览队列元素

返回队列前端的元素且不删除该元素。预览队列元素的图标及端口定义如图所示。

预览队列元素图标

素是队列前部的元素。数据类型可匹配队列的子类型。其它端口同前。

4.获取队列状态

返回队列的当前状态信息(例如,当前队列中的元素个数)。获取队列状态的图标及端口定义如图所示:

获取队列状态函数

返回元素?:表明是否返回队列中的元素。如值为FALSE(默认值),函数不返回队列中的元素。

队列最大值:队列能包含的元素数量的最大值。如队列最大值为-1,队列可包含任意数量的元素。

待处理删除数量:“元素出队列”或“预览队列元素”函数当前等待从队列中删除的元素。

队列中元素数量:返回当前队列中元素的数目。

元素:返回但并不删除当前队列中的所有元素。如返回元素?的值为FALSE,数组为空。数据类型可匹配队列的子类型。

5.释放队列引用

释放队列引用的图标及端口定义如图所示。

释放队列引用

强制销毁?(F):表明是否需要销毁队列。 如值为FALSE(默认)并且需要销毁队列,可调用“释放队列引用”函数,调用次数与获取引用的次数相等,或停止使用队列引用的所有VI。如值为TRUE,可由该函数销毁队列,用户无需多次调用“释放队列引用”函数或停止所有使用该通知器引用的VI。销毁队列可使所有指向队列的引用无效。

剩余元素:该数组由函数释放队列前队列中包含的元素组成。数组中的第一个元素是队列前部的元素,最后一个元素是队列后部的元素。数据类型可匹配队列的子类型。

6.有损耗元素入列

在队列中添加元素。如队列已满,函数可通过删除队列前端的元素使新元素入队。不同于元素入队列函数,该函数可立即执行元素入队操作。有损耗元素入列的图标及端口定义如图所示。

有损耗元素入列函数

溢出元素:队列已满时LabVIEW从队列前端删除的元素。

溢出?:如队列已满且LabVIEW通过删除元素获得该空闲位置,则值为TRUE。如队列存在空闲位置且元素已插入队列,则溢出?的值为FALSE。

7.清空队列

删除队列中的所有元素并通过数组返回元素,清空队列图标及端口定义如图所示:

清空队列的函数

剩余元素:该数组包含从队列中删除的元素。 数组中的第一个元素是队列前部的元素,最后一个元素是队列后部的元素。

8,元素出队列

删除队列前端的一个元素并返回该元素。如队列为空,则函数在超时前等待超时毫秒。如等待期间队列中出现剩余元素,函数可清除该元素且超时?为FALSE。元素出队列图标及端口定义如图所示。

元素队列函数

队列函数应用

例1 数值类型数据入队列和出队列。

(1)程序框图依次添加“获取队列引用”以及“元素入队列”和“元素出队列”函数,将数值常量“0”接至获取队列引用的数据类型端口,确定该队列的类型为数值型;

(2)添加两个while循环,一个用于元素入队列,将循环计数端子i进行 “加1”运算,运算结果进入队列,并在其结构中添加“等待函数”,设置等待时间为100ms;另一个循环用于出队列,添加“等待函数”,设置等待时间为200ms。

程序框图和和前面板如图所示。运行程序,因为队列为先进先出模式,但是当出队列时间间隔比入队列长时,则出队列的元素个数就会少于入队列的元素个数。

例2 字符串出入队列

将一常量字符串”abcdefgh”,每次截取长度2,利用for循环进行入队列操作,再利用另外一个for循环结构进行出队列操作,请读者自行练习程序,观察输出元素的数值变化,改变for循环的次数,再分析程序的运行结果,程序框图如图所示。

DataSocket通信

DataSocket是NI公司提供的一种新的实时数据传输技术,可用于一个计算机内或网络中多个应用程序之间的数据交换,是专门面向测量和自动化工程的网络实时高速数据交换的编程技术。DataSocket克服了传统TCP/IP传输协议需要较为复杂的底层编程、传输速率较慢(特别是对动态数据)等缺点,大大简化了实时数据传输问题,它提供了一种易用、高效、可编程的软件接口,能够很方便地实现网络上多台计算机之间的实时数据交换。

使用DataSocket技术实现远程数据采集时,需要在安装有DAQ设备的服务器上也运行应用程序,然后将某些需要的数据通过网络发布传输到客户机,这实际上是通过数据共享而非真正意义上的DAQ设备共享来实现远程数据采集,这样做的好处之一就是,可以多客户机同时访问服务器。

DataSocket包括DataSocket Server Manager、DataSocket Server和DataSocket几个工具软件,以及DSTP(DataSocket Transfer Protocol,DataSocket传输协议)、URL(Uniform Rresource Locator,通用资源定位符)和文件格式等技术规范]。在LabVIEW中,用户可以很方便地使用这些工具实现远程数据采集。

DataSocket功能函数

DataSocket的函数节点(VI)位于“函数数据通信”选板→“DataSocket”子选板中,如图所示,下面对其中的节点分别进行介绍。

DataSocket子选板

1. 读取DataSocket函数(ReadDataSocket.vi)

该节点用于从打开的URL连接中读取数据,其图标与端口如图所示。

读取DataSocket函数

连接输入:指定读取数据的资源,可以是URL字符串,也可以是DataSocket连接标识。

类型(变体):指定读取数据的类型,并且设置输出端口的数据类型。

毫秒超时(10000):规定了函数等待操作结束的时间。默认为0ms,说明函数将不等待操作结束。如果毫秒输入端口输入为-1,函数将一直等待直到操作完成。

状态:报告来自PSP服务器或FieldPoint控制器的警报或错误;如第31位是1,则状态表明发生错误。否则,状态是状态代码。

质量:从共享变量或NI发布-订阅协议(NI-PSP)数据项读取的数据的数据质量。质量的值可用于调试VI。

连接输出:指定数据连接的数据源。

数据(data)输出端口:从打开的连接中读取的数据。若读取超时,则返回上一次读取的值,如果超时之前未读取任何数据或设置的数据类型不符,则返回零、空等相似的值。

超时:如函数等待更新值或初始值时超时,则值为TRUE。

时间标识:返回共享变量和NI-PSP协议数据项的时间标识数据。

2. 写入DataSocket函数(Write DataSocket.vi)

该节点用于向打开的URL连接中写入数据,其图标与端口如图所示。数据可以是单个或数组形式的字符串、逻辑(布尔)量和数值量等多种类型。

写入DataSocket函数

连接输入:标识了要写入的数据项。连接输入端口可以是一个描述URL或共享变量的字符串。

数据:向打开的连接中写入数据,该数据可以是任意格式或者LabVIEW数据类型。

3. 打开DataSocket函数(Open DataSocket.vi)

该节点用于打开一个URL数据连接,其图标与端口如图所示。

打开DataSocket函数

URL输入端口:设置数据连接网络地址,可以使用PSP、DSTP、OPC、FTP、HTTP和FILE等通信协议传输数据,具体用何种协议,取决于写入数据的类型及网络配置。

模式(mode)输入端口:指定连接的模式,共有读、写、读写、读缓冲器和读写缓冲器5种模式。

连接ID(connection id)输出端口:数据连接的唯一标识。

4. 关闭DataSocket函数(Close DataSocket.vi)

该节点用于关闭打开的URL连接,其图标与端口如图所示。

关闭DataSocket函数

DataSocket Server Manager

DataSocket Server Manager是一个独立运行的程序,其主要功能是在本地计算机上设置DataSocket Server可连接的客户程序的最大数目和可以创建的数据项的最大数目,设置用户和用户组,以及设置用户访问和管理数据项的权限。数据项实际上是DataSocket Server上的数据文件,未经授权的用户不能在DataSocket Server上创建和读取数据项。依次选择“开始菜单”→“程序”→“National Instruments” →“DataSocket” →“DataSocket Server Manager”选项,即可启动DataSocket Server Manager,如图所示。其主要参数如下:

DataSocket Server Manager对话框

Server Settings(服务器设置):与服务器性能相关的设置。参数MaxConnections是指服务器最多可以连接的用户数,其默认值为50。参数MaxItems用于设置服务器最大允许的数据项目的数量。

Permission Groups(许可组):与安全相关的设置。Groups是指用一个组名来代表一组计算机名(或IP地址)的集合。DataSocket Server共有4个内建组:Administrations、DefaultReaders、DefaultWriters和Creators,分别代表了管理、读、写和创建数据项目的默认主机设置。Sample Group为一个用户定义组。

Predefined Data Items(预定义的数据项目):预定义了用户可以直接使用的数据项目,并可以设置每个数据项目的数据类型、默认值以及访问权限等属性。默认数据项目有Samplenum、Sample String和SampleBool 3个。

DataSocket Server

DataSocket Server也是一个独立运行的程序,主要解决大部分网络通信方面的问题,负责用户程序之间的数据交换。DataSocket Server需要TCP/IP网络协议的支持,但它比TCP/IP具有更好的数据传输性能。依次选择“开始菜单”→“程序”→“National Instruments” →“DataSocket” →“DataSocket Server”选项,即可启动DataSocket Server,如图所示。

DataSocket Server窗口

其主要参数为:

Processes Connected: 连接到DataSocket Server的实际客户端数目。

Packets Received: 传输过程中接收到的数据包的数目。

Packet Sent: 传输过程中发送的数据包的数目。

DataSocket 通信实现

DataSocket函数库是用于实现DataSocket通信的,它包含读取、写入、打开和关闭等函数。DataSocket技术可在C/C++、Visual Basic和LabVIEW等多种开发环境中应用,在不同的环境中DataSocket函数有不同的形式,在C/C++中是函数,在Visual Basic中是ActiveX控件,在LabVIEW中则是VI。

例3、 利用DataSocket发布数据。

需要3个要素:Publisher(发布器)、DS Server和Subscriber(订阅器),其通信过程如图所示。

服务器VI的前面板和程序框图如图所示。

客户机VI利用读取DataSocket节点将数据从URL“dstp://local host/wave”指定的位置读出,并还原为原来的数据类型送到前面板窗口进行显示。

客户机VI的前面板和程序框图如图所示。

在利用上述两个VI进行DataSocket通信之前,必须首先运行DataSocket Server。

例3中服务器和客户机都用同一台机器测试,因此IP地址写的是localhost。当然也可以使用本机的IP地址。本例中,服务器和客户机都是使用本机。



打开“函数”→“数据通信”→“协议”子选板,如图所示,这里主要是为网络通信提供的TCP、UDP、串口以及蓝牙协议的函数。

协议子选板

TCP功能函数

在LabVIEW中可以利用TCP进行网络通信,并且LabVIEW对TCP的编程进行了高度集成,用户通过简单的编程就可以在LabVIEW中实现网络通信。

在LabVIEW中,可以采用TCP节点,其位于“函数”→“数据通信”→“协议”→“TCP”子选板中,如图所示。

TCP函数节点子选板

1. TCP侦听节点

创建一个听者,并在指定的端口上等待TCP连接请求。该节点只能在作为服务器的计算机上使用。TCP侦听节点图标及端口定义如图所示。

TCP侦听节点

端口: 所要听的连接端口号。

超时毫秒(一直等待:-1): 连接所要等待的毫秒数。如果在规定的时间内连接没有建立,该VI将结束并返回一个错误。默认值为-1,表明该VI将无限等待。

连接ID: 是唯一标识TCP连接的网络连接引用句柄。该连接句柄用于在以后的VI调用中引用连接。

远程地址: 与TCP连接协同工作的远程计算机的地址。

远程端口: 使用该端口连接的远程系统的端口号。

2. 打开TCP节点

用指定的计算机名称和远程端口来打开一个TCP连接。该节点只能在作为客户机的计算机上使用。打开TCP连接节点的节点图标及端口定义如图所示。

打开TCP连接节点

远程端口或服务名:可接受数字或字符串输入,远程端口或服务名是要与其建立连接的端口或服务的名称。

超时毫秒(60000):在函数完成并返回一个错误之前所等待的毫秒数。默认值是60000ms。如果接-1则表明函数将无限等待。

3. 读取TCP数据节点

从指定的TCP连接中读取数据。读取TCP数据节点的节点图标及端口定义如图所示:

读取TCP数据节点

模式(标准):标明了读取操作的行为特征。

标准模式(默认):等待直到设定需要读取的字节全部读出或超时。返回读取的全部字节。如果读取的字节数少于所期望得到的字节数,将返回已经读取到的字节数并报告一个超时错误。

缓冲模式:等待直到设定需要读取的字节全部读出或超时。如果读取的字节数少于所期望得到的字节数,不返回任何字节并报告一个超时错误。

CRLF模式:等待直到函数接收到CR(carriage return)和LF(linefeed)或发生超时。返回所接收到的所有字节及CR和LF。如果函数没有接收到CR和LF,不返回任何字节并报告超时错误。

立即模式:只要接收到字节便返回。只有当函数接收不到任何字节时才会发生超时。返回已经读取的字节。如果函数没有接收到任何字节,将返回一个超时错误。

读取的字节:所要读取的字节数。

连接ID输出:与连接ID的内容相同。

数据输出:包含从TCP连接中读取的数据。

4. 写入TCP数据节点

通过数据输入端口将数据写入到指定的TCP连接中。写入TCP数据节点的节点图标及端口定义如图所示。

写入TCP节点

数据输入:包含要写入指定连接的数据。数据操作的方式,请参见读取TCP数据节点部分的解释。

超时毫秒(25000) :函数在完成或返回超时错误之前将所有字节写入到指定的一段时间,以毫秒为单位。默认为25000ms。如果为-1,表示将无限等待。

写入的字节(bytes written):VI写入TCP连接的字节数。

5. 关闭TCP连接节点

关闭指定的TCP连接。关闭TCP连接的节点图标及端口定义如图所示。

关闭TCP连接节点

6. 创建侦听器TCP(TCP Create Listener)节点

创建一个TCP网络连接侦听器。如果将0接入输入端口,将动态选择一个操作系统使用的可用的TCP端口。创建TCP侦听器节点的节点图及端口定义如图所示。

创建TCP侦听器节点

侦听器ID:能够唯一表示侦听器的网络连接标识。

端口(输出):返回函数所使用的端口号。如果输入端口号不是0,则输出端口号与输入端口号相同。如果输入端口号为0,将动态选择一个可用的端口号。根据ANA(Assigned Numbers Authority)的规定,可用端口号范围是49152~65535。最常用的端口号是0~1023,已注册的端口号是1024~49151。并非所有的操作系统都遵从IANA标准,例如,Windows返回1024~5000之间的动态端口号。

7. 等待TCP侦听器节点

在指定的端口上等待TCP连接请求。TCP侦听VI节点就是创建TCP侦听器节点与本节点的综合使用。

等待TCP侦听器节点的节点图标及端口定义如图所示。

等待TCP侦听器节点

侦听器ID输入: 一个能够唯一标明侦听器身份的网络连接标识。

侦听器ID输出: 侦听器ID输入的一个附本。

连接ID: TCP连接唯一的网络连接标识号。

TCP/IP通信的实现

例6、 采用服务器/客户机进行双机通信,通过局域网送至客户机进行显示。双机通信流程如所示。

双机TCP通信流程

(1)新建一个VI,在程序框图中添加“TCP侦听”模块,在其输入端的“TCP端口号”添加输入控件,在程序建立通信前,首先指定网络端口,用于建立TCP侦听器,这是初始化的过程。

(2)在程序框图内添加while 循环,添加两个“写入TCP 数据”模块:一个写入数据发送的是波形数组的长度,所以添加“字符串长度”函数,以及“强制数据类型”,接在“写入TCP 数据”的数据输入端口;第二个发送波形数组的数据,波形数组为一个正弦信号和余弦信号叠加的数据。前面板放置波形图用于显示发送数据的波形。

(3)在程序框图的while循环外加入“关闭TCP 连接”;具体服务器的前面板及程序框图如图所示。

TCP通信服务器

在用TCP节点进行通信时需要在服务器框图程序中指定网络通信端口号,客户机也要指定相同的端口,才能与服务器之间进行正确的通信。端口值由用户任意指定,只要服务器与客户机的端口保持一致即可。

客户机的前面板及程序框图如图所示。

TCP通信客户机程序

在一次通信连接建立后,就不能更改端口的值了。如果的确需要改变端口的值,则必须首先断开连接,才能重新设置端口值。

在客户机框图程序中首先要指定服务器的名称才能与服务器建立连接。服务器的名称是指计算机名。若服务器和客户机程序在同一台计算机上同时运行,客户机框图程序中输入的服务器的名称可以是local host,也可以是这台计算机的计算机名。

发布于 2021-04-29 12:56

文章被以下专栏收录