茹 芬,侯中峰,謝利理
(西北工業(yè)大學(xué)自動(dòng)化學(xué)院,西安 710129)
現(xiàn)代飛艇多利用氦氣產(chǎn)生升力來進(jìn)行浮空飛行,其優(yōu)良的性價(jià)比及高可靠性,近年來已經(jīng)成為國際上的研究熱點(diǎn),我國也正在積極研制數(shù)十萬立方的平流層飛艇。作為其研究的一部分,低空實(shí)驗(yàn)飛艇(在500米以下飛行)是未來研制平流層飛艇的重要準(zhǔn)備。隨著高度的增加,大氣壓力的變化,為了保持良好的浮空姿態(tài),飛艇會(huì)有比較復(fù)雜的自身壓力調(diào)節(jié)。以某低空實(shí)驗(yàn)飛艇項(xiàng)目為背景,設(shè)計(jì)并實(shí)現(xiàn)了其地面監(jiān)控系統(tǒng)軟件。
飛艇一般由艇上飛行控制系統(tǒng)、通訊導(dǎo)航系統(tǒng)、任務(wù)載荷系統(tǒng)、能源動(dòng)力系統(tǒng)、氣壓調(diào)節(jié)系統(tǒng)、應(yīng)急降落系統(tǒng)及地而監(jiān)控系統(tǒng)等部分組成,可以在預(yù)定空域巡航飛行來完成空中巡查、航空拍攝、環(huán)境監(jiān)測(cè)、通訊中繼、廣告宣傳等任務(wù)。艇載計(jì)算機(jī)是艇上部分的核心,負(fù)責(zé)完成控制處理和數(shù)據(jù)通信等任務(wù)。而地面監(jiān)控系統(tǒng)以地面計(jì)算機(jī)為核心,其作用是實(shí)時(shí)監(jiān)測(cè)并記錄飛艇的飛行狀態(tài)、環(huán)境信息及任務(wù)設(shè)備數(shù)據(jù),及時(shí)準(zhǔn)確地向飛艇下達(dá)控制指令等。地面操作人員既可以通過操縱桿手動(dòng)遙控飛艇飛行,也可以通過地面監(jiān)控軟件界面發(fā)出控制指令控制飛艇飛行[1]。整個(gè)飛艇控制系統(tǒng)的基本組成部分如圖1所示。
考慮到飛艇地面監(jiān)控軟件開發(fā)的效率及友好、美觀的人機(jī)交互界面,軟件的設(shè)計(jì)以美國NI(National Instruments)公司的虛擬儀器開發(fā)工具LabWindows/CVI[2]為平臺(tái)。軟件設(shè)計(jì)主要解決四個(gè)問題:①地面計(jì)算機(jī)與艇上計(jì)算機(jī)之間的實(shí)時(shí)數(shù)據(jù)交換;②操縱桿對(duì)飛艇飛行姿態(tài)的遠(yuǎn)程控制;③設(shè)計(jì)地面監(jiān)控?cái)?shù)據(jù)庫,對(duì)艇上計(jì)算機(jī)下傳數(shù)據(jù)進(jìn)行存儲(chǔ)、查詢及過程回放等;④友好的人機(jī)交互接口。由于LabWindows/CVI集成了眾多優(yōu)秀的虛擬儀器控件,給軟件的界面設(shè)計(jì)帶來了極大的方便。當(dāng)LabWindows/CVI提供的標(biāo)準(zhǔn)虛擬儀器控件不能滿足需要時(shí),可以使用VC++等其他工具開發(fā)專用的ActiveX控件,然后在實(shí)際工程中加載調(diào)用。
圖1 低空飛艇控制系統(tǒng)組成圖
在飛艇執(zhí)行飛行任務(wù)的過程中,需要與地面進(jìn)行大量實(shí)時(shí)的數(shù)據(jù)交換。這些數(shù)據(jù)包括地面上傳控制指令、艇上下傳各種狀態(tài)參數(shù)和任務(wù)設(shè)備采集的數(shù)據(jù)等。穩(wěn)定可靠的通訊是飛艇安全正常飛行的重要保證。選用全雙工數(shù)字電臺(tái),可以實(shí)現(xiàn)30~50公里范圍內(nèi)的點(diǎn)對(duì)多點(diǎn)通信,通訊距離長(zhǎng);全雙工數(shù)字電臺(tái)具備先進(jìn)的擴(kuò)頻跳頻技術(shù),抗干擾能力強(qiáng),穩(wěn)定可靠,提供最大115.2Kbps的 RS232串口傳輸速率。
地面監(jiān)控計(jì)算機(jī)與數(shù)字電臺(tái)通過RS232串口進(jìn)行通信。LabWindows/CVI提供了RS232通信函數(shù)庫,使原本較為復(fù)雜的RS232通信變得容易實(shí)現(xiàn)。這些函數(shù)可分為打開/關(guān)閉串口函數(shù)、串口設(shè)置函數(shù)、I/O讀寫函數(shù)、調(diào)制解調(diào)器控制函數(shù)、寄存器狀態(tài)函數(shù)和回調(diào)函數(shù)等6類。
由于LabWindows/CVI并不提供串口中斷處理函數(shù),LabWindows/CVI中串口通信是通過周期查詢方式實(shí)現(xiàn)的??梢栽O(shè)置一個(gè)定時(shí)器,定期執(zhí)行讀取串口的程序,也可以設(shè)置一個(gè)死循環(huán),通過延遲設(shè)置循環(huán)周期,這樣必須在循環(huán)內(nèi)部定義一個(gè)能夠及時(shí)響應(yīng)用戶面板回調(diào)函數(shù)和系統(tǒng)內(nèi)部事件的函數(shù)。串口編程需要以下幾個(gè)函數(shù):
OpenCom(COM1);//打開串口1
OpenComConfig(COM1,"COM1",9600,2,8,1,512,512);//配置串口 COM1
ComRdByte(COM1);//讀串口1數(shù)據(jù)
ComRd(COM1,Inbuf,100);//從串口1 的緩沖區(qū)Inbuf中讀取100個(gè)字節(jié)的數(shù)據(jù)
ComWrtByte(COM1);//向串口1寫數(shù)據(jù)
ComWrt(COM1,Outbuf,100);//向串口 1 的緩沖區(qū)Outbuf中寫入100個(gè)字節(jié)的數(shù)據(jù)
CloseCom(COM1);//關(guān)閉串口1
飛艇的地面遙控采用性能優(yōu)越的USB接口操縱桿SAITEK X52,利用操縱桿上的搖桿、方向舵及按鈕,用以實(shí)現(xiàn)飛艇的俯仰、偏航等姿態(tài)的調(diào)節(jié),對(duì)油門和各種風(fēng)機(jī)的開關(guān)直接控制。在LabWindows/CVI環(huán)境下,利用微軟提供的 DirectX與Windows API函數(shù)相結(jié)合,通過設(shè)置定時(shí)器,利用消息傳遞方式來捕獲操縱桿的信息。在MMSYSTEM.H對(duì)所需的Windows API函數(shù)進(jìn)行函數(shù)聲明,應(yīng)用程序必須包含該頭文件。
程序首先需要檢查操縱桿是否存在,包括檢查驅(qū)動(dòng)程序支持和確認(rèn)操縱桿已與系統(tǒng)相連等兩項(xiàng)工作。調(diào)用joyGetNumDevs函數(shù)檢查系統(tǒng)是否配置了操縱端口和驅(qū)動(dòng)程序。如果返回值為0,表明系統(tǒng)不支持操縱桿功能。但joyGetNumDevs并不能確定操縱桿是否已被連接上了,通過調(diào)用joyGetPosEx函數(shù)可以完成檢查是否連接上操縱桿,同時(shí)確定是否有錯(cuò)誤發(fā)生。一旦確認(rèn)了操縱桿已連上,就可以接收操縱桿發(fā)來的消息。joySetCapture通知Windows操縱桿消息應(yīng)發(fā)往何處以及發(fā)送的頻率等。joySet-Capture中的第一個(gè)參數(shù)通知Windows誰將獲取消息,第二個(gè)參數(shù)確定程序?qū)哪膫€(gè)操縱桿接收消息,第三個(gè)參數(shù)表示希望以怎樣的頻度接收消息(單位為毫秒),無論操縱桿是否移動(dòng)都將以這個(gè)頻度接收消息。joySetCapture的四個(gè)參數(shù)允許程序當(dāng)操縱桿移動(dòng)一定的距離后才接收消息,該距離由joySetThreshold設(shè)置。
joySetCapture被調(diào)用后,窗口將接收操縱桿事件。MM_JOY1MOVE事件在joySetCapture定義的時(shí)間間隔內(nèi)發(fā)生。只有當(dāng)操縱桿的按鈕被按下時(shí),MM_JOY1BUTTONUP和MM_JOY1BUTTONDOWN事件才發(fā)生。調(diào)用joyReleaseCapture通知Windows已結(jié)束對(duì)操縱桿的調(diào)用。部分程序段如下:
/*hwnd-接收消息的窗口句柄,uMsg-消息(命令),wParam和lParam是要傳遞的數(shù)據(jù)*/
LRESULT NewWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
JOYINFOEX JoyInfoEx;//包含操縱桿各種屬性的結(jié)構(gòu)體
unsigned int uJoyID;//操縱桿編號(hào)
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既沒有通過標(biāo)準(zhǔn)函數(shù)庫來提供對(duì)數(shù)據(jù)庫進(jìn)行訪問操作的函數(shù),也沒有在工具包中包含數(shù)據(jù)庫引擎。要在LabWindows/CVI環(huán)境下使用數(shù)據(jù)庫,必須安裝 CVI SQL工具包[3-4]。該工具包中一共包含了11個(gè)子類的函數(shù)庫,這些API(Application Programming Interface)使LabWindows/CVI編寫的上層應(yīng)用程序可以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的訪問。雖然LabWindows/CVI中通過Microsoft的ADO(Active Data Object,動(dòng)態(tài)數(shù)據(jù)對(duì)象)接口可以支持多種類型的數(shù)據(jù)源,但最常用的還是ODBC(Open Database Connectivity,開放數(shù)據(jù)庫互連)數(shù)據(jù)源。ODBC實(shí)際上是一個(gè)函數(shù)庫,它提供了一個(gè)連接到底層數(shù)據(jù)庫系統(tǒng)的公共應(yīng)用程序接口,通過驅(qū)動(dòng)程序與底層數(shù)據(jù)庫進(jìn)行通信。在開發(fā)數(shù)據(jù)庫應(yīng)用程序時(shí),只需要為應(yīng)用程序指定一個(gè)數(shù)據(jù)源,將數(shù)據(jù)源文件配置成已創(chuàng)建好的數(shù)據(jù)庫文件(包括已經(jīng)創(chuàng)建好的數(shù)據(jù)表等),即可以在 LabWindows/CVI中利用SQL語句訪問由第三方工具開發(fā)的數(shù)據(jù)庫。
3.3.1 數(shù)據(jù)庫的連接與斷開
使用DBConnect打開一個(gè)新數(shù)據(jù)連接,其唯一的參數(shù)是必須包含數(shù)據(jù)源或數(shù)據(jù)提供者名以及其他數(shù)據(jù)庫需要的屬性(User ID、Password、File Name等)的字符串。使用完畢調(diào)用DBDisconnect關(guān)閉連接。
int hdbc=0;//數(shù)據(jù)庫連接句柄
hdbc=DBConnect("DSN=DB_Airship");//連接到數(shù)據(jù)源DB_Airship
DBDisconnect(hdbc);//斷開數(shù)據(jù)庫連接
3.3.2 自動(dòng) SQL映射
使用SQL庫映射函數(shù)自動(dòng)產(chǎn)生和執(zhí)行SQL語句。通過調(diào)用DBBeginMap定義一個(gè)映射,其唯一的參數(shù)是來自DBConnect的連接句柄,而返回值作為映射的句柄。
int hmap=DBBeginMap(hdbc);//定義SQL連接句柄
/* 將字段映射到數(shù)組或變量*/
DBMapColumnToChar(hmap,1,11,uutNum,&uutStat,"");
DBMapColumnToDouble(hmap,2, &meas1,&meas1Stat);
DBMapColumnToDouble(hmap,3, &meas2,&meas2Stat);
DBActivateMap(hmap,"Table1");//程序映射所有的列后激活映射
DBDeactivateMap(hmap);//結(jié)束激活映射
3.3.3 數(shù)據(jù)庫操作
顯式SQL語句的執(zhí)行如下:
hstmt=DBActivateSQL(hdbc,"SELECT UUT_NUM,MEAS1,MEAS2 FROM TESTRES WHERE MEAS2 >1.0");
除了SELECT外的大多數(shù)SQL語句不需要進(jìn)一步的處理,可以使用DBImmediateSQL。
插入數(shù)據(jù):
DBImmediateSQL(hdbc,"INSERT INTO Table1 VALUES('2860B456',0.4,0.6)");
更新數(shù)據(jù):
DBActivateSQL(hdbc,"UPDATE Table1 SET MEAS2=500.0 WHERE UUT_NUM= '2860B456'");
刪除數(shù)據(jù):
DBImmediateSQL (hdbc,"DELETE FROM Table1 WHERE UUT_NUM= '2860B567 '");
3.3.4 取回結(jié)果
采用NUMERIC控件和STRING控件來顯示數(shù)據(jù),部分程序段如下:
while(DBFetchNext(hstmt)==DB_SUCCESS){
SetCtrlVal(panelHandle,PANEL_uutNum,uut-Num);
SetCtrlVal(panelHandle, PANEL_meas1,meas1);
SetCtrlVal(panelHandle, PANEL_meas2,meas2);}
地面監(jiān)控系統(tǒng)是飛艇控制系統(tǒng)重要的組成部分。完整地給出了在LabWindows/CVI環(huán)境下地面監(jiān)控系統(tǒng)基本功能的設(shè)計(jì)與實(shí)現(xiàn)方法,完成了底層通信程序的設(shè)計(jì),并通過調(diào)用Windows API函數(shù)實(shí)現(xiàn)了對(duì)操縱桿的編程,最后詳細(xì)給出了在LabWindows/CVI環(huán)境下數(shù)據(jù)庫的開發(fā)過程。地面監(jiān)控軟件經(jīng)過運(yùn)行表明該系統(tǒng)運(yùn)行穩(wěn)定,功能完備實(shí)用,開發(fā)周期短,成本低,維護(hù)方便,具有較高的工程應(yīng)用價(jià)值。
[1]于歌,劉剛,房建成.小型無人機(jī)地面監(jiān)控系統(tǒng)軟件設(shè)計(jì)與實(shí)現(xiàn)[J].機(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的發(fā)動(dòng)機(jī)試驗(yàn)數(shù)據(jù)庫的設(shè)計(jì)與實(shí)現(xiàn)[J].微計(jì)算機(jī)信息(測(cè)控自動(dòng)化),2004,20(4):33-34.