论文部分内容阅读
摘要:针对Lab Windows/CVI中的DataSocket技术和NI网络变量只能手工、静态分配采集端资源的问题。该文设计和实现了一个基于虚拟仪器的网络通信平台,使得多个客户端可以同时和多个采集端进行通信,并动态的申请和释放采集端资源。
关键词:Lab Windows/CVI;远程测控;动态资源分配
中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)35-2138-03
Construction of a Dynamic Network Layer Based on Lab Windows/CVI
PENG Han, CAI Ying-chang
(Department of Computer Engineering, Xi'an Aerotechnical College, Xi'an 710077, China)
Abstract: DataSocket technique and NI network variable of Lab Windows/CVI can only allocate gatherresource statically. To resolve this problem, this paper designed and implements a dynamic network layer based on virtual instrument .The network layer made it possible for multi-client and multi-gather to communicate with each other, and the client can allocate and release gather resources dynamically.
Key words: lab windows/CVI; remote measurement; dynamic resources allocation
1 引言
随着计算机软硬件技术不断发展与提高,虚拟仪器技术已成为当前测控领域内的关键性技术。在远程测控与仿真方面,虚拟仪器网络化已被应用到测控技术中的各个领域。NI的DataSocket技术为底层通信协议提供了一致的API,编程人员无需为不同的数据格式和通信协议编写具体的程序代码。但DataSocket的缺陷是它对客户端和采集端(仪器设备)的资源配置是静态的,即客户端和采集端的连接必须在测控系统运行之前手工配置,客户端无法动态的申请和释放采集端的资源。虽然美国NI(National Instrument)公司在Lab Windows/CVI的最新版本用网络变量(Network Variable)代替了DataSocket,但还是没有改变这一静态特性。当多个客户端要求控制多个采集端资源进行数据采集,并要求在新的任务中重新申请新的资源时,DataSocket和网络变量就显得不够灵活,无法满足系统的需求。针对这一点,本文设计了一个能为多个客户提供动态申请和分配采集端资源的网络通信层,用Lab Windows/CVI的TCP库实现。对模块的使用者封装了底层的通信细节,用户只要调用本模块提供的外部接口即可。
2 设计思想
2.1 系统要求
根据用户的要求,本采集系统应具备动态的按需分配采集端资源的能力,可以有多个客户端,每个客户端可以申请若干数量的采集端资源进行数据采集,本次采集完毕后应该能释放采集端资源让其他的客户端使用。如果要重新开始一次新的采集任务,则应再次重复这个申请资源->使用资源->释放资源的过程。
2.2 系统的总体设计思想
依据软件设计的模块化的原则,我们忽略采集端的数据采集过程和客户端的数据分析、处理过程的细节,只考虑网络通信层的设计,根据用户要求,提出了如图1所示的总体设计思想。
图1中的采集端为嵌入式主机,而客户端为用户使用的PC。数据库服务器负责维护一个资源占用情况表,表中为每个采集端资源建立了一个记录项。记录项中有一个字段是资源占用位。初始时所有的资源都被标记为空闲,即表中每一项的资源占用为都为0(表示本资源空闲)。当一个用户开始一个数据采集任务时,客户端程序自动到数据库服务器中查询资源占用表,若找到足够的空闲资源,则把这些资源对应的记录项的资源占用位标记为1(表示本资源已被占用)。此后,客户端从数据库服务器获得这些可用资源的IP地址,并依次连接这些采集端,发送各种采集指令,采集端执行采集指令并返回结果。客户端完成一个采集任务后,断开与所有采集端的连接并将数据库服务器中相应的资源设置为空闲状态。
3 设计与实现
网络通信模块设计的难点并不在于客户端与采集端的通信,而在于一个客户端要同时给多个采集端发送命令,并同时接收多个采集端发回的响应数据。而采集端必须在完成一次采集任务后能被其他的客户端使用。基于此,设计和实现了客户端和采集端网络通信模块。
3.1 客户端通信模块设计
为了让客户端能同时和多个采集端同时通信,采用了多线程技术,让每个工作者线程负责与一个采集端的通信。在客户端通信模块中设计了一个ClientInfo数据结构,用来记录每个工作者线程的相关信息,如图2所示。
用一个CVI定义的列表结构ListType来存放所有工作者线程的信息:
Static ListType gClientList = 0;
只要和一个采集端建立的连接,就为它开启一个工作者线程,并把相关信息放入gClientList中;同样,完成采集任务后,与采集端断开连接并释放相应的工作者线程,然后从gClientList中删除相关信息。
客户端通信模块提供了5个外部接口供用户调用,如表1所示。
其中RegisterServer()函数封装了CVI的TCP库中的函数RegisterTCPServer(),服务器回调函数ServerCallback的伪代码如图3所示。
可以看到,ServerCallback()函数只处理了数据的接收,而发送数据时应调用SendCmd()函数,它可以根据指定的IP地址找到与这个采集端通信的工作者线程,然后让这个工作者线程去发送采集命令。
Clearup()函数在一次采集任务完成后进行必须的清理工作,包括与所有的采集端断开连接,终止所有的工作者线程并清空gClientList列表,最后调用UnregisterTCPServer函数以终止TCPServer。
图3 客户端ServerCallback()函数
3.2 采集端通信模块设计
采集端要在数据采集的同时与客户端通信,因此也要开启一个工作者线程负责与客户端的通信。采集端通信模块只为用户提供了3个外部接口,如表2所示。具体的通信过程都由通信模块的内部函数实现。
3.3 客户端与采集端的通信
客户端与采集端的实际通信过程如图4所示。采集端启动后把自己的机器注册为一个TCPServer。客户端在启动后先从数据
关键词:Lab Windows/CVI;远程测控;动态资源分配
中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)35-2138-03
Construction of a Dynamic Network Layer Based on Lab Windows/CVI
PENG Han, CAI Ying-chang
(Department of Computer Engineering, Xi'an Aerotechnical College, Xi'an 710077, China)
Abstract: DataSocket technique and NI network variable of Lab Windows/CVI can only allocate gatherresource statically. To resolve this problem, this paper designed and implements a dynamic network layer based on virtual instrument .The network layer made it possible for multi-client and multi-gather to communicate with each other, and the client can allocate and release gather resources dynamically.
Key words: lab windows/CVI; remote measurement; dynamic resources allocation
1 引言
随着计算机软硬件技术不断发展与提高,虚拟仪器技术已成为当前测控领域内的关键性技术。在远程测控与仿真方面,虚拟仪器网络化已被应用到测控技术中的各个领域。NI的DataSocket技术为底层通信协议提供了一致的API,编程人员无需为不同的数据格式和通信协议编写具体的程序代码。但DataSocket的缺陷是它对客户端和采集端(仪器设备)的资源配置是静态的,即客户端和采集端的连接必须在测控系统运行之前手工配置,客户端无法动态的申请和释放采集端的资源。虽然美国NI(National Instrument)公司在Lab Windows/CVI的最新版本用网络变量(Network Variable)代替了DataSocket,但还是没有改变这一静态特性。当多个客户端要求控制多个采集端资源进行数据采集,并要求在新的任务中重新申请新的资源时,DataSocket和网络变量就显得不够灵活,无法满足系统的需求。针对这一点,本文设计了一个能为多个客户提供动态申请和分配采集端资源的网络通信层,用Lab Windows/CVI的TCP库实现。对模块的使用者封装了底层的通信细节,用户只要调用本模块提供的外部接口即可。
2 设计思想
2.1 系统要求
根据用户的要求,本采集系统应具备动态的按需分配采集端资源的能力,可以有多个客户端,每个客户端可以申请若干数量的采集端资源进行数据采集,本次采集完毕后应该能释放采集端资源让其他的客户端使用。如果要重新开始一次新的采集任务,则应再次重复这个申请资源->使用资源->释放资源的过程。
2.2 系统的总体设计思想
依据软件设计的模块化的原则,我们忽略采集端的数据采集过程和客户端的数据分析、处理过程的细节,只考虑网络通信层的设计,根据用户要求,提出了如图1所示的总体设计思想。
图1中的采集端为嵌入式主机,而客户端为用户使用的PC。数据库服务器负责维护一个资源占用情况表,表中为每个采集端资源建立了一个记录项。记录项中有一个字段是资源占用位。初始时所有的资源都被标记为空闲,即表中每一项的资源占用为都为0(表示本资源空闲)。当一个用户开始一个数据采集任务时,客户端程序自动到数据库服务器中查询资源占用表,若找到足够的空闲资源,则把这些资源对应的记录项的资源占用位标记为1(表示本资源已被占用)。此后,客户端从数据库服务器获得这些可用资源的IP地址,并依次连接这些采集端,发送各种采集指令,采集端执行采集指令并返回结果。客户端完成一个采集任务后,断开与所有采集端的连接并将数据库服务器中相应的资源设置为空闲状态。
3 设计与实现
网络通信模块设计的难点并不在于客户端与采集端的通信,而在于一个客户端要同时给多个采集端发送命令,并同时接收多个采集端发回的响应数据。而采集端必须在完成一次采集任务后能被其他的客户端使用。基于此,设计和实现了客户端和采集端网络通信模块。
3.1 客户端通信模块设计
为了让客户端能同时和多个采集端同时通信,采用了多线程技术,让每个工作者线程负责与一个采集端的通信。在客户端通信模块中设计了一个ClientInfo数据结构,用来记录每个工作者线程的相关信息,如图2所示。
用一个CVI定义的列表结构ListType来存放所有工作者线程的信息:
Static ListType gClientList = 0;
只要和一个采集端建立的连接,就为它开启一个工作者线程,并把相关信息放入gClientList中;同样,完成采集任务后,与采集端断开连接并释放相应的工作者线程,然后从gClientList中删除相关信息。
客户端通信模块提供了5个外部接口供用户调用,如表1所示。
其中RegisterServer()函数封装了CVI的TCP库中的函数RegisterTCPServer(),服务器回调函数ServerCallback的伪代码如图3所示。
可以看到,ServerCallback()函数只处理了数据的接收,而发送数据时应调用SendCmd()函数,它可以根据指定的IP地址找到与这个采集端通信的工作者线程,然后让这个工作者线程去发送采集命令。
Clearup()函数在一次采集任务完成后进行必须的清理工作,包括与所有的采集端断开连接,终止所有的工作者线程并清空gClientList列表,最后调用UnregisterTCPServer函数以终止TCPServer。
图3 客户端ServerCallback()函数
3.2 采集端通信模块设计
采集端要在数据采集的同时与客户端通信,因此也要开启一个工作者线程负责与客户端的通信。采集端通信模块只为用户提供了3个外部接口,如表2所示。具体的通信过程都由通信模块的内部函数实现。
3.3 客户端与采集端的通信
客户端与采集端的实际通信过程如图4所示。采集端启动后把自己的机器注册为一个TCPServer。客户端在启动后先从数据