labview是多线程的,在两个线程交换数据有多种方法,进程(PROCESS)和线程(THREAD)是两个不同的概念,我们启动一个执行文件实际上就是启动一个进程,WINDOWS的进程管理器可以观察到当前存在那些活动进程,进程间交换数据可以简单地理解成多个执行文件间交换数据.
进程间交换数据有几种方法:剪切板(CLIPBOARD),动态数据交换(DDE),内存映射文件(MAP FILE)和一般文件,当然也可以用TCP/IP ,SHARE VARIABLE,DATASOCKET,不过这些都属于网络数据交换,用于本机进程间通讯并不合适.
过去的一篇文章中已经介绍过如何利用剪切板进行通讯,今天介绍一下动态数据交换(DDE)
DDE(Dynamic Data Exchange),即动态数据交换,是Windows平台上的一个完整的通信协议,它使应用程序能彼此交换数据和发送指令。DDE过程是两个程序的对话过程,一方向另一方提出问题,然后等待回答。提出问题的一方即申请告知信息的应用程序,称为顾客(Client),回答的一方即提供信息的应用程序,称为服务器(Server)。一个应用程序可以同时是顾客和服务器:当它向其他程序请求数据时,它充当的是顾客;当有其它程序需要它提供数据时,它又成了服务器。但就某一确定的时刻而言,一个应用程序只能充当顾客或服务器。
DDE对话的内容是通过3 个标识进行约定的:①服务器名(Service Name):DDE源的每个应用程序有一个唯一的服务器名,通常为不带后缀的可执行文件;②话题(Topic):对源程序有意义的一些数据单元即对话的议题,许多应用程序将文档名作为DDE会话的话题;③项目(Item):DDE会话中,两个应用程序间真正传递的数据。建立DDE之前,客户程序必须填写服务程序的3个标识名。
DDE链接有3种类型:①热链接(hot link):服务器发送专门为DDE对话而设定项目中的数据,当这些数据发生变化时,链接将实时动作,自动更新数据;②冷链接(cold link):当数据发生变化时,客户必须明确地提出更新要求,数据才会被更新;③暖链接(warm link):服务器在数据发生变化时,通知客户,客户根据自己的要求决定是否更新数据。
DDE本质上是通过发送消息实现的,在VC和CVI中,可以注册事件回调函数,实现自动数据交换,但是遗憾的是LABVIEW并没有对DDE提供事件驱动方式,正如它的串口操作一样,都是通过轮询(POLLING)方式进行的,因此就涉及到两个进程DDE速度协调的问题。
DDE是WINDOWS早期进程间通讯的重要方式,现在用的不多了,但是很多应用程序,比如OFFICE,matlab等,包括各种流行的组态软件,依然提供对DDE的支持,所以有必要了解一下。
7。1以后的LABVIEW在模板中是找不到DDE库的,需要手动添加到USER LIB中。
C:Program FilesNational InstrumentsLabVIEW 8.5vi.libPlatformdde.llb
主要分成客户机和服务器两部分,客户机和服务器VI。
DDE数据交换首先要启动服务器,否则客户机无法连接。
服务器操作过程是:
注册服务器---》注册ITEM----》设定ITEM值-----》取消ITEM注册---》取消服务器注册
相应客户端的读数据框图
注意到服务器的循环每500MS更新一次,客户端每500MS更新一次,服务器和客户端基本保持同步,如果客户端速度高于服务器,将导致对服务器的同一数据读多次,同理,如果服务端运行速度快,客户端运行速度慢,将导致数据丢失,这正是没有事件响应的缺点,很难保证发送和接受的同步。因此,上面的程序仅适用于对数据交换要求不高的情况,比如监控等。
DDE是一个层次结构,SERVER--》TOPIC---》ITEM
一个SEVER可以包括多个TOPIC,(类似与组),每个TOPIC又可以包括多个ITEM(项目),我们可以通过循环注册多个TOPIC和多个ITEM,实现批量数据交换。
上图中,通过循环为TOPIC1同时注册了10个ITEM,分别是ITEM0----》ITEM9,在主循环中分别向ITEM0--》ITEM9写入数据。
同理,我们可以对我们有通讯的数据详细分类成多个SERVER和多个TOPIC,进行大量的数据交换。
|