余正風(fēng) 張燕平 秦正運(yùn)
(中國直升機(jī)設(shè)計(jì)研究所 江西省景德鎮(zhèn)市 333000)
在如今航空技術(shù)突飛猛進(jìn)的發(fā)展下,航空電子系統(tǒng)愈加復(fù)雜,綜合顯示控制系統(tǒng)的多功能顯示器作為顯示儀表的迭代品,不僅需要實(shí)時(shí)給飛行員提供導(dǎo)航、飛行參數(shù)和其他關(guān)鍵信息的顯示,還需要將復(fù)雜的飛行信息用規(guī)范的可視化圖表集成顯示,有助于飛行員在人機(jī)交互中快速獲取信息,從而有效的操縱整個(gè)系統(tǒng)。
VAPS 作為常用于航空飛行器顯示端輔助開發(fā)的圖形界面設(shè)計(jì)工具,通過強(qiáng)大的GUI 編輯器對(duì)需設(shè)計(jì)的顯示圖符進(jìn)行建模作為一個(gè)個(gè)控件,形成圖符庫;然后根據(jù)具體需求配置圖符控件的屬性,添加相應(yīng)的邏輯,從而組建出完整的畫面。但在使用過程中,因?yàn)閷?duì)顯示要求的不斷提升,基礎(chǔ)圖符控件已然捉襟見肘,需要通過增加代碼控制的方式對(duì)基礎(chǔ)圖符進(jìn)行二次開發(fā),使圖符控件的功能滿足設(shè)計(jì)的顯示需求,也使圖符庫使用起來更加高效、便捷,減少開發(fā)工作量。
VAPS XT 是由加拿大Presagis 公司研發(fā)的一款圖形界面設(shè)計(jì)工具,廣泛應(yīng)用于航空、車輛儀表等高性能電子設(shè)備應(yīng)用的設(shè)計(jì)開發(fā)。VAPS XT 擁有良好的圖形用戶界面,用戶可以利用工具提供的控件以及設(shè)定行為來快速設(shè)計(jì)儀器儀表圖形,且提供了自定義控件的能力,具有便捷、靈活、可視化等優(yōu)點(diǎn);并且VAPS XT 支持UDP、TCP、共享內(nèi)存等數(shù)據(jù)通道機(jī)制與外界進(jìn)行數(shù)據(jù)交互。在設(shè)計(jì)結(jié)束后,可通過代碼生成器將設(shè)計(jì)的圖形轉(zhuǎn)換成C++代碼,無需改動(dòng)即可以應(yīng)用到不同平臺(tái)上去。VAPS 已經(jīng)在F-22、NH90 等機(jī)型以及國內(nèi)多型號(hào)直升機(jī)的座艙顯示設(shè)備中應(yīng)用。
如圖1 所示,機(jī)載顯控軟件分為用戶系統(tǒng)(User Application, UA)和座艙顯示系統(tǒng)(Cockpit Display System,CDS),UA 作為控制端,用于控制畫面顯示,接收CDS 反饋的人機(jī)交互指令,CDS 作為顯示終端,接收來自UA 包括畫面ID、圖符驅(qū)動(dòng)數(shù)據(jù)等信息,二者通過總線或共享內(nèi)存的方式進(jìn)行交互。其中CDS 分為數(shù)據(jù)通訊和畫面顯示兩部分,數(shù)據(jù)通訊負(fù)責(zé)數(shù)據(jù)收發(fā)和處理,VAPS 主要用于畫面顯示部分的開發(fā),并且采用nCOM 交互數(shù)據(jù),在使用時(shí)通過構(gòu)建數(shù)據(jù)描述文件(Data Description File, DD)將接收的通訊數(shù)據(jù)按照VAPS 規(guī)定的使用格式進(jìn)行處理,從而在VAPS 工程中關(guān)聯(lián)畫面數(shù)據(jù)來驅(qū)動(dòng)畫面的動(dòng)態(tài)顯示。
圖1: 機(jī)載顯控軟件架構(gòu)
VAPS 進(jìn)行畫面開發(fā)分為3 個(gè)步驟。
2.1.1 構(gòu)建圖形符號(hào)形成圖形符號(hào)庫
使用VAPS 中包含的圖形、字符、儀表、數(shù)據(jù)和計(jì)算控件進(jìn)行HMI 的圖形化開發(fā),將這些基本圖元部件按需求組合,通過建立圖形符號(hào)對(duì)象的輸入輸出,關(guān)聯(lián)內(nèi)部控制邏輯,形成更復(fù)雜的圖形符號(hào);設(shè)計(jì)好的圖形符號(hào)保存在圖形符號(hào)庫內(nèi),為畫面顯示的開發(fā)實(shí)現(xiàn)提供支持,使構(gòu)成的整個(gè)畫面更加規(guī)范。
2.1.2 實(shí)現(xiàn)畫面布局和內(nèi)部邏輯
在VAPS XT 中新建一個(gè)Format 對(duì)象,根據(jù)設(shè)計(jì)需求,從圖形符號(hào)庫選取合適的圖形符號(hào),合理對(duì)圖形符號(hào)分配位置和配置屬性,完成整個(gè)畫面布局,通過數(shù)據(jù)流(Data Flow)中使用數(shù)值比較、邏輯判斷等VAPS 提供的語句,對(duì)各個(gè)圖符的輸入輸出數(shù)據(jù)進(jìn)行處理,實(shí)現(xiàn)畫面中圖符的狀態(tài)控制。
2.1.3 通信數(shù)據(jù)的I/O 處理
由于UA 端和CDS 端的硬件或者軟件配置的不同(例如系統(tǒng)大小端序不同、結(jié)構(gòu)體對(duì)齊方式不同等),nCom 提供DD 文件作為數(shù)據(jù)接口,通過構(gòu)建Data Sender/Receiver 對(duì)象,實(shí)現(xiàn)應(yīng)用間的通訊。CDS 端接收通訊數(shù)據(jù)并解析處理,解析后的數(shù)據(jù)以DD 的格式通過nCom 傳遞給構(gòu)成畫面的每個(gè)圖符模型的參數(shù),驅(qū)動(dòng)畫面中每個(gè)圖符的顯示。
2.2.1 代碼控件實(shí)現(xiàn)
如表1 所示,在VAPS XT 中依次點(diǎn)擊“File”、“NEW...”出 現(xiàn) 彈 窗,點(diǎn) 擊 第 三 欄“Advanced Objects”,選擇“Class”,設(shè)置名稱“Name”和路徑“Location”,點(diǎn)擊“確定”,從而創(chuàng)建類,此時(shí)出現(xiàn)類定義窗口,根據(jù)要實(shí)現(xiàn)的需求選擇基類,然后保存。
表1: 基類列表
在“Project View”中找到此工程,右鍵選擇生成代碼,生成框架代碼,根據(jù)建立Class 工程時(shí)選擇的路徑,找到其make 文件下的sln 文件,使用Visual Studio 2010 開發(fā)工具打開。在目錄中會(huì)生成三種分別以vxtCls*Plugin,vxtBaseCls*,vxtCls*命名的3 個(gè)類的文件,vxtCls*Plugin 為VAPS 圖形設(shè)計(jì)界面上使用,在初始化、構(gòu)建VAPS 屬性設(shè)置欄等功能上需要調(diào)用其他2種類,vxtBaseCls*和vxtCls*類是設(shè)計(jì)界面和最終執(zhí)行文件中需要的,其中vxtBaseCls*為vxtCls*的基類,主要進(jìn)行獲取屬性信息、創(chuàng)建對(duì)象等一些操作。
我們需要在派生類vxtCls*中的各個(gè)函數(shù)中按需求編寫相應(yīng)功能,從而實(shí)現(xiàn)代碼控件。如Calculator 類只需要在派生類vxtCls*中的函數(shù)s_vCalculate 中添加我們實(shí)現(xiàn)功能的代碼,并在vUpdate 函數(shù)進(jìn)行調(diào)用此函數(shù)即可;GrObject 類則需要在vDraw、pGetSelectObjet、vCalculateExtent 等函數(shù)中添加代碼。
由于VAPS 沒提供文本控件的相關(guān)的設(shè)計(jì)界面,如果設(shè)計(jì)文本類的代碼控件,需要我們手動(dòng)添加相關(guān)的類,因此創(chuàng)建GrObject 類,刪除工程文件中生成的vxtBaseCls*和vxtCls*類文件,手動(dòng)添加sqx*類和vxtCls*Plugin 類文件。如圖2 所示。
圖2: 文本控件工程目錄
在實(shí)現(xiàn)文本控件的功能時(shí),VAPS 底層開放了部分源碼,并提供了文本編輯類sqxTextCommon 可以進(jìn)行使用,它可編輯繪圖的基本屬性,如顏色、大小、對(duì)齊方式等等,我們可以通過從此類派生出子類,在子類中實(shí)現(xiàn)我們想要的功能,以供vxtCls*Plugin 類使用。下面以Calculator 類的文本控件“WideTextOut 控件”為例,實(shí)現(xiàn)一個(gè)計(jì)算輸入字符串?dāng)?shù)據(jù)長度的功能,在vCalculateExtent 中加入計(jì)算文本的寬度和高度的代碼,然后在vUpdateTextExtent 中調(diào)用vCalculateExtent,實(shí)現(xiàn)代碼如下所示:
編寫完文件后保存。我們需要分別編譯StaticOGL、release 兩個(gè)配置。StaticOGL 會(huì)編譯出.lib文件,給window 下的工程文件鏈接使用;release 會(huì)編譯出.dll 文件,供VAPS 設(shè)計(jì)界面使用,給開發(fā)人員在設(shè)計(jì)時(shí)提供預(yù)覽功能。編譯需要新建bat 文件并運(yùn)行,bat 文件內(nèi)容如下所示:
編譯生成的控件“WideTextOut”相比VAPS 自帶的基礎(chǔ)控件“WideText”,復(fù)用其全部屬性并多生成兩個(gè)Float 類型的輸出屬性,分別為文本寬度(TextWidth)和文本高度(TextHeight),在使用VAPS 繪制特定場景下不定長的顯示文本時(shí),便可應(yīng)用該代碼控件,實(shí)現(xiàn)對(duì)文本長度和寬度的控制,達(dá)到預(yù)期的顯示效果。如表2 所示。
表2: WideTextOut 控件屬性列表
2.2.2 代碼控件應(yīng)用
基于代碼控件的實(shí)現(xiàn),我們可以在開發(fā)過程中實(shí)現(xiàn)更多的功能。在這里以一個(gè)示例進(jìn)行闡述:需要在畫面中設(shè)計(jì)一個(gè)滾動(dòng)標(biāo)語進(jìn)行循環(huán)滾動(dòng)顯示UA 端發(fā)送的提示信息。在VAPS 的基礎(chǔ)控件不具備獲取傳入變長字符串長度的情況下,無法控制滾動(dòng)標(biāo)語的勻速運(yùn)行,從而影響觀感,因此需要運(yùn)用前面描述的文本控件,將UA端傳輸至CDS 端的字符串?dāng)?shù)據(jù)的長度獲取,作為一個(gè)輸出值供設(shè)計(jì)滾動(dòng)標(biāo)語的控件使用。
在VAPS XT 中依次點(diǎn)擊“File”、“NEW...”,選擇第一欄“Objects”中的“Graphical Object”,生成一個(gè)未添加任何屬性的“滾動(dòng)標(biāo)語控件(Rolltitles 控件)”,在“Properties”界面根據(jù)設(shè)計(jì)需求添加屬性如表3 所示。
表3: Rolltitles 控件屬性列表
設(shè)置好屬性后,在“Implementation View”窗口依次拖入VAPS 工具自帶的對(duì)象“RectWidthHeight”、“StencilGroup”、“SignalGenerator”、“sliderHoriz”以及剛剛生成的控件“WideTextOut”。了解它們的作用:“RectWidthHeight”設(shè)置文本顯示的窗口大小并提供給“StencilGroup”,“StencilGroup”將超出窗口大小的顯示內(nèi)容剪切掉,“sliderHoriz”控制整個(gè)文本在設(shè)置的窗口內(nèi)進(jìn)行滾動(dòng),“SignalGenerator”用于計(jì)算和控制每次文本滾動(dòng)的運(yùn)動(dòng)頻率,“WideTextOut”負(fù)責(zé)給“SignalGenerator”輸入文本長寬。如圖3 所示。
圖3: 模型視圖
設(shè)置數(shù)據(jù)流(Data Flow)關(guān)聯(lián)以上各個(gè)對(duì)象,然后“Rolltitles 控件”將設(shè)置的字符大小屬性和UA 端發(fā)送的字符串傳入WideTextOut 控件,WideTextOut 控件通過代碼實(shí)現(xiàn)字符串長度的獲取,結(jié)合字符大小計(jì)算出整個(gè)標(biāo)語的長度,再作為TextHeight 屬性通過數(shù)據(jù)流(Data Flow)關(guān)聯(lián)給Rolltitles 控件,如此便可以將其用于SignalGenerator 的value 值計(jì)算,控制滾動(dòng)的速率保持穩(wěn)定。如圖4 所示。
圖4: 數(shù)據(jù)流控制
完成全部數(shù)據(jù)流(Data Flow)的設(shè)置,Rolltitles 控件至此就完成了設(shè)計(jì),可以拖動(dòng)到畫面需要顯示的位置,通過關(guān)聯(lián)外部DD 數(shù)據(jù)或者直接輸入字符串進(jìn)行使用,點(diǎn)擊“play”能夠預(yù)覽運(yùn)行效果。如圖5 所示。
圖5: Rolltitles 控件的使用
代碼控件在機(jī)載顯控軟件開發(fā)的應(yīng)用,已得到充分的驗(yàn)證,其“基于模型”和“基于代碼”的組合使用,使得生成的代碼控件較之基礎(chǔ)控件可以更全能的應(yīng)用于圖符圖表設(shè)計(jì),降低了開發(fā)難度和維護(hù)成本,提升了功能實(shí)現(xiàn)的便捷性,同時(shí)也給自定義圖符圖表控件增加了擴(kuò)展性,可以用更直觀更全面的方式呈現(xiàn)畫面,進(jìn)而提高飛行員的工作效率和飛行安全性。