摘 要:介紹在QNX實(shí)時(shí)操作系統(tǒng)圖形界面開發(fā)環(huán)境PhAB下的軟件設(shè)計(jì)特點(diǎn)。結(jié)合船舶動力裝置控制系統(tǒng)的具體要求,從界面繪制、資源設(shè)置和函數(shù)調(diào)用等三個(gè)方面對船舶動力裝置控制系統(tǒng)圖形控制界面和程序進(jìn)行設(shè)計(jì),闡述設(shè)計(jì)特點(diǎn),探索在PhAB下圖形界面設(shè)計(jì)的一般方法。對在QNX下圖形界面的設(shè)計(jì)開發(fā)具有一定的指導(dǎo)意義。經(jīng)測試運(yùn)行,設(shè)計(jì)系統(tǒng)能滿足控制要求。
關(guān)鍵詞:PhAB;船舶動力裝置;圖形界面;控件
中圖分類號:TP274文獻(xiàn)標(biāo)識碼:B
文章編號:1004-373X(2010)04-148-04
Design of Graphical Interface Based on PhAB
SHI Feng,HU Dabin,XIA Ji
(College of Naval Architecture and Power,Naval University of Engineering,Wuhan,430033,China)
Abstract:The characteristics of software design in QNX RTOS′s photon application builder(PhAB) are described.Combined with detail requirements of control system on marine power,the photon interface and program of this system are designed with interface mapping,resource setting and function callbacks.The characters of the design are described,and the general methods of interface design under PhAB are discussed.The idea of designing has certain significance for the graphical interface design under QNX RTOS.After testing and running,the design system can satisfy the control requirement.
Keywords:PhAB;marine power device;graphical interface;control
0 引 言
在工業(yè)控制特別是較復(fù)雜的工業(yè)控制領(lǐng)域,由于被控對象的多樣化和控制邏輯的復(fù)雜性,各種傳統(tǒng)的控制方式逐漸被計(jì)算機(jī)控制所替代。一個(gè)完整的計(jì)算機(jī)控制系統(tǒng)分為硬件和軟件兩個(gè)部分,而計(jì)算機(jī)控制的最大特點(diǎn)就是可以在相同的硬件條件下通過設(shè)計(jì)不同的控制軟件完成各類控制要求。計(jì)算機(jī)操作系統(tǒng)分為分時(shí)和實(shí)時(shí)兩種,兩類操作系統(tǒng)在計(jì)算機(jī)控制領(lǐng)域中都有應(yīng)用。但由于分時(shí)操作系統(tǒng)本身的通用性特點(diǎn),穩(wěn)定性和可靠性不高,在工作環(huán)境惡劣,可靠性要求高的系統(tǒng)中很少采用。實(shí)時(shí)操作系統(tǒng)是一類更適合于控制的計(jì)算機(jī)操作系統(tǒng),相比于分時(shí)操作系統(tǒng),實(shí)時(shí)操作系統(tǒng)大多擁有微內(nèi)核,并且通過對結(jié)果返回的時(shí)間限制來實(shí)現(xiàn)程序運(yùn)行的可預(yù)測性,因此具有較高的穩(wěn)定性和可靠性[1]。近年來,隨著實(shí)時(shí)操作系統(tǒng)在一些可靠性和實(shí)時(shí)性要求較高的領(lǐng)域的成功應(yīng)用,實(shí)時(shí)操作系統(tǒng)得以快速發(fā)展,為適應(yīng)硬件的發(fā)展和用戶的需求,各大實(shí)時(shí)系統(tǒng)開發(fā)商都開發(fā)出適合本系統(tǒng)的圖形控制界面,如VxWorks的WindML和QNX的PhAB[2-5]。本文在某型船舶動力裝置控制系統(tǒng)設(shè)計(jì)中,以實(shí)時(shí)操作系統(tǒng)QNX作為開發(fā)平臺,研究在QNX圖形界面開發(fā)器PhAB界面設(shè)計(jì)的方法和特點(diǎn)。
1 圖形界面開發(fā)環(huán)境
PhAB(Photon Application Builder)是QNX集成開發(fā)環(huán)境(QNX Momentics IDE)的一個(gè)部分。PhAB的圖形構(gòu)建采用分層的方式,而且擁有微內(nèi)核結(jié)構(gòu)。這使得在PhAB下設(shè)計(jì)的圖形控制界面不僅占用空間小,而且運(yùn)行速度塊[6]。
PhAB采用所見即所得的控制界面開發(fā)模式。在PhAB中進(jìn)行界面設(shè)計(jì)的基本單元是控件(Widget),控件以類的方式定義,控件類的成員叫作控件的資源[7]。控件的資源有兩種分類方式:一種是以C語言的變量名分類的,如長整型,字節(jié)型,字符串型等;另一種是以資源的賦值方式不同為依據(jù)分類的,如尺寸和顏色資源(Scalar and color resources),字符串資源(String resources),標(biāo)記資源(Flag resources) 和鏈接資源(Link resources)等??丶愐詷錉钆帕?,并擁有嚴(yán)格的父子關(guān)系。如圖1所示。
在界面繪制中,控件的創(chuàng)建可以通過在控件框中選取相應(yīng)控件后直接在界面編輯區(qū)域繪制,也可以使用PhAB提供的函數(shù)編寫。
2 界面繪制
基于工程應(yīng)用簡單可靠的原則,在滿足使用要求的條件下,在界面繪制中應(yīng)選用較為簡單的控件,即盡量選用圖1中靠左邊的控件[8-10]。在PhAB中,任何控件都有從PtWidget控件繼承來的一個(gè)位置坐標(biāo)參數(shù)和一個(gè)規(guī)定控件占用范圍的參數(shù)。PhAB將這兩個(gè)參數(shù)專門在編輯框的左邊顯示,通過設(shè)置這兩個(gè)參數(shù)可以精確設(shè)定控件的坐標(biāo)和在編輯框中占用范圍的大小。
圖1 控件類排列
界面的具體繪制如下:
邊界和輪廓 邊界和輪廓一般都由直線組成,因此選用直線控件(PtLine)繪制。直線控件是圖形控件類(PtGraphic)下的子控件類,除繼承圖形控件類的資源外,直線控件還擁有用于規(guī)定直線起始坐標(biāo)空間的Pt_ARG_ORIGIN資源和用于標(biāo)記直線起點(diǎn)坐標(biāo)和終點(diǎn)坐標(biāo)的Pt_ARG_POINTS資源。在對直線控件進(jìn)行相關(guān)設(shè)置時(shí),直線的位置和長度可以通過直接拖動改變,更精確地設(shè)定則需要通過改變編輯框左邊的坐標(biāo)參數(shù)和范圍參數(shù)確定。線條的顏色和寬度等可以通過對相關(guān)資源進(jìn)行設(shè)置來改變,如通過改變Pt_ARG_COLOR資源的參數(shù)來改變直線的顏色,通過設(shè)置Pt_ARG_LINE_WIDTH資源的參數(shù)來改變直線的寬度。PhAB中,控件占用的空間并不僅僅是控件顯示部分的面積,而是一個(gè)矩形區(qū)域,這個(gè)矩形區(qū)域?qū)⒖丶乃酗@示部分包含在內(nèi)。直線控件占用的空間就是以直線的起點(diǎn)和終點(diǎn)為對角的一個(gè)矩形區(qū)域,這點(diǎn)在對控件背景進(jìn)行設(shè)置和判斷控件的重合中需要考慮到。
顯示框和標(biāo)識框 顯示框和標(biāo)識框使用到基本控件(PtBasic)和容器控件(PtContainer)。從圖1中可以看到,基本控件是PhAB中最基礎(chǔ)的可顯示控件,它是其他可顯示控件的總父控件類。除繼承PtWidget的資源外,基礎(chǔ)控件還擁有用于顯示的20多個(gè)新資源。如控件顏色資源,控件內(nèi)部顏色資源和控件邊界資源等。通過對這些資源的配置可以得到不同的顯示效果。
基礎(chǔ)控件在需要對顯示框或標(biāo)識框填寫標(biāo)題或設(shè)置改變尺寸時(shí)的動作時(shí)將無法滿足要求,這時(shí)需要用到容器控件。
標(biāo)識和信息顯示 對標(biāo)識和信息顯示的繪制選用文本控件。系統(tǒng)設(shè)計(jì)中使用到的兩類文本控件分別是PtText和PtMultiText。PtText是標(biāo)簽控件類(PtLabel)的子控件類。它對文字的編輯的支持較簡單,僅支持單行文字顯示,而且不能在同一個(gè)控件中使用不同的文字字體、字號和顏色等,優(yōu)點(diǎn)是占用資源少,適合于普通標(biāo)識性的文字使用場合。在該系統(tǒng)設(shè)計(jì)中大量用于文字顯示的就是PtText控件。相對而言PtMultiText控件對文字編輯的支持要強(qiáng)大很多,它支持字符的多行顯示,允許對同一控件中的字符進(jìn)行字符大小、顏色等的編輯,能很好的支持復(fù)雜的信息顯示。
閥件等特殊形狀器件 PhAB并不像很多繪圖工具一樣為圖形繪制提供各類通用的規(guī)則或不規(guī)則的圖形或圖標(biāo),因此在繪制特殊形狀的器件圖標(biāo)時(shí)需要使用一個(gè)多邊形控件(PtPolygon)對器件圖標(biāo)進(jìn)行繪制。多邊形控件是PhAB中功能最強(qiáng)大的控件之一。使用多邊形控件繪制的圖形分兩種:一種是起點(diǎn)和終點(diǎn)重合的(在這種情況下即使繪制的時(shí)候沒有將起點(diǎn)和終點(diǎn)連接在一起,系統(tǒng)也會在繪制完成后自動將其重合到一起)多邊形;另一種是起點(diǎn)和終點(diǎn)不重合。 這種起點(diǎn)和終點(diǎn)的是否重合是通過配置對多邊形控件的Pt_ARG_POLYGON_FLAGS標(biāo)記資源是否有效來實(shí)現(xiàn)的。在前面已經(jīng)提到PhAB控件占用的空間和在界面上顯示的范圍的不一致性,在對多邊形繪制的控件進(jìn)行配置時(shí),控件的內(nèi)部是指多邊形各邊圍成的區(qū)域,而占用的范圍是一個(gè)包含多邊形所有邊在內(nèi)的矩形。以顏色設(shè)置為例,Pt_ARG_FILL_COLOR資源是對整個(gè)多邊形占用范圍的顏色進(jìn)行填充,這塊區(qū)域包括但不局限于多邊形內(nèi)部,填充的是一個(gè)矩形;而Pt_ARG_INSIDE_COLOR資源只對多邊形各邊圍成區(qū)域的顏色進(jìn)行填充,并且對多邊形內(nèi)部顏色的填充會覆蓋對多邊形所屬區(qū)域顏色的填充。
控制按鈕 在系統(tǒng)控制界面繪制中需要繪制多種形狀不同的控制按鈕,如控制窗口的打開按鈕、閥件的控制按鈕、被控對象的選取按鈕等。進(jìn)行這類按鈕繪制的有按鈕控件(PtButton)和按鈕控件的兩個(gè)子控件:開關(guān)按鈕(PtOnOffButton)和索套按鈕(PtToggleButton)。按鈕的形狀除了可以在控件所給形狀的基礎(chǔ)上修改,還可以通過在按鈕控件的Pt_ARG_LABEL_IMAGE資源中載入或繪制圖形來設(shè)定按鈕的外形,在Pt_ARG_ARM_IMAGE資源中載入或繪制圖形來設(shè)置按鈕按下時(shí)的形狀。因此,通過對按鈕控件相關(guān)資源的配置,可以繪制出各種不同效果的按鈕器件。圖2所示即為該系統(tǒng)設(shè)計(jì)中繪制的不同形狀的按鈕。
圖2 系統(tǒng)中各種形狀按鈕
在系統(tǒng)界面繪制中,當(dāng)選定多個(gè)控件并把他們定義為一個(gè)組時(shí),將生成一個(gè)新的控件:組控件(PtGroup)。組控件的資源并不是所有組成組控件的控件的相同資源的集合,而是一個(gè)獨(dú)立的控件。組控件屬于容器控件類的子控件類,除繼承容器控件的資源外,它還新增了十多個(gè)用于處理組控件內(nèi)各控件關(guān)系的資源。而且,改變組控件的資源除了能對它內(nèi)部的成員之間的相互關(guān)系進(jìn)行改變外,不對內(nèi)部控件本身的特性作任何修改。在某種意義上來說,組控件就是一個(gè)規(guī)定了里面物品排放方式的容器,改變?nèi)萜鞯氖綐硬⒉粫锩嫠b物品有什么影響。
通過以上對控制界面具體繪制的分析,完成如圖3所示的界面繪制。
3 控件和資源的相關(guān)設(shè)置
在系統(tǒng)界面的設(shè)計(jì)中進(jìn)行的資源設(shè)置包括對資源的賦值和獲取資源參數(shù)。資源的賦值和參數(shù)獲取方式按資源的不同類別有所差別,但使用的函數(shù)是相同的。
系統(tǒng)的設(shè)計(jì)過程中需要在多種情況下對控件資源進(jìn)行賦值,包括標(biāo)識按鈕形態(tài),顯示被監(jiān)測量的狀態(tài)和操作過渡狀態(tài)的顯示等。對資源賦值的函數(shù)有PtSetResource()和PtSetResources(),PtSetResource()用以對控件的單一資源進(jìn)行賦值,函數(shù)定義如下:
int PtSetResource(PtWidget_t *widget,longtype,longvalue,longlen);
其中:*widge表示將要賦值的控件名指針;type表示將要賦值的資源;value和len表示賦值給資源的參數(shù)。
對多個(gè)資源同時(shí)賦值用到的是PtSetResources()函數(shù),PtSetResources()函數(shù)要配合PtSetArg()函數(shù)一起使用,其中PtSetArg()起到賦值初始化的作用, 函數(shù)定義如下:
PtSetArg( PtArg_t *arg,longtype,longvalue,longlen);
圖3 系統(tǒng)控制界面
其中:*arg表示裝載賦值資源的變量的結(jié)構(gòu)體隊(duì)列首地址;type表示將要賦值的資源;value和len表示賦值給資源的參數(shù)。
int PtSetResources( PtWidget_t *widget,intn_args,PtArg_t const*args);
其中:*widge表示將要賦值的控件名指針;n_args表示同時(shí)賦值資源的個(gè)數(shù);*args表示裝載賦值資源的變量的結(jié)構(gòu)體隊(duì)列首地址。
資源參數(shù)的獲取在系統(tǒng)中主要用于讀取監(jiān)測變量的狀態(tài),讀取資源參數(shù)的函數(shù)為PtGetResource()和PtGetResources(),使用方法與資源賦值函數(shù)類似,因此不再詳細(xì)說明。如下為一段以控件資源的賦值和讀取來顯示某控件圖形變化的一段程序:
PtArg_t arg[2];
PhImage_t *image;
…
PtSetArg(arg[1],Pt_ARG_ARM_IMAGE,image,0);
PtGetResources(ABW_JKA,1,arg[1]);
PtSetArg(arg[1],Pt_ARG_ARM_IMAGE,image,0);
PtSetResources(ABW_ JKB,1,arg[1]);
PtBkgdHandlerProcess();//刷新屏幕
…
4 控件函數(shù)調(diào)用
控制系統(tǒng)界面各部分的動作需要通過設(shè)計(jì)和編寫程序?qū)崿F(xiàn)。程序與控件的鏈接分兩種情況,一種是通過編寫程序改變控件的某些資源以達(dá)到反應(yīng)被控量狀態(tài)的目的,這種情況可以叫作控件的接收信號;另一種是當(dāng)控件狀態(tài)發(fā)生變化時(shí),系統(tǒng)將為控件調(diào)用與這種變化相對應(yīng)的鏈接函數(shù),即控件的發(fā)出信號??丶暮瘮?shù)調(diào)用也屬于控件的一類資源,即上文中提到的鏈接資源(Link Resources)??丶卸喾N函數(shù)調(diào)用方式,而且不同控件的可調(diào)用方式并不完全相同。下面為系統(tǒng)中用到的幾種通用函數(shù)調(diào)用方式:
(1) 點(diǎn)擊調(diào)用(Activate Callbacks):點(diǎn)擊調(diào)用的控件資源是Pt_CB_ACTIVATE。當(dāng)使用鼠標(biāo)操作時(shí),鼠標(biāo)左鍵點(diǎn)擊(一個(gè)按下后松開的過程)一個(gè)控件時(shí)將調(diào)用這個(gè)資源所鏈接的函數(shù)。點(diǎn)擊調(diào)用是系統(tǒng)設(shè)計(jì)中最常用的控件函數(shù)調(diào)用情況,在系統(tǒng)的關(guān)閉、控制命令的發(fā)出、參數(shù)的顯示等控件設(shè)置中都會用到。操作中是需要注意的是在點(diǎn)擊調(diào)用的場合,僅按下一個(gè)控件并不會調(diào)用這個(gè)資源的函數(shù),還需要在控件上松開按下的鼠標(biāo)左鍵。
(2) 按下調(diào)用(Arm Callbacks):按下調(diào)用的控件資源是Pt_CB_ARM。與點(diǎn)擊調(diào)用不同,按下調(diào)用函數(shù)的鏈接執(zhí)行只需要鼠標(biāo)左鍵在控件上按下就可以。按下調(diào)用在PhAB中并不只是代表鼠標(biāo)左鍵對控件的按下,而是控件的一種狀態(tài)。以一個(gè)PtButton控件為例,當(dāng)選中它并在鍵盤上按下回車鍵時(shí),控件會經(jīng)歷一個(gè)“彈起-按下-彈起”的過程,這個(gè)過程中的“按下”就是表示的按下調(diào)用起作用的狀態(tài)。而對于一個(gè)非按鍵控件來說,它的按下狀態(tài)并不一定會在控件的外形上有所表示。
(3) 右鍵按下調(diào)用(Menu Callbacks):鼠標(biāo)右鍵按下調(diào)用之所以叫作Menu Callbacks是因?yàn)樵诤芏鄳?yīng)用中右鍵的按下會出來一個(gè)菜單來選擇相應(yīng)的功能。右鍵按下調(diào)用的控件資源為Pt_CB_MENU。它也是所有控件都擁有的一種函數(shù)調(diào)用方式。
(4) 熱鍵調(diào)用(Hotkey Callbacks):熱鍵調(diào)用是一種方便的函數(shù)調(diào)用方式,它的控件資源是Pt_CB_HOTKEY。熱鍵的組成可以是聯(lián)合鍵(Alt,Shift,Ctrl)中的一個(gè)或幾個(gè)加上一個(gè)其他鍵,也可以只是一個(gè)非聯(lián)合鍵。熱鍵調(diào)用在當(dāng)前程序運(yùn)行中有效。
在控件的調(diào)用中,調(diào)用的可以不僅是函數(shù),還可以是彈出一個(gè)窗口,菜單或者對話框,這些調(diào)用要求給出窗口彈出的坐標(biāo),彈出方式以及設(shè)定相關(guān)參數(shù)。
5 結(jié) 語
所設(shè)計(jì)圖形控制界面系統(tǒng)運(yùn)行于VP9 型單板機(jī)和AVME9668+IP408信號采集模塊的VME總線下。長時(shí)間的調(diào)試運(yùn)行表明,本文所設(shè)計(jì)的基于PhAB的圖形控制軟件運(yùn)行穩(wěn)定、可靠,實(shí)現(xiàn)了系統(tǒng)功能,達(dá)到了既定要求。
參考文獻(xiàn)
[1]鄭澤勝.嵌入式系統(tǒng)以及實(shí)時(shí)軟件開發(fā)[EB/OL].http://www.pocketix.com,2009.
[2]張義中.Unix平臺下C語言高級編程指南[M].北京:北京希望電子出版社,2000.
[3]Arnold Berger.嵌入式系統(tǒng)設(shè)計(jì)[M].呂駿,譯.北京:電子工業(yè)出版社,2002.
[4]劉海燕,邵立嵩,荊濤.Linux系統(tǒng)應(yīng)用與開發(fā)教程[M].北京:機(jī)械工業(yè)出版社,2007.
[5]侯業(yè)勤,張菁.分布式嵌入式實(shí)時(shí)操作系統(tǒng)QNX[M].北京:中國宇航出版社,1999.
[6]QNX官方網(wǎng)站.Qnx Software Systems Ltd[EB/OL].http://www.qnx.com,2009.
[7]曹冰冰.基于QNX實(shí)時(shí)操作系統(tǒng)的測試系統(tǒng)的開發(fā)[D].西安:西北工業(yè)大學(xué),2002.
[8]陳曉剛,嚴(yán)丹.基于QNX操作系統(tǒng)的高可靠性應(yīng)用軟件框架[J].工業(yè)控制計(jì)算機(jī),2008,21(2):48-51.
[9]吳勇,傅鵬,蘭魯光.基于QNX的實(shí)時(shí)數(shù)據(jù)采集系統(tǒng)[J].微計(jì)算機(jī)信息,2006,22(2):63-64.
[10]王冬霞,王茂,單家方.基于QNX的分布式采集控制系統(tǒng)[J].核聚變與等離子體物理,2007,27(4):334-338.