.NET在工控圖片儀器組配中的預(yù)設(shè)和踐行
組件技術(shù)軟件設(shè)計(jì)技術(shù)經(jīng)過(guò)了從結(jié)構(gòu)化軟件設(shè)計(jì)、面向?qū)ο筌浖O(shè)計(jì)到組件式軟件設(shè)計(jì)的發(fā)展過(guò)程,組件式技術(shù)是面向?qū)ο蠹夹g(shù)的發(fā)展和提高。它的開發(fā)思想就是將復(fù)雜的軟件開發(fā)分解成若干個(gè)功能組件,這些組件可以由不同的廠家用任何語(yǔ)言開發(fā),開發(fā)環(huán)境也無(wú)特別限制。若干組件可以根據(jù)具體應(yīng)用要求可靠而有效的組合在一起完成復(fù)雜的任務(wù)。
組件(component)是指可方便插入語(yǔ)言、工具、操作系統(tǒng)、網(wǎng)絡(luò)軟件系統(tǒng)中的一種獨(dú)立可重用的二進(jìn)制形式的代碼和數(shù)據(jù)。構(gòu)件的結(jié)構(gòu)和功能被封裝在內(nèi)部,對(duì)外界提供必要的接口,所有的數(shù)據(jù)交換都是通過(guò)接口實(shí)現(xiàn)的。組件就是對(duì)象,是對(duì)數(shù)據(jù)和方法的封裝。一個(gè)完整的組件應(yīng)該有自己的屬性、方法、事件。
屬性是組件數(shù)據(jù)的簡(jiǎn)單訪問(wèn)者,方法是組件的一些簡(jiǎn)單而可見的功能,事件是一種特定的操作,在某對(duì)象上發(fā)生或?qū)δ硨?duì)象發(fā)生的。自定義組件的事件就是指對(duì)所做組件的某種特定操作,像“按鈕”的單擊事件。
工控儀表組件的設(shè)計(jì)與實(shí)現(xiàn)本文介紹的組件是用C#。NET工具開發(fā)的。C#(Csharp)是由Microsoft公司開發(fā)一種最新的、面向?qū)ο蟮木幊陶Z(yǔ)言。它由C和C++派生出來(lái),融合了VisualBasic的高效和C/C++強(qiáng)大。C?梢宰詣(dòng)利用。NET類庫(kù)。
C#。NET組件設(shè)計(jì)方法在C#中,組件就是實(shí)現(xiàn)了接口System.Compo-nentModle.Icomponent的類,或者從System.Compo-nentModle.Componet類或其他實(shí)現(xiàn)了Icomponent接口的類的派生類。用C#開發(fā)的組件主要包括3種方法:從已有的Windows類派生、從UserControl類派生,或者從Control類派生。我們選擇的方法是從UserControl類派生,也就是自行創(chuàng)建一個(gè)用戶控件。采用這種方式需要從UserControl類派生自己的控件類,然后添加所需要的功能。UserControl類中定義了Windows窗體控件最基本的功能,包括窗口句柄、消息循環(huán)、鼠標(biāo)鍵盤等用戶界面事件。采用這種方式需添加繪制代碼,可以對(duì)組件充分制定。
首先選擇從[模板]列表中選擇[Windows控件庫(kù)]選項(xiàng)創(chuàng)建新項(xiàng)目,Visualstudio會(huì)在窗體設(shè)計(jì)器創(chuàng)建新的組件控件。我們要做的工作就是在原始控件上繪制圖形,添加屬性、方法、事件等。具體包括:(1)繪制控件外觀,一般應(yīng)用GDI+中提供的方法。(2)根據(jù)需要添加屬性,編寫get{}set{}訪問(wèn)程序,存取屬性。(3)根據(jù)具體要求編寫方法和事件,設(shè)定該控件與用戶的交互。(4)編譯生成。dll文件。
組件的測(cè)試方法。代碼編寫完成以后生成。DLL文件。由于它不是可執(zhí)行文件,不能直接運(yùn)行該程序,要?jiǎng)?chuàng)建例程來(lái)測(cè)試這個(gè)組件。首先把組件文件(。dll文件)添加到工具箱中;創(chuàng)建Windows應(yīng)用程序;把組件拖放到Windows應(yīng)用程序的Form窗體中,可以看到設(shè)計(jì)的組件的效果,從屬性窗口修改控件屬性,也可以測(cè)試控件中設(shè)計(jì)的方法和事件。
組件設(shè)計(jì)中涉及的技術(shù)一是GDI+技術(shù)。GDI+是GDI(GraphicsDeviceInterface圖形設(shè)備接口)的改進(jìn)產(chǎn)品,是Microsoft的下一代二維圖形系統(tǒng),它是完全面向?qū)ο蟮。GDI+包括3部分:二維矢量圖形繪制、圖像處理和文字顯示。
GDI+中提供了各式各樣的畫筆、畫刷、圖像等圖形對(duì)象,此外還包括一些新的繪圖功能。圖形儀表組件中的動(dòng)態(tài)和靜態(tài)界面都要用GDI+編程繪制實(shí)現(xiàn)。
二是多線程技術(shù)。用多線程技術(shù)可以編寫能夠同時(shí)執(zhí)行多個(gè)任務(wù)的應(yīng)用程序。操作系統(tǒng)使用進(jìn)程將正在執(zhí)行的不同應(yīng)用程序分開。線程是操作系統(tǒng)分配處理器時(shí)間的基本單元,并且該進(jìn)程中可以有多個(gè)線程同時(shí)執(zhí)行代碼。與用戶交互的軟件必須盡可能快地對(duì)用戶的活動(dòng)作出反應(yīng),以便提供豐富多彩的用戶體驗(yàn)。但同時(shí)它必須執(zhí)行必要的計(jì)算以便盡可能快地將數(shù)據(jù)呈現(xiàn)給用戶。要提高對(duì)用戶的響應(yīng)速度并且處理所需數(shù)據(jù)以便幾乎同時(shí)完成工作,使用多個(gè)線程是一種強(qiáng)大的技術(shù)。在本設(shè)計(jì)中多線程技術(shù)用于實(shí)現(xiàn)組件的報(bào)警功能。計(jì)算機(jī)在監(jiān)測(cè)到輸入的數(shù)據(jù)超過(guò)警戒值時(shí)觸發(fā)報(bào)警事件,驅(qū)動(dòng)蜂鳴器發(fā)出報(bào)警聲音。在報(bào)警的同時(shí),計(jì)算機(jī)要繼續(xù)顯示并檢測(cè)現(xiàn)場(chǎng),因此需要啟動(dòng)多個(gè)線程,實(shí)現(xiàn)兩個(gè)功能的并行。
三是要解決控件繪圖中的閃爍問(wèn)題。在控件運(yùn)行中,由于數(shù)值的改變需要不斷地重繪,這就造成了控件的閃爍。為了解決這個(gè)問(wèn)題可以采用以下幾種辦法:(1)僅重繪控件中改變的部分。
(2)采用雙緩存。具體做法是在控件的構(gòu)造函數(shù)中添加代碼:SetStyle(ControlStyles.UserPaint,true);SetStyle( ControlStyles.AllPaintingInWmPaint,true);//禁止擦除背景SetStyle(ControlStyles.DoubleBuffer,true);//雙緩沖這段代碼的意義如下:UserPaint如果為true,控件將自行繪制,而不是通過(guò)操作系統(tǒng)來(lái)繪制,此樣式僅適用于派生自Control的類;AllPaintingInWmPaint如果為true,控件將忽略WM_ERASEBKGND窗口消息以減少閃爍,僅當(dāng)UserPaint位設(shè)置為true時(shí),才應(yīng)當(dāng)應(yīng)用該樣式;DoubleBuffer如果為true,則繪制在緩沖區(qū)中進(jìn)行,完成后將結(jié)果輸出到屏幕上。雙重緩沖區(qū)可防止由控件重繪引起的閃爍。要完全啟用雙重緩沖,還必須將UserPaint和AllPaintingInWmPaint樣式位設(shè)置為true.
(3)在內(nèi)存中繪制圖形。GDI+函數(shù)向屏幕輸出并不是立即顯示在屏幕上,而是保存在顯存中,而顯卡每隔一段時(shí)間把顯存的內(nèi)容輸出到屏幕上。而如果控件的繪制不是在一個(gè)刷新周期內(nèi)完成,那勢(shì)必會(huì)造成閃爍。為解決這個(gè)問(wèn)題,控件的繪制可以在內(nèi)存中完成,然后利用一條命令再將之繪制到屏幕上。經(jīng)過(guò)試驗(yàn),這種方法效果良好。
溫度計(jì)、儀表盤組件的設(shè)計(jì)與實(shí)現(xiàn)溫度計(jì)組件功能分析:(1)顯示溫度:這是溫度計(jì)最基本的功能,通過(guò)水銀柱的升降顯示數(shù)據(jù)的變化,通過(guò)刻度讀出溫度值。(2)報(bào)警功能:在工業(yè)監(jiān)測(cè)中,當(dāng)檢測(cè)到溫度高于警戒溫度時(shí),要進(jìn)行聲光報(bào)警。(3)組件的屬性:對(duì)溫度計(jì)背景、水銀柱、文本、刻度等的顏色可以根據(jù)用戶的需要自由搭配,儀表量程可以根據(jù)測(cè)量要求設(shè)置。如表1所示。
解決讓水銀柱隨輸入的溫度升降的問(wèn)題。水銀柱實(shí)際上是一個(gè)矩形,讓水銀柱升降就是改變水銀柱高度。實(shí)現(xiàn)方法就是將原來(lái)的水銀柱用底色覆蓋,然后用新高度繪制一個(gè)新矩形,當(dāng)連續(xù)輸入溫度時(shí),水銀柱不斷重繪,由于人的視覺器官有一定的反應(yīng)時(shí)間差,所以不會(huì)察覺重繪,只繪觀察到水銀柱在做升降運(yùn)動(dòng)。儀表盤組件的功能要求類似,不同的是要通過(guò)指針的轉(zhuǎn)動(dòng)顯示速度值。所以關(guān)鍵是要通過(guò)旋轉(zhuǎn)坐標(biāo)系,實(shí)現(xiàn)指針的轉(zhuǎn)動(dòng)。儀表盤刻度是圓形排列的,要把坐標(biāo)轉(zhuǎn)移至中心,逆時(shí)針旋轉(zhuǎn)作圖。儀表盤組件設(shè)計(jì)中用到的相關(guān)方法函數(shù):TranslateTransform:坐標(biāo)原點(diǎn)移動(dòng)。
RotateTransform:以原點(diǎn)為中心,將圖形或文本旋轉(zhuǎn)一定角度。實(shí)現(xiàn)儀表指針的轉(zhuǎn)動(dòng)要通過(guò)輸入的數(shù)據(jù)計(jì)算需要轉(zhuǎn)動(dòng)角度y2.y2=(240/Graduate)*Pointvalue其中Graduate為量程,Pointvalue是輸入的數(shù)據(jù)。使用函數(shù)RotateTransform(y2+150),將指針旋轉(zhuǎn)到指定位置。
應(yīng)用實(shí)例是儀表和溫度計(jì)組件在“測(cè)溫測(cè)速監(jiān)控管理系統(tǒng)”中的應(yīng)用。下位機(jī)通過(guò)串行口發(fā)送檢測(cè)數(shù)據(jù),上位機(jī)用高級(jí)語(yǔ)言編程實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)監(jiān)控和數(shù)據(jù)管理。系統(tǒng)通過(guò)數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)管理功能,調(diào)用組件,實(shí)現(xiàn)數(shù)據(jù)顯示的圖形化。該系統(tǒng)利用組件技術(shù)實(shí)現(xiàn)界面模擬儀表的軟件重用,在滿足界面美觀、功能完善的同時(shí),簡(jiǎn)化編程工作量、提高設(shè)計(jì)效率。經(jīng)過(guò)該系統(tǒng)的測(cè)試,儀表組件顯示正常,各項(xiàng)功能穩(wěn)定。
結(jié)束語(yǔ)組件技術(shù)對(duì)提高軟件開發(fā)效率、減輕維護(hù)負(fù)擔(dān)、保證軟件質(zhì)量和版本的健壯、更新都具有非常重要的意義。本文提出利用組件技術(shù),開發(fā)一個(gè)可移植性強(qiáng)的通用工控圖形儀表組件庫(kù),根據(jù)用戶的不同需求嵌入到各種具體的應(yīng)用設(shè)計(jì)中,具有極大的靈活性和實(shí)用性。http://m.web-tv.com.cn