張 勇 侯立剛 肖炎良 周 翔
(遼寧石油化工大學(xué)信息與控制工程學(xué)院,遼寧 撫順 113001)
組態(tài)軟件是工業(yè)控制系統(tǒng)中實現(xiàn)分散控制和集中管理的核心,而實時數(shù)據(jù)庫又是組態(tài)軟件的核心。實時數(shù)據(jù)庫保存著系統(tǒng)運行時所產(chǎn)生的動態(tài)數(shù)據(jù)和系統(tǒng)正常運行所需的各種內(nèi)部信息,各功能模塊通過對實時數(shù)據(jù)庫中數(shù)據(jù)的存取和處理來完成系統(tǒng)所要求的各種功能。同時,實時數(shù)據(jù)庫也是聯(lián)系圖形系統(tǒng)、歷史數(shù)據(jù)系統(tǒng)、報表系統(tǒng)和報警系統(tǒng)的橋梁和紐帶[1]。實時數(shù)據(jù)庫及時準(zhǔn)確地獲取現(xiàn)場數(shù)據(jù)是系統(tǒng)發(fā)揮作用的前提。鑒于商業(yè)性的原因,許多公司對實時數(shù)據(jù)庫技術(shù)嚴(yán)加保密。因此,有必要深入探討和研究實時數(shù)據(jù)庫的核心技術(shù),自行開發(fā)適用的實時數(shù)據(jù)庫系統(tǒng)。
實時數(shù)據(jù)庫系統(tǒng)是指其數(shù)據(jù)和事務(wù)都具有顯式的定時特性或確定的定時限制的數(shù)據(jù)庫系統(tǒng),系統(tǒng)的正確性不僅依賴于事務(wù)的邏輯結(jié)果,而且依賴于該邏輯結(jié)果所產(chǎn)生的時間[2]。實時數(shù)據(jù)庫系統(tǒng)的主要目標(biāo)是使盡量多的事務(wù)在規(guī)定的時間內(nèi)完成,而不是公平地分配系統(tǒng)資源,即系統(tǒng)寧可接收在時間限度內(nèi)不準(zhǔn)確的數(shù)據(jù),也不接收超過時間限制的準(zhǔn)確數(shù)據(jù)。實時數(shù)據(jù)庫系統(tǒng)的研究內(nèi)容包括實時數(shù)據(jù)庫及其事務(wù)調(diào)度系統(tǒng)??偟膩碚f,實時數(shù)據(jù)庫系統(tǒng)具有以下幾個特點:時間約束性、事務(wù)調(diào)度、數(shù)據(jù)存儲的特殊性和數(shù)據(jù)的在線壓縮。
①時間約束性。實時數(shù)據(jù)庫的特點是在其數(shù)據(jù)和事務(wù)上都具有明確的時間限制,即其中的數(shù)據(jù)不僅要滿足數(shù)據(jù)庫的普通一致性,還要滿足時間一致性。在實時系統(tǒng)中,具有時間約束的數(shù)據(jù)主要是外部現(xiàn)場動態(tài)變化的數(shù)據(jù)和由這些數(shù)據(jù)導(dǎo)出或衍生的數(shù)據(jù)。因此,可將數(shù)據(jù)的時間約束分為兩類:數(shù)據(jù)的絕對一致性和數(shù)據(jù)的相互一致性。數(shù)據(jù)的絕對一致性是指實時數(shù)據(jù)庫的數(shù)據(jù)與外部數(shù)據(jù)(即環(huán)境數(shù)據(jù))相一致;相對一致性是要求從一組數(shù)據(jù)項導(dǎo)出另一組數(shù)據(jù)時,源數(shù)據(jù)項在時間上要盡量接近。
②事務(wù)調(diào)度。與傳統(tǒng)數(shù)據(jù)庫系統(tǒng)不同的是,為提高事務(wù)的吞吐率,實時數(shù)據(jù)庫是為了達(dá)到使盡量多的事務(wù)在規(guī)定期限內(nèi)完成而使用事務(wù)調(diào)度。實時數(shù)據(jù)庫中的實時事務(wù)調(diào)度大部分是建立在事務(wù)的優(yōu)先級之上的。因此,實時事務(wù)調(diào)度不僅要考慮事務(wù)的執(zhí)行時間,還要考慮事務(wù)的截止時間和緊迫程度等。
③數(shù)據(jù)存儲方式。由于實時數(shù)據(jù)庫系統(tǒng)中存儲和管理的數(shù)據(jù)具有實時性,因此其存儲方式也有別于傳統(tǒng)的數(shù)據(jù)庫系統(tǒng)。在系統(tǒng)運行過程中,對實時性要求較高的數(shù)據(jù)應(yīng)存于內(nèi)存中,以實現(xiàn)讀取速度快、實時性良好等特點,易于數(shù)據(jù)的共享與傳遞;對實時性要求不高的非共享數(shù)據(jù)和共享數(shù)據(jù),可以存放于外存儲空間。因此,在設(shè)計實時數(shù)據(jù)庫時,需要妥善處理時間與存儲空間之間的矛盾,以保證系統(tǒng)的實時性。
④數(shù)據(jù)在線壓縮。在實際的數(shù)據(jù)存儲中,實時數(shù)據(jù)庫還要解決如何高效處理海量數(shù)據(jù)的問題。如果數(shù)據(jù)被原封不動地存儲,勢必需要大量內(nèi)存和磁盤空間以及耗費大量的CPU時間。因此,必須對實時數(shù)據(jù)進行在線壓縮存儲[3]。
由于傳統(tǒng)數(shù)據(jù)庫基本上都是面向事務(wù)的,它所使用的數(shù)據(jù)表示方法、存儲模式和存取手段已不能滿足工控組態(tài)軟件對實時性的要求,因此有必要根據(jù)組態(tài)軟件,對不同類型的數(shù)據(jù)所要求的響應(yīng)速度和數(shù)據(jù)量的大小來定制存儲策略。對于工業(yè)現(xiàn)場中每個采樣周期都要更新、變化的實時性很強的數(shù)據(jù),可以將這些數(shù)據(jù)存于內(nèi)存數(shù)據(jù)庫,這樣就能滿足數(shù)據(jù)存取速度快、存取靈活的要求;對工控軟件并無特殊要求的非共享數(shù)據(jù)和共享數(shù)據(jù),這些數(shù)據(jù)是非實時性要求的,可存放于外存數(shù)據(jù)庫(如Access數(shù)據(jù)庫等),并且可通過實時數(shù)據(jù)庫提供的接口函數(shù)進行數(shù)據(jù)的操作;對需要長期保存的非共享數(shù)據(jù),如采樣值的數(shù)/模轉(zhuǎn)換系數(shù)、控制組態(tài)值等,可用文件管理系統(tǒng)進行直接存?。?]。
綜上所述,可通過使用外存數(shù)據(jù)庫(Access數(shù)據(jù)庫)、文件管理系統(tǒng)和內(nèi)存數(shù)據(jù)庫(實時數(shù)據(jù)庫)等多種存取方式、多種存儲介質(zhì)相結(jié)合的方法存儲數(shù)據(jù),以保證數(shù)據(jù)的共享性和獨立性。同時還能達(dá)到節(jié)約內(nèi)存、保證系統(tǒng)響應(yīng)速度的目的[5]。
本文采用面向?qū)ο缶幊?object-oriented programming,OOP)技術(shù),將實時數(shù)據(jù)庫定義為類的形式,各功能模塊通過對實時數(shù)據(jù)庫的接口函數(shù)調(diào)用,實現(xiàn)與實時數(shù)據(jù)庫的關(guān)聯(lián)。
系統(tǒng)運行時按用戶組態(tài)好的數(shù)據(jù)文件生成不同類型的實時數(shù)據(jù)類對象。這些類建立的對象分別對應(yīng)于現(xiàn)場的每個實時量。由于實時量很多,為了能夠方便地管理這些對象,完成對數(shù)據(jù)的各種操作管理,將管理程序的所有功能封裝成一個專用的類Mdataunit,用Mdataunit類將這些實時數(shù)據(jù)庫的各個對象聚集起來,以便管理。具體的聚集方法是:首先根據(jù)不同的數(shù)據(jù)類建立起不同的List鏈表,通過鏈表將這些不同的結(jié)構(gòu)連接起來;然后把這些建立起來的鏈表作為Mdataunit的數(shù)據(jù)成員進行管理?,F(xiàn)將實時數(shù)據(jù)庫類的各操作函數(shù)定義為以下幾個模塊,如圖1所示。
圖1 實時數(shù)據(jù)庫類Fig.1 Category of real-time database
部分實時數(shù)據(jù)庫類的設(shè)計程序如下。
實時數(shù)據(jù)庫系統(tǒng)事務(wù)調(diào)度如圖2所示。
圖2 實時數(shù)據(jù)庫系統(tǒng)事務(wù)調(diào)度Fig.2 Transaction scheduling of real-time database system
在組態(tài)軟件系統(tǒng)進入運行環(huán)境時,還要進行現(xiàn)場數(shù)據(jù)采集、數(shù)據(jù)處理、圖形顯示和報警事務(wù)等操作,所有的事務(wù)要求并行處理。如果等待時間過長,將無法滿足實時性要求,這就需要一個事務(wù)調(diào)度并按照事務(wù)的優(yōu)先級統(tǒng)一調(diào)度,完成各事務(wù)的協(xié)調(diào)工作,以滿足系統(tǒng)實時性要求[6]。為此,先建立三個優(yōu)先級:實時數(shù)據(jù)請求類、趨勢數(shù)據(jù)請求類和歷史數(shù)據(jù)類。在進行調(diào)度時,根據(jù)先到先服務(wù)的原則將任務(wù)放置于不同的優(yōu)先級隊列中,然后以不同的優(yōu)先級進行調(diào)度,在同一隊列中采用時間片輪轉(zhuǎn)算法實現(xiàn)服務(wù)先后。
時間片輪轉(zhuǎn)法是一種經(jīng)典的調(diào)度算法,其基本思想是將處理機的處理時間劃分成一個個的時間片,就緒隊列中的諸進程按所分配的時間片輪流使用處理機資源。進程調(diào)度程序總是選擇就緒隊列中的第一個進程,當(dāng)進程分配的時間片用完時,這個進程就被強迫讓出處理機,并且進入就緒隊列的末尾重新排隊,等待下一次調(diào)度。同時,進程調(diào)度又去選擇就緒隊列中的下一個進程,分配給它一個時間片,以投入運行。如此循環(huán)往復(fù),實現(xiàn)實時調(diào)度各事務(wù)。
工業(yè)控制中的數(shù)據(jù)包括現(xiàn)場采集的數(shù)據(jù)、組態(tài)參數(shù)、計算數(shù)據(jù)、屬性數(shù)據(jù)和控制數(shù)據(jù)等。這些數(shù)據(jù)既有模擬量、數(shù)字量,也有字符型量。本文選用VC++作為開發(fā)工具,利用面向?qū)ο蠹夹g(shù),將實時數(shù)據(jù)庫中的數(shù)據(jù)對象類分為模擬量、數(shù)字量和字符串三種,分別定義為模擬量類CAnalog、數(shù)字量類CDigital和字符串類CMystring。所有的類均派生自CObject類。CObject類是Windows系統(tǒng)下用于表示對象的最基本類,是一個抽象類。實時數(shù)據(jù)庫定義的所有域都是相應(yīng)實時數(shù)據(jù)庫類的屬性。此外,每種實時數(shù)據(jù)庫類由特定的成員函數(shù)進行屬性的處理。下面給出模擬量類定義的部分程序,其他類的定義基本相似。
為了節(jié)省內(nèi)存、提高程序的執(zhí)行效率,本文利用動態(tài)鏈接庫(dynamic link library,DLL)和全局內(nèi)存共享技術(shù)來建立系統(tǒng)運行時的實時數(shù)據(jù)庫。動態(tài)鏈接庫DLL是Windows中的一種特殊的程序單元,被稱為非任務(wù)的可執(zhí)行模塊,它們由調(diào)用者的任務(wù)所驅(qū)動。動態(tài)鏈接是相對于靜態(tài)鏈接來定義的,靜態(tài)鏈接是由連接程序?qū)㈧o態(tài)連接庫中的函數(shù)或資源在連接時拷貝給每個運行程序[7-8]。
在VC++6.0新建窗口中擴展生成DLL的VC程序框架,在生成的程序框架中定義動態(tài)鏈接庫的數(shù)據(jù)結(jié)構(gòu)后,把實時數(shù)據(jù)封裝為一個類 CVariable-Database[8],它是 MFC 中的類 CDatabase的派生。所有數(shù)據(jù)庫接口訪問函數(shù)定義為類CVariableDatabase的成員函數(shù)。將CVariableDatabase類作為輸出類,便于管理和維護。下面是動態(tài)鏈接庫類的具體實現(xiàn)。
實時數(shù)據(jù)庫接口是系統(tǒng)提供給用戶的一個開放的接口規(guī)范,它允許用戶利用該接口直接訪問實時數(shù)據(jù)庫。這就為用戶開發(fā)輸入輸出接口驅(qū)動程序和用戶算法模塊提供了方便快捷的途徑[9-10]。動態(tài)鏈接庫中的類CVariableDatabase的實現(xiàn),為數(shù)據(jù)庫提供了一套實時數(shù)據(jù)庫接口,用于實現(xiàn)用戶與實時數(shù)據(jù)庫之間的高速數(shù)據(jù)傳遞和對實時數(shù)據(jù)庫的讀寫、查詢和管理等功能。
由于系統(tǒng)直接利用這些接口函數(shù)實現(xiàn)和實時數(shù)據(jù)庫的數(shù)據(jù)交換,因此,系統(tǒng)不但具有全面的開放性和二次開發(fā)的功能,且其實時性也大大優(yōu)于其他數(shù)據(jù)交換協(xié)議。
組態(tài)軟件中的實時數(shù)據(jù)庫技術(shù)是當(dāng)前較新的數(shù)據(jù)庫研究方向,有很大的發(fā)展空間與潛力。本文采用面向?qū)ο蟮脑O(shè)計思想,將實時數(shù)據(jù)庫的操作以類的方式實現(xiàn),并且利用類的繼承、派生和重載等特性提高程序質(zhì)量;利用動態(tài)鏈接庫和全局內(nèi)存共享技術(shù)來建立系統(tǒng)實時數(shù)據(jù)庫,并為用戶提供一組接口函數(shù)實現(xiàn)數(shù)據(jù)庫的訪問,大大提高了實時數(shù)據(jù)庫系統(tǒng)的實時性與開放性。
[1]王荃,金海東,李福中.工控組態(tài)軟件實時數(shù)據(jù)庫系統(tǒng)的設(shè)計與實現(xiàn)[J].化工自動化及儀表,2000,27(3):40 -43.
[2]王成光,蘇宏業(yè),褚健.石化企業(yè)大型實時數(shù)據(jù)庫系統(tǒng)的結(jié)構(gòu)設(shè)計[J].化工自動化及儀表,2002,29(5):7 -11.
[3]錢笑宇,張彥武.工業(yè)實時數(shù)據(jù)庫的研究和設(shè)計[J].計算機工程,2005,31(5):98 -132.
[4]張會彥,周麗虹.新型構(gòu)件化組態(tài)軟件中實時數(shù)據(jù)庫設(shè)計與實現(xiàn)[J].計算機應(yīng)用于軟件,2009,26(7):153 -174.
[5]楊華麗,石銳,胡捷,等.組態(tài)軟件中實時數(shù)據(jù)庫系統(tǒng)的設(shè)計和實現(xiàn)[J].實驗技術(shù)與管理,2007,24(3):80 -83.
[6]宋清昆,孫元娜,王學(xué)偉,等.組態(tài)軟件實時數(shù)據(jù)庫系統(tǒng)的設(shè)計[J].計算機應(yīng)用,2008,27(1):55 -57.
[7]闞宏進,劉希遠(yuǎn),李翠玲.基于VC++工控組態(tài)軟件實時數(shù)據(jù)庫系統(tǒng)的設(shè)計[J].甘肅工業(yè)大學(xué)學(xué)報,2001,27(4):73 -76.
[8]孫鑫,余安萍.VC++深入詳解[M].北京:電子工業(yè)出版社,2006.
[9]楊立保,許忠仁.組態(tài)軟件實時數(shù)據(jù)庫的研究與設(shè)計[J].自動化儀表,2009,30(8):19 -21.
[10]姜軍銀,侯立剛.基于COM技術(shù)的通用數(shù)據(jù)庫存取組件的設(shè)計[J].遼寧石油化工大學(xué)學(xué)報,2005,25(1):75-77.