LabVIEW的网络应用
时间:12-13
整理:3721RD
点击:
“网络”在生活中和测控、通讯等工程领域中的含义有所不同。早期的网络是用串口、GPIB卡等技术连起来的。即使现在GPIB依然是NI很赚钱的产品。我在上硕士研究生的时候曾经用AT命令对串口编程,控制调制解调器,令计算机之间通过电话线传输数据。后来串口的VI都变成VISA了。当然我们也可以直接对串口的物理地址读写,如果你知道每个寄存器的定义。
当互联网逐渐兴起的时候,工程领域也越来越多地利用互联网的强大优势。比如Bently Nevada是在转动机械监测和故障诊断领域一个领头的公司,他们有一个注册商标,叫做Move Data, Not People。LabVIEW在很早的版本就有TCP、UDP、ActiveX、VI server等等可以和互联网打交道的手段;LabVIEW的前面板可以内置一个浏览器,另外还有Internet 工具包可以处理telnet、ftp、email、XML、CGL等等;到LabVIEW 6i的时候,NI推出了DataSocket和web publishing;从去年8.0开始,新的shared variable又取代了DataSocket。其实shared variable集成了很多原来的技术,比如ModBus, 所以现在写网络应用的程序可以比以前简单很多。举例来说,DataSocket对简单的应用来说是很好用的技术,但是每次都要启动DataSocket server (虽然可以再LabVIEW程序里控制启动、隐藏、退出等等),新的shared variable 就不要启动server了。
我想BBS上任何一个人都比我知道更多互联网的知识,比如如何在LabVIEW中使用Java我到现在还不是很清楚。2000年的时候Jeff Travis出版了一本Internet Applications in LabVIEW,今天看来里面讨论的技术还不算太过时,因为底层的东西都没变。今天我就说说上面提到的协议中最简单的UDP。我的这点经验也是从教训中得来的。我们曾经给韩国的一个公司做过一套培训系统,计划是有一台教师用的计算机、12台学生用计算机和一台PXI连成一个局域网,教师用的这台计算机有一套程序控制学生的登录、谁有权使用PXI做数据采集、共享数据,等等。学生的计算机在获得PXI的控制权之后,可以采集数据,同时将显示数据的前面板发送给其他学生,这样所有人都可以观察数据。当数据采集结束之后,原始数据文件保存在教师的计算机的一个共享文件夹里,其他学生的计算机都可以从这个文件夹获取数据文件。
原来这套系统的网络部分是用DataSocket写的,测试了8台计算机的局域网,没有问题,但是再增加计算机,网络通讯就变得非常慢。这是因为DataSocket实基于TCP的,每建立一对连接,服务器都要向客户端发送一遍数据,也就是说如果有12台计算机同时与服务器建立了连接,服务器就要将同一个数据包发送12次,这当然大量地占用带宽,尤其是采样频率比较快,而且通道比较多的时候。
所以要解决这个问题,主要的目标就是减少网络上的数据流量。
第一, 用UDP取代DataSocket。UDP与TCP都是建立在IP之上的协议,它们通过同样的地址和端口识别连接。UDP与TCP的最大区别在于UDP其实并不需要建立连接,而且它也不保证数据准确送达。这就好像电台与收音机的关系:UDP的服务器是一个电台,客户端是收音机,即使没有任何收音机收听某个频道的广播,这个频道也依然可以广播下去,而且电台并不保证收听效果。所以UDP是数据传输的有效和可靠的妥协。
第二, 尽量减少数据流量,比如把所有双精度的数据都变成单精度的。另外一个非常有效的办法,就是chunking,这是受NI的Damien Gray博士的一个讲座的启发。因为人眼睛分辨能力的限制,我们只要每像素显示4个点就足够了,那么我也按照每像素4个点来传输的话,无论原始的采样频率有多快,传输的数据只跟显示的Graph的宽度有关。这样一来我们可以上G的数据减少成二十M的样子。
第三, 大家都可想到的,数据压缩。我使用的zlib.dll压缩比可以达到90%以上,我们还期望比这更好的压缩效率吗?现在我们传输16的通道的数据每次只要大概十几K。
综合以上讨论,请看附件中的仿真例子,在LabVIEW8.2下写的。multicast sender_packets.vi和multicast receiver_packets.vi是两个主程序。要把zlib.dll 放到Windows\system32下面。UDP在使用上有一些问题,比如每次传送数据包的大小是有限制的,这些问题我在例子里面都考虑到了。UDP VI的具体使用方法请看LV的帮助。这个例子还演示了如何构建polymorphic vi。
下次讲DataSocket。DataSocket虽然简单,但是也有一些问题。有问题就要解决。
当互联网逐渐兴起的时候,工程领域也越来越多地利用互联网的强大优势。比如Bently Nevada是在转动机械监测和故障诊断领域一个领头的公司,他们有一个注册商标,叫做Move Data, Not People。LabVIEW在很早的版本就有TCP、UDP、ActiveX、VI server等等可以和互联网打交道的手段;LabVIEW的前面板可以内置一个浏览器,另外还有Internet 工具包可以处理telnet、ftp、email、XML、CGL等等;到LabVIEW 6i的时候,NI推出了DataSocket和web publishing;从去年8.0开始,新的shared variable又取代了DataSocket。其实shared variable集成了很多原来的技术,比如ModBus, 所以现在写网络应用的程序可以比以前简单很多。举例来说,DataSocket对简单的应用来说是很好用的技术,但是每次都要启动DataSocket server (虽然可以再LabVIEW程序里控制启动、隐藏、退出等等),新的shared variable 就不要启动server了。
我想BBS上任何一个人都比我知道更多互联网的知识,比如如何在LabVIEW中使用Java我到现在还不是很清楚。2000年的时候Jeff Travis出版了一本Internet Applications in LabVIEW,今天看来里面讨论的技术还不算太过时,因为底层的东西都没变。今天我就说说上面提到的协议中最简单的UDP。我的这点经验也是从教训中得来的。我们曾经给韩国的一个公司做过一套培训系统,计划是有一台教师用的计算机、12台学生用计算机和一台PXI连成一个局域网,教师用的这台计算机有一套程序控制学生的登录、谁有权使用PXI做数据采集、共享数据,等等。学生的计算机在获得PXI的控制权之后,可以采集数据,同时将显示数据的前面板发送给其他学生,这样所有人都可以观察数据。当数据采集结束之后,原始数据文件保存在教师的计算机的一个共享文件夹里,其他学生的计算机都可以从这个文件夹获取数据文件。
原来这套系统的网络部分是用DataSocket写的,测试了8台计算机的局域网,没有问题,但是再增加计算机,网络通讯就变得非常慢。这是因为DataSocket实基于TCP的,每建立一对连接,服务器都要向客户端发送一遍数据,也就是说如果有12台计算机同时与服务器建立了连接,服务器就要将同一个数据包发送12次,这当然大量地占用带宽,尤其是采样频率比较快,而且通道比较多的时候。
所以要解决这个问题,主要的目标就是减少网络上的数据流量。
第一, 用UDP取代DataSocket。UDP与TCP都是建立在IP之上的协议,它们通过同样的地址和端口识别连接。UDP与TCP的最大区别在于UDP其实并不需要建立连接,而且它也不保证数据准确送达。这就好像电台与收音机的关系:UDP的服务器是一个电台,客户端是收音机,即使没有任何收音机收听某个频道的广播,这个频道也依然可以广播下去,而且电台并不保证收听效果。所以UDP是数据传输的有效和可靠的妥协。
第二, 尽量减少数据流量,比如把所有双精度的数据都变成单精度的。另外一个非常有效的办法,就是chunking,这是受NI的Damien Gray博士的一个讲座的启发。因为人眼睛分辨能力的限制,我们只要每像素显示4个点就足够了,那么我也按照每像素4个点来传输的话,无论原始的采样频率有多快,传输的数据只跟显示的Graph的宽度有关。这样一来我们可以上G的数据减少成二十M的样子。
第三, 大家都可想到的,数据压缩。我使用的zlib.dll压缩比可以达到90%以上,我们还期望比这更好的压缩效率吗?现在我们传输16的通道的数据每次只要大概十几K。
综合以上讨论,请看附件中的仿真例子,在LabVIEW8.2下写的。multicast sender_packets.vi和multicast receiver_packets.vi是两个主程序。要把zlib.dll 放到Windows\system32下面。UDP在使用上有一些问题,比如每次传送数据包的大小是有限制的,这些问题我在例子里面都考虑到了。UDP VI的具体使用方法请看LV的帮助。这个例子还演示了如何构建polymorphic vi。
下次讲DataSocket。DataSocket虽然简单,但是也有一些问题。有问题就要解决。
大赞
zan
长见识
不错,呵呵