摘要:針對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。客戶端在啟動后先從數據
庫服務器獲得本次任務要用到的所有采集端的IP地址,然后把自己的機器注冊為一個TCPServer,并創建線程池和線程信息列表gClientList。之后客戶端先以TCPClient的身份向采集端發送一個連接請求,采集端的TCPServer受到TCP_CONNECT事件觸發,讀取并保存客戶端的IP地址,然后斷開這個連接,并開啟一個工作者線程。采集端的工作者線程一運行,就以TCPClient的身份向客戶端發送一個連接請求。客戶端的TCPServer受到TCP_CONNEC事件觸發,就為這個采集端建立一個工作者線程,專門負責與這個采集端的通信工作。
客戶端對所有的采集端都執行以上流程,在確認所有采集端都已連接后,就給數據庫服務器發送一個觸發命令,讓數據庫服務器通知這些采集端開始準備采集任務。數據庫服務器根據觸發命令中攜帶的目標信息,給相應的幾個采集端發送一個觸發脈沖。之后客戶端便可給每個采集端發送各種采集指令,采集端負責網絡通信的的工作者線程把這個指令放入一個指令緩沖區然后傳給主線程,主線程解析并執行這個采集指令,把采集的結果放入一個響應緩沖區并傳給工作者線程,工作者線程再通過TCP連接把響應數據發送給客戶端。客戶端的TCPServer可以根據響應到來的會話句柄判斷出是那個采集端發送的響應并據此讓對應的工作者線程去接收響應數據。
當一次采集任務完成后,客戶端TCPServer與所有采集端的TCPClient斷開TCP連接,并進行必須的清理工作,讓后便可以重新開始一次新的采集任務。而采集端的TCPClient受到TCP_DISCONNECT事件觸發,也停止采集端工作者線程,進行必須的清理。但是采集端的TCPServer一直是開啟的,這樣在一次任務完成后,另一個客戶端就可以隨時使用這個采集端。
4 結束語
直接使用Lab Windows/CVI提供的DataSocket和NI網絡變量固然可以簡化測試人員的編程工作,但也影響了網絡通信的靈活性。本文所設計和實現的網絡通信模塊被用于某測控項目,略微修改后也被用于多個客戶端和數據庫服務器的通信,體現了良好的通用性。
參考文獻:
[1] 王建新,楊世鳳.LabWindows/CVI測試技術及工程應用[M].北京:化學工業出版社,2006.
[2] 劉君華,白鵬,湯曉君,等.基于LabWindows/CVI的虛擬儀器設計[M].北京:電子工業出版社,2003.
[3] 李海,武小棟.LabWindows/CVI在半實物分布式仿真系統中的應用[J].電子技術應用,2005(4).
[4] 趙為松,趙維樹.基于Labwindows/CVI的氡室測控系統設計[J].核電子學與探測技術,2007(6).
[5] 王武.基于LabWindows/CVI的電器試驗用多參數測試系統的虛擬儀器平臺[J].電氣傳動自動化,2008(1).