如何使用TCP&UDP在Host和RT Target进行数据传输



主要软件: LabVIEW Development Systems>>LabVIEW Professional Development System
主要软件版本: 2011
主要软件修正版本: N/A
次要软件: LabVIEW Modules>>LabVIEW Real-Time Module

问题:
1)如何使用TCP&UDPHostRT Target进行数据传输;
2)如何搭建一个功能完善并且可扩展性强的架构,能够处理Host端的用户事件、UDP&TCP通信管理、发送配置参数和测试请求给RT端;在RT端响应Host端请求,握手连接、完成硬件任务、通过TCP返回测试结果;
3)如何合理利用既有的开源库函数Asynchronous Message Communication (AMC) Reference LibraryLabVIEW Simple Messaging Reference Library (STM),而AMC又是基于LabVIEW Queued State Machine Architecture


解答:
在描述这些之前,先稍微挖掘一下LabVIEW中的TCP&UDP函数,虽然看起来它们是如此的其貌不扬。
 
一、UDP
   
1. UDP Open函数:
        UDP Open函数用于建立一个UDP连接,对于UDP发送和UDP接收而言,UDP Open函数的参数设置是一样的(这里我不讨论基于Named ServiceUDP通讯)。对于UDP发送,UDP Open函数只需要指定建立UDP连接的端口(Port),这个值可以是默认给0,这样系统会自动选择一个可用的UDP端口。如果端口是其它非零值,该非零值即本次UDP通讯所使用的特定端口。对于UDP接收,调用UDP Open函数时,指定通讯端口号后,通过UDP Read函数即可以从这个配置的端口号侦听数据。
 
2. UDP Write函数:
 
        对于UDP发送数据端,在配置了UDP Open函数之后,即可以使用UDP Write发送数据。UDP Write函数的两个重要参数即IP AddressPort端口号。这样可以向局域网内某特定IP Address特定端口的计算机发送数据(datagram).我们可以在每一次调用UDP Write时修改IP AddressPort参数,将数据报发送到不同的目标。UDP具有广播的功能,如果IP Address设置成255.255.255.255,那么UDP数据将发送到整个局域网内,所有计算机都可以接收该数据(参考NI LabVIEW范例 UDP Sender.vi,选择broadcast模式,可以在局域网内多个不同计算机上运行UDP Receiver.vi,均能接收到UDP Sender.vi发送出的数据)。但考虑到路由器或其它网络硬件设备并非支持所有的地址,所以实际发送的目标数量是受限制的。
   
3. UDP Read函数:
      UDP Read函数从UDP Open函数所设定的侦听端口处读取数据。我们可以设定一次读取的最大字节数和超时豪秒数。如果在给定的时间内没有接收到一个字节,那么UDP Read函数将跳过并返回超时错误。我们注意到UDP Read函数有两个输出参数,AddressPort分别是发送该数据报的源计算机和端口号。我们可以通过这两个参数得知是谁在发送数据,并可以提供应答信息(参考例程UDP Server and Client.lvlib)。
      在UDP通讯中,我们是否通过某个端口发送数据出去,同时从该端口读取数据进来?答案是肯定的。还是以我们的例程UDP Server and Client.lvlib进行讲解。在UDP Client.vi中使用UDP Open函数创建了UDP连接,UDP Open函数返回一个端口号,UDP Write函数即通过该端口号将数据发送出去(注意不要和UDP Write函数本身的Port输入参数混淆)。随后程序调用了UDP Read函数侦听该特定端口号的数据。所以我们通过同一端口既发送数据,又可以接收其它计算机发来的数据。
 
二、TCP
 
1.从范例TCP Communicator-Passive.viTCP Communicator-Active.vi运行看到,必须先运行TCP Communicator-Passive,即必须先调用TCP Listen函数创建一个指定端口的监听者。否则在TCP Communicator-Active.vi调用TCP Open函数时会报错:
 
 
从这组范例中我们还可以看到,TCP是连接型协议,需要进行握手。TCP要求发送消息之前,必须先建立连接;并且一旦任何一方断开连接 (connection aborted),将导致整个TCP连接终止,即不再发送消息(或不再接收消息),这样TCP使用更多的开销来保证数据的可靠性和完整性。
 
2.如果运行Simple Data Server,能否同时运行多个Simple Data Client
在局域网的不同计算机上,答案是不可以的。
 
3. 利用TCP Create ListenerTCP Wait on Listener函数可以针对某个特定的端口,建立多个TCP网络连接,即可以创建多个客户端。参考范例:Multiple Connections - Server.viMultiple Connections - Client 1.vi Multiple Connections - Client 2.vi
TCP通讯中经常会遇到的错误包括连接超时、连接中止、连接关闭等,我们需要手动去处理这些情况。而在UDP中是基本不需要进行这方面的管理的。
三、基于TCP/UDP构建的HostRT Target之间的通讯模板
 
本模板的目的在于提供一个上位机和RT Target之间通讯的通用模板:Host端程序负责人机界面、监测网络连接状态、数据的存储;RT Target执行实现的硬件任务,并将结果、任务状态通过TCP&UDP返回给上位机。其中UDP通讯使用Asynchronous Message Communication (AMC) Reference Libraryhttp://zone.ni.com/devzone/cda/epd/p/id/6091
    我们在前面已经讨论了UDP&TCP的特点,UDP连接简单,速度快,适合发送命令消息;TCP连接稍微复杂,需要手动管理,但它保证数据的完整性,适合将测试数据通过TCP方式进行传输,保证不丢失数据。
 
3-1 项目结构
1)OperatorInterface.vi即Host端程序
2)位于PXI Target目标下的RT.vi即运行RT任务
3)在没有RT Target时,运行RT_Simulate.vi可以在同一台计算机上验证该模板,不此时要右击项目属性,将条件禁用变量配置为True
 
3-2 系统原理图
 
OI
0. UI Event:主要处理上位机用户界面事件,如检查UDP通迅、设置参数、启动测试;
1. Processor:核心线程,负责在上位机和RT之间的UDP&TCP通信,以及响应UI EventStream_In线程产生的任务;
2. Stream_In1)接收Stream_Out发出的数据,存储到本地磁盘;2)发送消息告诉Processor当前TCP的连接状态(TCP Connected or Disconnected, Heartbeat);
 
RT Target
3. Command1)响应OIUI Event事件,并适时通过UDP返回必要的应答信息;2)通知Sequencer线程执行测试
4. Sequencer1)执行实际的硬件代码,将测试完的数据发送给本地Stream_Out线程;2)测试完毕,通过UDP返回测试状态给Processor,对OI控件进行更新
5. Stream_Out1)将接收到的测试结果通过TCP发送给Stream_In线程;2)发送HeartBeatHeartBeatRT不断发送给Host的信号,可以实时的监控RTHost端之间的连接)
*Queue, TCP, UDP代表在不通线程中数据交互的方式
 
3-3 状态图
 
  1. UI Event处理单击前面板UDP Check按钮产生的事件,并将请求通过队列发送到Processor
  2. Processor通过UDP发送请求消息到RT端的Command
  3. Command接收到该消息后通过UDP发回应答信息
 
Run Test流程图
  1. UI Event处理单击前面板Run Test按钮产生的事件,并将请求通过队列发送到Processor
  2. Processor通过UDP发送请求消息到RT端的Command
  3. Command接收到该消息后通过UDP发回应答信息,告知已收到开始测试的请求
  4. CommandRun Test任务发送给Sequencer
  5. Sequencer执行完实际硬件代码后,返回状态给Processor
数据存储流程图
  1. Sequencer将测试数据通过队列发送给Stream_Out
  2. Stream_out将接收到的数据通过TCP发送给Stream_In,并发送HeartBeat
  3. Stream_In储存测试数据,并将HeartBeat通过队列发送给Processor,更新布尔控件HeartBeat
3-4 关于AMCSTM
 
UDP通讯使用的是Asynchronous Message Communication (AMC) Reference Library,其中很重要的一个函数即AMC Dispatcher,以UDP Check流程图为例,Processor发送的请求消息并不是直接送达Command线程,而是通过AMC Dispatcher函数解包后再通过队列转发给Command
 
TCP通讯使用的是LabVIEW Simple Messaging Reference Library (STM),使用这个Library的好处在于它定义了TCP每次发送的数据格式,如上图所示:每次发送的数据包括1)数据大小;2)关键词;3)数据。我们可以利用关键词很容易的告知接收方发送的是配置参数还是握手信息或测量数据等等。并且由于每次发送的Packet格式是固定的,只要相应的对Packet进行解包即可,使用起来非常简单。
 
3-5 操作&运行结果
OperatorInterface.viRT.vi无所谓运行先后顺序,也可以中途随意中止任一VI
OperatorInterface.vi运行后,我们稍微等待,直到提示TCP Connected HeartBeat LED灯开始闪烁,依次点击UDP CheckRun Test,你看到的字符串控件显示应该如下图所示:
 
如果中途Abort RT.vi,则OI能检测到TCP Disconnected,重新运行RT.vi后,TCP连接又能恢复正常,非常方便!如下图所示:


相关链接:
1. Asynchronous Message Communication (AMC) Reference Library
http://zone.ni.com/devzone/cda/epd/p/id/6091
2. TCP通讯采用LabVIEW Simple Messaging Reference Library (STM)
http://zone.ni.com/devzone/cda/tut/p/id/4095#toc7


附件:
TCP&UDP Commnication Between RT and Host.7z




报告日期: 08/09/2012
最近更新: 08/09/2012
文档编号: 6089S7K