茹 芬,侯中峰,謝利理
(西北工業大學自動化學院,西安 710129)
現代飛艇多利用氦氣產生升力來進行浮空飛行,其優良的性價比及高可靠性,近年來已經成為國際上的研究熱點,我國也正在積極研制數十萬立方的平流層飛艇。作為其研究的一部分,低空實驗飛艇(在500米以下飛行)是未來研制平流層飛艇的重要準備。隨著高度的增加,大氣壓力的變化,為了保持良好的浮空姿態,飛艇會有比較復雜的自身壓力調節。以某低空實驗飛艇項目為背景,設計并實現了其地面監控系統軟件。
飛艇一般由艇上飛行控制系統、通訊導航系統、任務載荷系統、能源動力系統、氣壓調節系統、應急降落系統及地而監控系統等部分組成,可以在預定空域巡航飛行來完成空中巡查、航空拍攝、環境監測、通訊中繼、廣告宣傳等任務。艇載計算機是艇上部分的核心,負責完成控制處理和數據通信等任務。而地面監控系統以地面計算機為核心,其作用是實時監測并記錄飛艇的飛行狀態、環境信息及任務設備數據,及時準確地向飛艇下達控制指令等。地面操作人員既可以通過操縱桿手動遙控飛艇飛行,也可以通過地面監控軟件界面發出控制指令控制飛艇飛行[1]。整個飛艇控制系統的基本組成部分如圖1所示。
考慮到飛艇地面監控軟件開發的效率及友好、美觀的人機交互界面,軟件的設計以美國NI(National Instruments)公司的虛擬儀器開發工具LabWindows/CVI[2]為平臺。軟件設計主要解決四個問題:①地面計算機與艇上計算機之間的實時數據交換;②操縱桿對飛艇飛行姿態的遠程控制;③設計地面監控數據庫,對艇上計算機下傳數據進行存儲、查詢及過程回放等;④友好的人機交互接口。由于LabWindows/CVI集成了眾多優秀的虛擬儀器控件,給軟件的界面設計帶來了極大的方便。當LabWindows/CVI提供的標準虛擬儀器控件不能滿足需要時,可以使用VC++等其他工具開發專用的ActiveX控件,然后在實際工程中加載調用。

圖1 低空飛艇控制系統組成圖
在飛艇執行飛行任務的過程中,需要與地面進行大量實時的數據交換。這些數據包括地面上傳控制指令、艇上下傳各種狀態參數和任務設備采集的數據等。穩定可靠的通訊是飛艇安全正常飛行的重要保證。選用全雙工數字電臺,可以實現30~50公里范圍內的點對多點通信,通訊距離長;全雙工數字電臺具備先進的擴頻跳頻技術,抗干擾能力強,穩定可靠,提供最大115.2Kbps的 RS232串口傳輸速率。
地面監控計算機與數字電臺通過RS232串口進行通信。LabWindows/CVI提供了RS232通信函數庫,使原本較為復雜的RS232通信變得容易實現。這些函數可分為打開/關閉串口函數、串口設置函數、I/O讀寫函數、調制解調器控制函數、寄存器狀態函數和回調函數等6類。
由于LabWindows/CVI并不提供串口中斷處理函數,LabWindows/CVI中串口通信是通過周期查詢方式實現的。可以設置一個定時器,定期執行讀取串口的程序,也可以設置一個死循環,通過延遲設置循環周期,這樣必須在循環內部定義一個能夠及時響應用戶面板回調函數和系統內部事件的函數。串口編程需要以下幾個函數:
OpenCom(COM1);//打開串口1
OpenComConfig(COM1,"COM1",9600,2,8,1,512,512);//配置串口 COM1
ComRdByte(COM1);//讀串口1數據
ComRd(COM1,Inbuf,100);//從串口1 的緩沖區Inbuf中讀取100個字節的數據
ComWrtByte(COM1);//向串口1寫數據
ComWrt(COM1,Outbuf,100);//向串口 1 的緩沖區Outbuf中寫入100個字節的數據
CloseCom(COM1);//關閉串口1
飛艇的地面遙控采用性能優越的USB接口操縱桿SAITEK X52,利用操縱桿上的搖桿、方向舵及按鈕,用以實現飛艇的俯仰、偏航等姿態的調節,對油門和各種風機的開關直接控制。在LabWindows/CVI環境下,利用微軟提供的 DirectX與Windows API函數相結合,通過設置定時器,利用消息傳遞方式來捕獲操縱桿的信息。在MMSYSTEM.H對所需的Windows API函數進行函數聲明,應用程序必須包含該頭文件。
程序首先需要檢查操縱桿是否存在,包括檢查驅動程序支持和確認操縱桿已與系統相連等兩項工作。調用joyGetNumDevs函數檢查系統是否配置了操縱端口和驅動程序。如果返回值為0,表明系統不支持操縱桿功能。但joyGetNumDevs并不能確定操縱桿是否已被連接上了,通過調用joyGetPosEx函數可以完成檢查是否連接上操縱桿,同時確定是否有錯誤發生。一旦確認了操縱桿已連上,就可以接收操縱桿發來的消息。joySetCapture通知Windows操縱桿消息應發往何處以及發送的頻率等。joySet-Capture中的第一個參數通知Windows誰將獲取消息,第二個參數確定程序將從哪個操縱桿接收消息,第三個參數表示希望以怎樣的頻度接收消息(單位為毫秒),無論操縱桿是否移動都將以這個頻度接收消息。joySetCapture的四個參數允許程序當操縱桿移動一定的距離后才接收消息,該距離由joySetThreshold設置。
joySetCapture被調用后,窗口將接收操縱桿事件。MM_JOY1MOVE事件在joySetCapture定義的時間間隔內發生。只有當操縱桿的按鈕被按下時,MM_JOY1BUTTONUP和MM_JOY1BUTTONDOWN事件才發生。調用joyReleaseCapture通知Windows已結束對操縱桿的調用。部分程序段如下:
/*hwnd-接收消息的窗口句柄,uMsg-消息(命令),wParam和lParam是要傳遞的數據*/
LRESULT NewWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
JOYINFOEX JoyInfoEx;//包含操縱桿各種屬性的結構體
unsigned int uJoyID;//操縱桿編號
switch(uMsg)
{
case MM_JOY1MOVE:
JoyInfoEx.dwFlags=JOY_CAL_READ3;
JoyInfoEx.dwSize=sizeof(JoyInfoEx);
JoyGetPosEx(uJoyID,&JoyInfoEx);
break;
case MM_JOY1BUTTONDOWN:
JoyInfoEx.dwFlags=
JOY_RETURNBUTTONS;
JoyInfoEx.dwSize=sizeof(JoyInfoEx);
JoyGetPosEx(uJoyID,&JoyInfoEx);
if(JoyInfoEx.dwButtons& JOY_BUTTON1)MessagePopup("ok","按鈕1按下");
break;
}
return CallWindowProc(oldWndProc, hwnd,uMsg,wParam,lParam);
}
LabWindows/CVI既沒有通過標準函數庫來提供對數據庫進行訪問操作的函數,也沒有在工具包中包含數據庫引擎。要在LabWindows/CVI環境下使用數據庫,必須安裝 CVI SQL工具包[3-4]。該工具包中一共包含了11個子類的函數庫,這些API(Application Programming Interface)使LabWindows/CVI編寫的上層應用程序可以實現對數據庫的訪問。雖然LabWindows/CVI中通過Microsoft的ADO(Active Data Object,動態數據對象)接口可以支持多種類型的數據源,但最常用的還是ODBC(Open Database Connectivity,開放數據庫互連)數據源。ODBC實際上是一個函數庫,它提供了一個連接到底層數據庫系統的公共應用程序接口,通過驅動程序與底層數據庫進行通信。在開發數據庫應用程序時,只需要為應用程序指定一個數據源,將數據源文件配置成已創建好的數據庫文件(包括已經創建好的數據表等),即可以在 LabWindows/CVI中利用SQL語句訪問由第三方工具開發的數據庫。
3.3.1 數據庫的連接與斷開
使用DBConnect打開一個新數據連接,其唯一的參數是必須包含數據源或數據提供者名以及其他數據庫需要的屬性(User ID、Password、File Name等)的字符串。使用完畢調用DBDisconnect關閉連接。
int hdbc=0;//數據庫連接句柄
hdbc=DBConnect("DSN=DB_Airship");//連接到數據源DB_Airship
DBDisconnect(hdbc);//斷開數據庫連接
3.3.2 自動 SQL映射
使用SQL庫映射函數自動產生和執行SQL語句。通過調用DBBeginMap定義一個映射,其唯一的參數是來自DBConnect的連接句柄,而返回值作為映射的句柄。
int hmap=DBBeginMap(hdbc);//定義SQL連接句柄
/* 將字段映射到數組或變量*/
DBMapColumnToChar(hmap,1,11,uutNum,&uutStat,"");
DBMapColumnToDouble(hmap,2, &meas1,&meas1Stat);
DBMapColumnToDouble(hmap,3, &meas2,&meas2Stat);
DBActivateMap(hmap,"Table1");//程序映射所有的列后激活映射
DBDeactivateMap(hmap);//結束激活映射
3.3.3 數據庫操作
顯式SQL語句的執行如下:
hstmt=DBActivateSQL(hdbc,"SELECT UUT_NUM,MEAS1,MEAS2 FROM TESTRES WHERE MEAS2 >1.0");
除了SELECT外的大多數SQL語句不需要進一步的處理,可以使用DBImmediateSQL。
插入數據:
DBImmediateSQL(hdbc,"INSERT INTO Table1 VALUES('2860B456',0.4,0.6)");
更新數據:
DBActivateSQL(hdbc,"UPDATE Table1 SET MEAS2=500.0 WHERE UUT_NUM= '2860B456'");
刪除數據:
DBImmediateSQL (hdbc,"DELETE FROM Table1 WHERE UUT_NUM= '2860B567 '");
3.3.4 取回結果
采用NUMERIC控件和STRING控件來顯示數據,部分程序段如下:
while(DBFetchNext(hstmt)==DB_SUCCESS){
SetCtrlVal(panelHandle,PANEL_uutNum,uut-Num);
SetCtrlVal(panelHandle, PANEL_meas1,meas1);
SetCtrlVal(panelHandle, PANEL_meas2,meas2);}
地面監控系統是飛艇控制系統重要的組成部分。完整地給出了在LabWindows/CVI環境下地面監控系統基本功能的設計與實現方法,完成了底層通信程序的設計,并通過調用Windows API函數實現了對操縱桿的編程,最后詳細給出了在LabWindows/CVI環境下數據庫的開發過程。地面監控軟件經過運行表明該系統運行穩定,功能完備實用,開發周期短,成本低,維護方便,具有較高的工程應用價值。
[1]于歌,劉剛,房建成.小型無人機地面監控系統軟件設計與實現[J].機械與電子,2007(7):24-26.
[2]NI.LabWindows/CVI User Manual[M].National instruments corporation,2002.
[3]NI.LabWindows/CVI SQL Toolkit Reference Manual[M].National instruments corporation,2002.
[4]高水德,辛喆,水林娜.基于LabWindows/CVI的發動機試驗數據庫的設計與實現[J].微計算機信息(測控自動化),2004,20(4):33-34.