師光飛曠玉芬代 建張道發(fā)(.武漢交通職業(yè)學(xué)院,湖北 武漢 0065;、.武漢理工大學(xué),湖北 武漢 006; .長江宜昌航道局,湖北 宜昌 00)
基于Visual C++的機(jī)艙監(jiān)視與報(bào)警系統(tǒng)儀表實(shí)現(xiàn)*
師光飛1曠玉芬2代 建3張道發(fā)4
(1.武漢交通職業(yè)學(xué)院,湖北 武漢 430065;2、3.武漢理工大學(xué),湖北 武漢 430063; 4.長江宜昌航道局,湖北 宜昌 443002)
通常船舶機(jī)艙監(jiān)視與報(bào)警系統(tǒng)在實(shí)船通過組態(tài)軟件實(shí)現(xiàn),但組態(tài)軟件在實(shí)船的應(yīng)用有一定的局限性:封裝的儀表難以修改即易讀不易寫;外觀顆粒感強(qiáng)、不清晰、呈偽彩等。而基于Visual C++對(duì)監(jiān)視與報(bào)警系統(tǒng)儀表的實(shí)現(xiàn),使用CRgn類實(shí)現(xiàn)圓形轉(zhuǎn)速表、圓角矩形溫度表以及液壓管路等監(jiān)視與報(bào)警系統(tǒng)中必不可少的儀表,通過CRect Tracker類可實(shí)現(xiàn)儀表的實(shí)時(shí)拖動(dòng)與調(diào)整,實(shí)現(xiàn)系統(tǒng)的在線可定制,易讀易寫。
測控;Visual C++;儀表
機(jī)艙監(jiān)視與報(bào)警系統(tǒng)通常采用組態(tài)軟件實(shí)現(xiàn),組態(tài)軟件是使用靈活的組態(tài)方式,為用戶提供快速構(gòu)建工業(yè)自動(dòng)控制系統(tǒng)監(jiān)控功能的通用層次軟件工具。[1]這些組態(tài)軟件在實(shí)現(xiàn)類似測控系統(tǒng)上具有搭建簡單、方便的優(yōu)點(diǎn),但組態(tài)軟件是對(duì)儀表的預(yù)先封裝,因此,用戶若需要采用新的儀表只能通過軟件提供方對(duì)儀表的升級(jí)來實(shí)現(xiàn),不便于修改,系統(tǒng)適應(yīng)性較差,且呈現(xiàn)的圖片有較強(qiáng)的顆粒感、突兀感。基于Visual C++對(duì)監(jiān)控系統(tǒng)儀表的實(shí)現(xiàn)方法,能實(shí)現(xiàn)較好的界面效果,用戶可以依據(jù)自身需要對(duì)儀表的圖片進(jìn)行修改,實(shí)現(xiàn)圖片與圖片容器的無縫連接,系統(tǒng)適應(yīng)性強(qiáng);界面更美觀,可以使用真彩儀表背景圖片,系統(tǒng)可擴(kuò)展性強(qiáng),方便對(duì)系統(tǒng)功能進(jìn)行升級(jí),適用于實(shí)船的機(jī)艙監(jiān)視與報(bào)警及仿真等領(lǐng)域。
機(jī)艙監(jiān)視與報(bào)警系統(tǒng)的功能是準(zhǔn)確可靠地監(jiān)測機(jī)艙內(nèi)各種設(shè)備的運(yùn)轉(zhuǎn)狀態(tài)及其參數(shù),一旦運(yùn)行設(shè)備發(fā)生故障,自動(dòng)發(fā)出聲、光報(bào)警信號(hào)。例如對(duì)船舶主機(jī)的轉(zhuǎn)速、冷卻水溫度、船舶電站的轉(zhuǎn)速、電壓、冷卻水溫以及噴淋冷卻系統(tǒng)的狀態(tài)進(jìn)行監(jiān)視,當(dāng)監(jiān)視點(diǎn)發(fā)生異常時(shí),且該監(jiān)視點(diǎn)未被閉鎖,則系統(tǒng)立即發(fā)出聲響報(bào)警,同時(shí)相應(yīng)的報(bào)警指示燈快速閃爍,指示報(bào)警內(nèi)容。[2]構(gòu)建該系統(tǒng)需要用到的儀表有:轉(zhuǎn)速表、溫度表、液壓管路等。
2.1 儀表圖片與控件的融合
2.1.1 規(guī)則外形儀表圖片與控件的融合外形規(guī)則的儀表如轉(zhuǎn)速表、電壓表等通常為圓形或者矩形,而編程軟件提供的圖片容器如Visual C++中的picture控件,其外形為矩形,這樣通過控件載入圓形儀表圖片實(shí)現(xiàn)的儀表并不是真正意義上的圓形。雖然儀表為圓形,而儀表圖片卻是以矩形形式存在,因此,需要將控件和背景圖片進(jìn)行裁剪,以使控件和儀表圖片能融合得體。
使用CRgn類可以很方便地定義控件的外形,圓形儀表使用CRgn類的CreateEllipticRgn實(shí)現(xiàn),該函數(shù)創(chuàng)建一個(gè)橢圓形的區(qū)域,如果定義橢圓的長軸與短軸相等,則創(chuàng)建出來的是一個(gè)圓形區(qū)域。該函數(shù)原型如下:
函數(shù)的四個(gè)參數(shù)分別定義了橢圓的左上、右下兩點(diǎn)的坐標(biāo),創(chuàng)建成功則返回該區(qū)域的句柄。為了適應(yīng)儀表背景圖片的大小,使用圖片的長寬來定義橢圓的大小,圖片尺寸的大小可以在程序中獲得或在系統(tǒng)中通過圖片屬性獲得。圖形融合前后對(duì)比如圖1。
圖1 圓形儀表融合前后對(duì)比
對(duì)于諸如溫度計(jì)一類的儀表,則可以通過CRgn類的CreateRoundRect Rgn來創(chuàng)建,該函數(shù)根據(jù)給定參數(shù)創(chuàng)建一個(gè)圓角矩形。該函數(shù)原型如下:
函數(shù)有6個(gè)參數(shù),前四個(gè)參數(shù)定義了圓角矩形的左上、右下的兩點(diǎn)坐標(biāo),后兩個(gè)參數(shù)定義了圓角沿著X軸和Y軸的長度。這六個(gè)參數(shù)可以根據(jù)儀表背景圖片內(nèi)容酌情進(jìn)行選擇,另外,關(guān)于溫度計(jì)液注的實(shí)現(xiàn),可以使用MoveWindow函數(shù)實(shí)現(xiàn)液柱的伸縮。
2.1.2 不規(guī)則外形儀表圖片與控件的融合
不規(guī)則外形的儀表,如管道、水泵等組件,具有不規(guī)則的外形,無法通過類似規(guī)則外形儀表的方式(通過設(shè)置裁剪區(qū)域的方式)進(jìn)行融合。對(duì)于這一類儀表的做法,需要使用CRgn類的CombineRgn來進(jìn)行摳圖,將背景圖片中除去儀表之外的部分“摳掉”,根據(jù)剩下部分的圖像創(chuàng)建一個(gè)區(qū)域并將此區(qū)域賦予控件。由于白色部分創(chuàng)建的區(qū)域與初始區(qū)域重合,在異或的作用下被剔除,而儀表本身的內(nèi)容則被保留下來,形成一個(gè)區(qū)域,將此區(qū)域賦予控件,使控件外形與儀表背景一致。
2.2 控件在線調(diào)整的實(shí)現(xiàn)
為了使程序能夠靈活定制,在程序處于運(yùn)行態(tài)時(shí),通過使用CRect Tracker類實(shí)現(xiàn)控件的自由調(diào)整。通過改變控件的大小和位置,使用有限的控件可以搭建出不同的組合。
使用CRect Tracker類的關(guān)鍵在于CRect-Tracker類中的三個(gè)函數(shù):(1)void Draw(CDC* pDC)const。此函數(shù)繪制控件外的調(diào)整框的圖形,在使用鼠標(biāo)調(diào)整控件后,調(diào)用這個(gè)函數(shù)重繪當(dāng)前的調(diào)整框。(2)int Hit Test(CPoint point)const。該函數(shù)可以判斷當(dāng)前點(diǎn)擊的位置(參數(shù)point)位于調(diào)整框的什么位置,通常,返回值大于等于0表示鼠標(biāo)點(diǎn)擊的范圍在調(diào)整框內(nèi)。(3)BOOL Track (CWnd*p Wnd,CPoint point,BOOL b AllowInvert =FALSE,CWnd*p WndClip To=NULL)。此函數(shù)實(shí)時(shí)跟蹤調(diào)整框的大小,從鼠標(biāo)點(diǎn)擊到鼠標(biāo)抬起的過程中,Track記錄著調(diào)整框的大小。
根據(jù)以上函數(shù)說明,在程序運(yùn)行時(shí)動(dòng)態(tài)調(diào)整控件的大小和位置,應(yīng)在鼠標(biāo)左鍵單擊的響應(yīng)函數(shù)中調(diào)用上述函數(shù),并根據(jù)調(diào)整框的大小和位置改變控件的大小和位置。
使用CRect Tracker類實(shí)現(xiàn)控件的在線調(diào)整之后,使程序的靈活性和通用性得到增強(qiáng),如圖2是船舶海水冷卻系統(tǒng)管路監(jiān)控圖從初始狀態(tài)調(diào)整到最終狀態(tài)的過程。
圖2 控件由初始狀態(tài)到最終狀態(tài)的調(diào)整過程
2.3 控件位置保存實(shí)現(xiàn)
通過CRect Tracker類對(duì)對(duì)象的位置和大小進(jìn)行調(diào)整之后,必須對(duì)對(duì)象的狀態(tài)進(jìn)行保存,否則,在程序關(guān)閉后這些狀態(tài)信息會(huì)丟失。因此,應(yīng)該在程序啟動(dòng)時(shí)讀取對(duì)象位置和大小并賦予對(duì)象,在程序關(guān)閉時(shí)將對(duì)象的位置和大小信息保存。由于具體調(diào)整的對(duì)象不確定,需要對(duì)程序中控件進(jìn)行遍歷??丶奈恢猛ㄟ^二進(jìn)制文件保存在程序可執(zhí)行文件路徑下,采用二進(jìn)制方式寫入數(shù)據(jù),可以防止人為修改控件中的狀態(tài)。
2.3.1 對(duì)象狀態(tài)的讀取
在程序初始化過程中,需要讀取對(duì)話框上各個(gè)控件的位置,以使各個(gè)控件能夠?qū)μ?hào)入座,重現(xiàn)上次程序關(guān)閉時(shí)控件的狀態(tài)。
2.3.2 對(duì)象狀態(tài)的保存
對(duì)象狀態(tài)的保存是狀態(tài)讀取的逆向過程,兩者在流程上大體相同,狀態(tài)保存與狀態(tài)讀取的主要區(qū)別是:(1)二進(jìn)制文件的屬性中要加入mode-Create,在程序第一次運(yùn)行時(shí)沒有所需要的二進(jìn)制文件存在,可以創(chuàng)建二進(jìn)制文件。(2)將文件讀改成文件寫。讀取文件時(shí)是將文件中保存的狀態(tài)信息賦予指定ID號(hào)的控件,而寫文件是將控件的ID號(hào)和該控件的狀態(tài)信息寫入到文件中。
2.4 儀表參數(shù)顯示的實(shí)現(xiàn)
儀表參數(shù)顯示根據(jù)不同的儀表類型有不同的實(shí)現(xiàn)方式,如轉(zhuǎn)速表的示值方式是通過儀表指針旋轉(zhuǎn),溫度表的示值方式是液面的升降,其他開關(guān)量監(jiān)控的儀表如閥門和液壓管路則是顏色的切換。為了讀取方便,具有非開關(guān)量顯示的儀表還需要搭配一個(gè)類似數(shù)碼管的數(shù)值顯示器。
2.4.1 指針的實(shí)現(xiàn)
在儀表盤上實(shí)現(xiàn)指針,首先必須獲得儀表盤容器控件的dc(設(shè)備上下文指針),并使用該指針調(diào)用CDC類的MoveTo和LineTo繪制儀表的指針(如圖3)。
圖3 指針實(shí)現(xiàn)流程
2.4.2 開關(guān)狀態(tài)的實(shí)現(xiàn)
開關(guān)狀態(tài)的實(shí)現(xiàn)方法很多,可以使用窗體的Show Window函數(shù)使控件顯示和隱藏,也可以使用Load Bitmap函數(shù)改變?nèi)萜鲀?nèi)的圖片來實(shí)現(xiàn)狀態(tài)切換。本程序中用到的狀態(tài)指示燈的切換和開關(guān)動(dòng)作的效果圖(如圖4)。
圖4 開關(guān)量實(shí)現(xiàn)效果圖
本文提出的基于Visual C++編程平臺(tái)的監(jiān)控與報(bào)警系統(tǒng)儀表界面實(shí)現(xiàn)的方法,達(dá)到了交互友好、簡單、直觀、便于修改等優(yōu)點(diǎn)。在程序編制過程中:(1)采用了大量的真彩儀表圖片,使儀表表現(xiàn)更加真實(shí),突破了常見組態(tài)軟件僅求象形的局限;(2)使用CRgn類,實(shí)現(xiàn)了圖片與圖片容器的無縫連接,使對(duì)象在加入到程序界面中后沒有突兀感,與界面融為一體;(3)使用CRect Tracker類實(shí)現(xiàn)了控件的在線、實(shí)時(shí)調(diào)整,增強(qiáng)了程序的可定制性和靈活性。
圖5 電站監(jiān)控與冷卻系統(tǒng)監(jiān)控效果圖
通過以上步驟,最終達(dá)到了比較滿意的效果(如圖5)?;赩isual C++編程平臺(tái)的測控系統(tǒng)儀表界面實(shí)現(xiàn)的方法,在實(shí)船的機(jī)艙監(jiān)視與報(bào)警系統(tǒng)以及仿真等工作中相對(duì)于組態(tài)軟件具有一定的優(yōu)越性。
[1]歐金成,歐世樂,林德杰,彭備戰(zhàn).組態(tài)軟件的現(xiàn)狀與發(fā)展[J].工業(yè)控制計(jì)算機(jī),2002,(4):1-5.
[2]李世臣,徐善林.船舶機(jī)艙自動(dòng)化[M].大連:大連海事出版社,2012:111.
10.3969/j.issn.1672-9846.2014.01.020
U665.26
A
1672-9846(2014)01-0082-03
2013-12-10
師光飛(1979-),男,湖北武漢人,武漢交通職業(yè)學(xué)院航海學(xué)院教師,主要從事船舶電氣與自動(dòng)化研究。
曠玉芬(1988-),女,湖北武漢人,武漢理工大學(xué)碩士研究生,主要從事船舶流場的研究工作。
代 建(1985-),男,湖北孝感人,武漢理工大學(xué)碩士研究生,主要從事艦船電力推進(jìn)及其自動(dòng)化技術(shù)研究。
張道發(fā)(1982-),男,湖北宜昌人,長江宜昌航道局工程師,主要從事航運(yùn)工程研究。