微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 测试测量 > 虚拟仪器 > LabVIEW网络应用(2) DataSocket

LabVIEW网络应用(2) DataSocket

时间:12-13 整理:3721RD 点击:
大家新年过得可好?度假回来,继续我的经验谈。
列为看官,上回书说到LabVIEW网络应用的broadcasting是用的一些经验教训。这次说一说DataSocket.
DataSocket (以下简称DS) 是从LV5.1开始的,因为前面板的控件可以直接bind到DataSocket server上,所以一个局域网上的其他电脑可以很方便地看到某些制定的控件的变化。一般的使用方法很简单,不熟悉的朋友看看帮助和例程,都很容易掌握。我今天主要说两点。
第一点,DS的通讯都是通过DS server 完成的。如果你写一个应用程序给用户,在生成可执行程序的时候有一个选项可以把DS包括在安装程序里。在执行setup.exe的时候,DS会安装在National Instruments的目录下。为了方便用户操作,你一定不希望在用到DS通讯的时候让用户去打开DS server,这个简单,用 system exec就可以解决。进一步说,当你使用system exec打开 DS server 之后,这个server的界面就会出现在最前面,而不会自动隐藏或者最小化。这就会挡住用户真正要使用的应用程序的界面。我的解决办法是使用ActiveX来隐藏这个server。在应用程序关闭的时候,也同样使用ActiveX把这个server关闭。请看附件中的Control_DS_server.vi这个例子(LV 7.1)。
第二点,我原来上本科的时候学计算机接口、串口通讯,当client把数据读走之后,port当中这段数据就清空了。但是DS不是这样,当client读了数据之后,如果写入一方不更新数据的话,这段数据是不会清空的。这造成诸多不便。例如,前面有人讨论如何用LV实现用户登录(注意不是“登陆”)。我就是用DS来实现客户端向服务器登录的。客户端在输入用户名和密码并且点击登录按钮之后,发一个login的命令,把输入的用户名和密码通过DS server 送到服务器,服务器接收到“login"这个命令,就去查表,看看用户名和密码对不对。DS server不清空缓冲区,服务器读到一次login命令之后,会反复读到这个命令,这当然不对了。一个麻烦的解决办法是把这个与这个命令相关的connection 变成即可读又可写(请看DataSocket Open的帮助),并且在DS server manager里要对这个连接选择Allow multiple writers(DS server manager里面的data item是没办法在LV里面动态创建的)。在服务器读到这个命令之后再写一个空指令,强行把缓冲区变成空数据(其实缓冲区并没有空,只是写一个没有意义的空字符串)。但是这个办法并不好,因为服务器在写空指令的时候,客户端有可能向这个connection 发来新的命令,这样的话双方就会出现race condition。本来应该是一方只读另一方只写的,而且从逻辑上说这样的命令操作根本不应该allow multiple writers。我的解决办法,是写的一方写一个cluster, 包括应该要写的命令和当前时间。读的一方读到cluster之后先判断其中的时间是不是和上一次读的cluster中的时间相同,如果相同就ignore,如果不同,就说明写的一方写来了新的命令。
这是一个非常行之有效的办法。在LV8发行之后,我发现新的shared variable 同样有这个问题,就是数据读走之后缓冲区不清空。也可以用附带是时间信息的方法来解决这个问题。
再说一个小问题,善用DS相关的property node. 前面说到DS的一大优点就是别一个VI可以直接读其他VI前面板的控件。这个操作可以在前面板完成,指定连接的URL和一些属性。当然如果你只是自己用,这样完全没有问题,但是如果你要做一个应用程序,这些操作必须在程序里动态完成。比如我在上一次讲的例子,一个老师的计算机和十几台学生计算机连成一个局域网,任何一台计算机都可能做服务器,然后其他计算机读这台计算机内运行的程序的前面板。这只能在程序里用property node 来做。另外DS某个带缓冲区的连接(BufferedRead, BufferedReadWrite), 缓冲区的大小也是由property node来指定的。
请用过DS和新的data binding的朋友大家都来讨论一下心得,也算是我挖个坑。

 Control_DS_server.vi

补充一点。
刚才我翻看原来的笔记,发现一个小问题。DataSocket Write VI有一个输入端ms timeout(0), 其默认值是0。但是如果timeout是0的话,DataSocket Write VI并不能保证数据确实写到server里。要把timeout变成-1,这个VI写的动作才会等数据真地写完再结束。
当初这个问题可把我折腾苦了。比方说写的一方连续很快地写几个命令,如果timeout是0,前一个命令还没写完,后一个就开始写了,这显然不行。因为写的速度很快,如果用一些调试手段,等于自动放慢速度,所以每个命令都能在调试的慢动作下写完。我调试的时候总是没错,但是真的一运行就出错,drove me crazy。就这么一个简单的设置我花了整整一个晚上才搞清楚。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top