周濤,李璐
(中航工業(yè)西安飛機(jī)工業(yè)(集團(tuán))有限責(zé)任公司 陜 西 西 安 7 10089)
飛行儀表是飛機(jī)性能參數(shù)和導(dǎo)航參數(shù)顯示的窗口,可為飛行員提供駕駛飛機(jī)所需的飛行參數(shù)、導(dǎo)航數(shù)據(jù)及飛機(jī)系統(tǒng)狀態(tài)等信息[1]。隨著航空電子綜合化的發(fā)展,現(xiàn)代民用飛機(jī)的座艙儀表系統(tǒng)已經(jīng)逐漸向電子飛行儀表系統(tǒng)(EFIS)過渡,以先進(jìn)的智能液晶顯示器取代原有的分離機(jī)電式儀表,提供給飛行員全新的人機(jī)界面,因此,對飛行員操作程序(POP)的評估也成為民用飛機(jī)頂層設(shè)計的重要環(huán)節(jié),以達(dá)到最佳的人機(jī)功效。為此,提供必要的仿真手段以驗證電子飛行儀表系統(tǒng)顯示和操作的合理性顯得尤為重要,以實現(xiàn)需求驗證和設(shè)計修改的快速、高效迭代,達(dá)到優(yōu)化設(shè)計過程、方便需求分析、降低開發(fā)成本的目的[1]。本文就某型民用飛機(jī)電子飛行儀表仿真系統(tǒng)提出設(shè)計思路和實現(xiàn)方法。
鑒于此仿真系統(tǒng)要經(jīng)歷多次的修改和迭代,以確定最終的顯示構(gòu)型方案,所以為保證系統(tǒng)具備足夠的靈活性和可擴(kuò)展性,采用模塊化設(shè)計,各個前臺顯示模塊和控制板仿真程序作為獨(dú)立應(yīng)用程序以WIN32平臺下的OpenGL進(jìn)行開發(fā),顯示構(gòu)型采用后臺文件進(jìn)行配置,以便于軟件調(diào)試和系統(tǒng)重構(gòu)。動態(tài)仿真利用飛行模擬軟件X-Plane進(jìn)行二次開發(fā),利用其中的飛機(jī)動態(tài)數(shù)據(jù)模型對座艙儀表和視景進(jìn)行驅(qū)動。靜態(tài)仿真采用Visual C++進(jìn)行開發(fā),用于設(shè)置靜態(tài)參數(shù),改變各應(yīng)用程序的工作狀態(tài)和顯示內(nèi)容,同時對動態(tài)參數(shù)進(jìn)行監(jiān)視,實現(xiàn)故障模擬、模式轉(zhuǎn)換、航路點設(shè)置、CAS告警仿真等特殊功能。數(shù)據(jù)網(wǎng)絡(luò)通訊采用TCP/IP協(xié)議的C/S架構(gòu),保證數(shù)據(jù)可靠有效的傳輸,其中服務(wù)器端作為數(shù)據(jù)中樞進(jìn)行系統(tǒng)數(shù)據(jù)的整體調(diào)度,各個客戶端應(yīng)用通過接口函數(shù)與其進(jìn)行通訊,實現(xiàn)數(shù)據(jù)的收發(fā)與控制,形成人在環(huán)路的閉環(huán)仿真系統(tǒng)。
圖1 系統(tǒng)軟件架構(gòu)Fig.1 System software infrastructure
系統(tǒng)軟件主要由以下幾個部分組成:
1)主飛行顯示器(PFD)模塊
分為全屏模式、半屏模式和壓縮模式,同時提供左右兩側(cè)主駕駛PFD和副駕駛PFD,完成姿態(tài)航向指示器(ADI)和水平位置指示器(HIS)等各項功能。
2)多功能顯示器(MFD)模塊
實現(xiàn)地圖、系統(tǒng)簡圖頁、調(diào)諧、電子檢查單、飛行管理系統(tǒng)、數(shù)據(jù)鏈路等多項功能。
3)發(fā)動機(jī)指示(EI)模塊
分為正常模式和應(yīng)急壓縮模式,完成發(fā)動機(jī)參數(shù)的顯示功能。
4)機(jī)組告警系統(tǒng)(CAS)模塊
分為正常模式和應(yīng)急壓縮模式,實現(xiàn)機(jī)組告警系統(tǒng)的各項功能。
5)飛行管理系統(tǒng)(FMS)模塊
實現(xiàn)飛行管理系統(tǒng)的初始化、飛行計劃設(shè)置、飛機(jī)性能管理等界面顯示功能。
6)系統(tǒng)簡圖頁模塊
實現(xiàn)電源系統(tǒng)、液壓系統(tǒng)、環(huán)控系統(tǒng)、飛控系統(tǒng)等系統(tǒng)參數(shù)信息的顯示功能。
7)中央操縱臺模塊
實現(xiàn)油門臺、多功能鍵盤(MKB)、光標(biāo)控制裝置(CCD)、襟翼控制、剎車控制等各項功能。
8)頂部控制板模塊
實現(xiàn)非航電系統(tǒng)與航電系統(tǒng)的交聯(lián)控制和顯示的各項功能。
9)其他儀表與控制板
實現(xiàn)航空時鐘和電子備用儀表以及與航電系統(tǒng)相關(guān)的顯示控制板(DCP)、自動飛行控制板(AFCP)等控制板。
10)動態(tài)仿真模塊
用于響應(yīng)外部控制面板、菜單等的輸入信號,產(chǎn)生動態(tài)飛行數(shù)據(jù)激勵其它的仿真模塊,同時產(chǎn)生動態(tài)的視景效果。動態(tài)仿真模塊為一個獨(dú)立應(yīng)用程序,基于X-Plane進(jìn)行開發(fā)。
11)靜態(tài)仿真模塊
靜態(tài)仿真軟件用于設(shè)置靜態(tài)參數(shù),改變各應(yīng)用程序的工作狀態(tài)和顯示內(nèi)容,同時對動態(tài)參數(shù)進(jìn)行監(jiān)視,實現(xiàn)故障模擬、模式轉(zhuǎn)換、航路點設(shè)置、CAS告警仿真等特殊功能。
12)網(wǎng)絡(luò)通信與管理模塊
網(wǎng)絡(luò)通信與管理模塊作為整個仿真系統(tǒng)的數(shù)據(jù)中樞,采用TCP/IP協(xié)議的C/S網(wǎng)絡(luò)構(gòu)架,實現(xiàn)各應(yīng)用程序之間的數(shù)據(jù)傳輸與維護(hù),網(wǎng)絡(luò)通信架構(gòu)如圖2所示。
圖2 網(wǎng)絡(luò)通信架構(gòu)Fig.2 Network communication infrastructure
系統(tǒng)整體硬件包括:綜合顯示仿真計算機(jī)兩臺、頂部控制板仿真計算機(jī)一臺、中央操縱臺仿真計算機(jī)一臺、主控服務(wù)器一臺、27寸觸摸顯示器五臺、32寸觸摸顯示器一臺、網(wǎng)絡(luò)交換機(jī)一臺、投影儀一臺。
各仿真計算機(jī)與服務(wù)器間采用以太網(wǎng)連接,采用C/S(客戶端/服務(wù)器)的星形連接方式。為了提高整個顯示系統(tǒng)的穩(wěn)定性和實時性,按照如下方式對顯示硬件進(jìn)行分配:顯示器#1和顯示器#2采用同一臺計算機(jī)進(jìn)行驅(qū)動,用于顯示主駕駛PFD、MFD、主警告燈,顯示控制面板、飛行指引控制面板、電子備用儀表以及起落架收放開關(guān)等;顯示器#3采用一臺計算機(jī)進(jìn)行驅(qū)動,用于顯示副駕駛PFD、MFD;顯示器#4采用一臺計算機(jī)進(jìn)行驅(qū)動,用于加載中央操作臺控制面板;顯示器#5和顯示器#6采用一臺計算機(jī)進(jìn)行驅(qū)動,用于加載頂部板控制面板。主控計算機(jī)采用一臺計算機(jī),用于協(xié)調(diào)實驗臺中各顯示系統(tǒng)之間的關(guān)系,管理儀表系統(tǒng)的邏輯數(shù)據(jù)庫,用戶可以通過主控計算機(jī)對仿真實驗臺進(jìn)行控制。主控計算機(jī)用于加載動態(tài)仿真數(shù)據(jù)源,輸出飛行視景。系統(tǒng)硬件架構(gòu)如圖3所示。
圖3 系統(tǒng)硬件架構(gòu)Fig.3 System hardware infrastructure
電子飛行儀表仿真系統(tǒng)按照自頂向下、模塊化思想開發(fā),以保證系統(tǒng)的靈活性和可擴(kuò)展性,以下為系統(tǒng)主要功能模塊的工程實現(xiàn)方法,其中系統(tǒng)開發(fā)流程如圖4所示。
圖4 系統(tǒng)開發(fā)流程圖Fig.4 System develop flow chart
各個儀表和控制板仿真模塊作為客戶端應(yīng)用,采用基于WIN32的OpenGL進(jìn)行開發(fā),通過服務(wù)器程序進(jìn)行數(shù)據(jù)交互,數(shù)據(jù)發(fā)送方式為數(shù)據(jù)包發(fā)送,數(shù)據(jù)包中的數(shù)據(jù)按照統(tǒng)一的結(jié)構(gòu)體格式進(jìn)行數(shù)據(jù)規(guī)范。數(shù)據(jù)包結(jié)構(gòu)為:
typedef struct
{
int id; //ID為數(shù)據(jù)標(biāo)號
int SDI; //SDI為數(shù)據(jù)源標(biāo)識
int SSM; //SSM為數(shù)據(jù)狀態(tài)指示
double data; //data為數(shù)據(jù)值
char str[NAME_LEN]; //str為字符串
}LABEL_Def;
所有數(shù)據(jù)發(fā)送和接收都以此結(jié)構(gòu)進(jìn)行解析。軟件流程如圖5所示。
動態(tài)仿真系統(tǒng)基于X-Plane10軟件進(jìn)行二次開發(fā),采用動態(tài)鏈接庫方式封裝成X-Plane的插件,利用X-Plane10中的通用飛機(jī)模型產(chǎn)生動態(tài)數(shù)據(jù),建立動態(tài)仿真與其他應(yīng)用程序之間的數(shù)據(jù)接口,通過服務(wù)器網(wǎng)絡(luò)通信模塊進(jìn)行數(shù)據(jù)傳輸。動態(tài)仿真應(yīng)用程序通過加載X-Plane可識別數(shù)據(jù)接口文件,使X-Plane輸出需要的數(shù)據(jù),同時可向X-Plane10寫入數(shù)據(jù)。
動態(tài)仿真所要加載的數(shù)據(jù)在數(shù)據(jù)文檔DataRef.txt中,其中包括了X-Plane動態(tài)數(shù)據(jù)編號、可識別的數(shù)據(jù)路徑地址、數(shù)據(jù)類型、數(shù)據(jù)讀寫類型、動態(tài)仿真輸出接口以及動態(tài)仿真輸入接口信息。動態(tài)仿真通過加載DataRef.txt數(shù)據(jù)文檔,加載所需產(chǎn)生的數(shù)據(jù)接口。用戶通過修改DataRef.txt中的內(nèi)容以增加和減少所需軟件接口,DataRef.txt接口文件格式如表1。
圖5 軟件流程圖Fig.5 Software flow chart
表1 動態(tài)仿真數(shù)據(jù)接口文件Tab.1 Dynamic simulation data interface document
通過XPanle提供的API對DataRef接口文件進(jìn)行解析,發(fā)送飛機(jī)模型產(chǎn)生的動態(tài)數(shù)據(jù),同時接收仿真控制板發(fā)送的控制指令參數(shù),其中用到的主要接口函數(shù)定義如下:
PLUGIN_API int XPluginStart(char* outName,char*outSig,char*outDesc) //進(jìn)程入口函數(shù)
{
char txtpath[60];
sprintf(txtpath,"%s",F(xiàn)LOAT_PATH);
SeperateTxt(FLOAT_PATH); //文本解析函數(shù)
for(int i=0;i { gFloatReadDataRef[i]=XPLMFindDataRef(FloatDataRef.DataRefReadDescriptions[i]); //將接口參數(shù)寫入緩沖區(qū) } //注冊飛行循環(huán)的回調(diào)函數(shù),周期為100 ms XPLMRegisterFlightLoopCallback (InputOutputLoopCB,0.1, NULL); return 1; } float InputOutputLoopCB (float elapsedMe, float elapsedSim, int counter, void*refcon)//回調(diào)函數(shù)定義 { for(int i=0;i { label.data=XPLMGetDataf(gFloatReadDataRef[i]); //將緩沖區(qū)中的數(shù)據(jù)寫入數(shù)據(jù)包 if(FloatDataRef.floatdata[i]!=(float)label.data) { FloatDataRef.floatdata[i]=(float)label.data; sprintf (buf, “% s”,F(xiàn)loatDataRef.NameDataReadID[i]); ClientUpdateParameter (hClient,F(xiàn)loatDataRef.NameDataReadID[i],&label); //通過服務(wù)器接口函數(shù)發(fā)送數(shù)據(jù)包 } } return (float) 0.1; } 數(shù)據(jù)通訊軟件按照開放式的軟件架構(gòu)要求,采用C/S通訊架構(gòu),使用TCP/IP協(xié)議進(jìn)行開發(fā)。數(shù)據(jù)通訊軟件分為服務(wù)器端與客戶端兩部分程序。服務(wù)器端程序獨(dú)立運(yùn)行,客戶端程序?qū)⒆远x的接口函數(shù)以靜態(tài)鏈接庫的形式進(jìn)行發(fā)布,供各個客服端程序調(diào)用以和服務(wù)器端程序進(jìn)行數(shù)據(jù)通訊,其中主要的接口函數(shù)和調(diào)用形式示例如下: int_tmain(int argc, _TCHAR*argv[]) { LPVOID hClient; int retval; LABEL_Def label; char server_ip_addr[NAME_LEN]; unsigned short port= (unsigned short) DEFAULT_PORT; strcpy_s (server_ip_addr,sizeof(server_ip_addr),SERVER_IP_ADDR); //將各個應(yīng)用模塊注冊為客戶端 hClient=ClientInit ( CLIENT_NAME, server_ip_addr,port); //發(fā)布待發(fā)送的參數(shù) retval=ClientPublishParameter( hClient, “a” ); //申請待接收的參數(shù) retval=ClientSubscribeParameter( hClient, “b”); memset( &label, 0, sizeof( LABEL_Def) ); int count=10000; //測試計數(shù)器 while( count) { count++; label.data=count; //更新發(fā)布的參數(shù)值 retval=ClientUpdateParameter( hClient, “a”, &label); //獲取申請的參數(shù)值 retval=ClientGetParameter( hClient, “b”, &label); Sleep( RESPONSE_DELAY ); } //退出 retval=ClientExit( hClient); return retval; } 為實現(xiàn)電子飛行儀表仿真系統(tǒng)各顯示模塊的可重構(gòu)性,程序通過后臺配置文件進(jìn)行統(tǒng)一啟動,各個模塊的顯示位置通過配置文件進(jìn)行設(shè)置,如果顯示需求發(fā)生變更,只需修改配置文件即可,源代碼無需更改,提高了系統(tǒng)的可維護(hù)性。具體實現(xiàn)過程如下: 1)解析配置文件 利用C++標(biāo)準(zhǔn)模板庫的字符串類對配置文件進(jìn)行解析,獲取應(yīng)用程序名和位置信息。 2)批處理啟動應(yīng)用模塊 利用WINDOWS API函數(shù) ShellExecute并通過傳入的參數(shù)對配置文件中的應(yīng)用模塊進(jìn)行統(tǒng)一啟動。 3)顯示和部署應(yīng)用模塊 通過應(yīng)用模塊的入口主函數(shù)傳入的命令行參數(shù),進(jìn)行字符串解析,將獲取的位置參數(shù)傳入WINDOWS API函數(shù)SetWindowPos進(jìn)行各應(yīng)用模塊的顯示和部署。 文中對民用飛機(jī)電子飛行儀表仿真系統(tǒng)提出設(shè)計思路和實現(xiàn)方法,并成功應(yīng)用在某型民用飛機(jī)的概念設(shè)計階段,對飛行員操作程序(POP)的評估取得良好的效果,并對后續(xù)電子飛行儀表系統(tǒng)顯示方案的制定提供了有效的驗證手段。 [1]夏煒,孫曉敏,郤文清.基于VAPS的電子飛行儀表系統(tǒng)顯示設(shè)計[J].航空電子技術(shù),2009,40(3):15-18.XIA Wei,SUN Xiao-min,XI Wen-qing.Design of electronic flight instrument system display based on VAPS[J].Avionics Technology,2009,40(3):15-18. [2]王行仁.飛行實時仿真系統(tǒng)及技術(shù)[M].北京:北京航空航天大學(xué)出版社,1998. [3]任泰明.TCP/IP網(wǎng)絡(luò)編程[M].北京:人民郵電出版社,2009. [4]施瑞奈爾.OpenGL編程指南[M].7版.李軍,譯.北京:機(jī)械工業(yè)出版社,2010. [5]李普曼,拉茹瓦,穆.C++Primer中文版[M].4版.李師賢,譯.北京:人民郵電出版社,2006. [6]佩措爾德.Windows程序設(shè)計(珍藏版)[M].方敏,張勝,梁路平,趙勇,等譯.北京:清華大學(xué)出版社,2010.2.3 數(shù)據(jù)通訊模塊
2.4 模塊調(diào)度策略
3 結(jié)束語