張 勇 侯立剛 肖炎良 周 翔
(遼寧石油化工大學(xué)信息與控制工程學(xué)院,遼寧 撫順 113001)
組態(tài)軟件是工業(yè)控制系統(tǒng)中實(shí)現(xiàn)分散控制和集中管理的核心,而實(shí)時(shí)數(shù)據(jù)庫(kù)又是組態(tài)軟件的核心。實(shí)時(shí)數(shù)據(jù)庫(kù)保存著系統(tǒng)運(yùn)行時(shí)所產(chǎn)生的動(dòng)態(tài)數(shù)據(jù)和系統(tǒng)正常運(yùn)行所需的各種內(nèi)部信息,各功能模塊通過(guò)對(duì)實(shí)時(shí)數(shù)據(jù)庫(kù)中數(shù)據(jù)的存取和處理來(lái)完成系統(tǒng)所要求的各種功能。同時(shí),實(shí)時(shí)數(shù)據(jù)庫(kù)也是聯(lián)系圖形系統(tǒng)、歷史數(shù)據(jù)系統(tǒng)、報(bào)表系統(tǒng)和報(bào)警系統(tǒng)的橋梁和紐帶[1]。實(shí)時(shí)數(shù)據(jù)庫(kù)及時(shí)準(zhǔn)確地獲取現(xiàn)場(chǎng)數(shù)據(jù)是系統(tǒng)發(fā)揮作用的前提。鑒于商業(yè)性的原因,許多公司對(duì)實(shí)時(shí)數(shù)據(jù)庫(kù)技術(shù)嚴(yán)加保密。因此,有必要深入探討和研究實(shí)時(shí)數(shù)據(jù)庫(kù)的核心技術(shù),自行開(kāi)發(fā)適用的實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)。
實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)是指其數(shù)據(jù)和事務(wù)都具有顯式的定時(shí)特性或確定的定時(shí)限制的數(shù)據(jù)庫(kù)系統(tǒng),系統(tǒng)的正確性不僅依賴(lài)于事務(wù)的邏輯結(jié)果,而且依賴(lài)于該邏輯結(jié)果所產(chǎn)生的時(shí)間[2]。實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)的主要目標(biāo)是使盡量多的事務(wù)在規(guī)定的時(shí)間內(nèi)完成,而不是公平地分配系統(tǒng)資源,即系統(tǒng)寧可接收在時(shí)間限度內(nèi)不準(zhǔn)確的數(shù)據(jù),也不接收超過(guò)時(shí)間限制的準(zhǔn)確數(shù)據(jù)。實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)的研究?jī)?nèi)容包括實(shí)時(shí)數(shù)據(jù)庫(kù)及其事務(wù)調(diào)度系統(tǒng)。總的來(lái)說(shuō),實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)具有以下幾個(gè)特點(diǎn):時(shí)間約束性、事務(wù)調(diào)度、數(shù)據(jù)存儲(chǔ)的特殊性和數(shù)據(jù)的在線壓縮。
①時(shí)間約束性。實(shí)時(shí)數(shù)據(jù)庫(kù)的特點(diǎn)是在其數(shù)據(jù)和事務(wù)上都具有明確的時(shí)間限制,即其中的數(shù)據(jù)不僅要滿(mǎn)足數(shù)據(jù)庫(kù)的普通一致性,還要滿(mǎn)足時(shí)間一致性。在實(shí)時(shí)系統(tǒng)中,具有時(shí)間約束的數(shù)據(jù)主要是外部現(xiàn)場(chǎng)動(dòng)態(tài)變化的數(shù)據(jù)和由這些數(shù)據(jù)導(dǎo)出或衍生的數(shù)據(jù)。因此,可將數(shù)據(jù)的時(shí)間約束分為兩類(lèi):數(shù)據(jù)的絕對(duì)一致性和數(shù)據(jù)的相互一致性。數(shù)據(jù)的絕對(duì)一致性是指實(shí)時(shí)數(shù)據(jù)庫(kù)的數(shù)據(jù)與外部數(shù)據(jù)(即環(huán)境數(shù)據(jù))相一致;相對(duì)一致性是要求從一組數(shù)據(jù)項(xiàng)導(dǎo)出另一組數(shù)據(jù)時(shí),源數(shù)據(jù)項(xiàng)在時(shí)間上要盡量接近。
②事務(wù)調(diào)度。與傳統(tǒng)數(shù)據(jù)庫(kù)系統(tǒng)不同的是,為提高事務(wù)的吞吐率,實(shí)時(shí)數(shù)據(jù)庫(kù)是為了達(dá)到使盡量多的事務(wù)在規(guī)定期限內(nèi)完成而使用事務(wù)調(diào)度。實(shí)時(shí)數(shù)據(jù)庫(kù)中的實(shí)時(shí)事務(wù)調(diào)度大部分是建立在事務(wù)的優(yōu)先級(jí)之上的。因此,實(shí)時(shí)事務(wù)調(diào)度不僅要考慮事務(wù)的執(zhí)行時(shí)間,還要考慮事務(wù)的截止時(shí)間和緊迫程度等。
③數(shù)據(jù)存儲(chǔ)方式。由于實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)中存儲(chǔ)和管理的數(shù)據(jù)具有實(shí)時(shí)性,因此其存儲(chǔ)方式也有別于傳統(tǒng)的數(shù)據(jù)庫(kù)系統(tǒng)。在系統(tǒng)運(yùn)行過(guò)程中,對(duì)實(shí)時(shí)性要求較高的數(shù)據(jù)應(yīng)存于內(nèi)存中,以實(shí)現(xiàn)讀取速度快、實(shí)時(shí)性良好等特點(diǎn),易于數(shù)據(jù)的共享與傳遞;對(duì)實(shí)時(shí)性要求不高的非共享數(shù)據(jù)和共享數(shù)據(jù),可以存放于外存儲(chǔ)空間。因此,在設(shè)計(jì)實(shí)時(shí)數(shù)據(jù)庫(kù)時(shí),需要妥善處理時(shí)間與存儲(chǔ)空間之間的矛盾,以保證系統(tǒng)的實(shí)時(shí)性。
④數(shù)據(jù)在線壓縮。在實(shí)際的數(shù)據(jù)存儲(chǔ)中,實(shí)時(shí)數(shù)據(jù)庫(kù)還要解決如何高效處理海量數(shù)據(jù)的問(wèn)題。如果數(shù)據(jù)被原封不動(dòng)地存儲(chǔ),勢(shì)必需要大量?jī)?nèi)存和磁盤(pán)空間以及耗費(fèi)大量的CPU時(shí)間。因此,必須對(duì)實(shí)時(shí)數(shù)據(jù)進(jìn)行在線壓縮存儲(chǔ)[3]。
由于傳統(tǒng)數(shù)據(jù)庫(kù)基本上都是面向事務(wù)的,它所使用的數(shù)據(jù)表示方法、存儲(chǔ)模式和存取手段已不能滿(mǎn)足工控組態(tài)軟件對(duì)實(shí)時(shí)性的要求,因此有必要根據(jù)組態(tài)軟件,對(duì)不同類(lèi)型的數(shù)據(jù)所要求的響應(yīng)速度和數(shù)據(jù)量的大小來(lái)定制存儲(chǔ)策略。對(duì)于工業(yè)現(xiàn)場(chǎng)中每個(gè)采樣周期都要更新、變化的實(shí)時(shí)性很強(qiáng)的數(shù)據(jù),可以將這些數(shù)據(jù)存于內(nèi)存數(shù)據(jù)庫(kù),這樣就能滿(mǎn)足數(shù)據(jù)存取速度快、存取靈活的要求;對(duì)工控軟件并無(wú)特殊要求的非共享數(shù)據(jù)和共享數(shù)據(jù),這些數(shù)據(jù)是非實(shí)時(shí)性要求的,可存放于外存數(shù)據(jù)庫(kù)(如Access數(shù)據(jù)庫(kù)等),并且可通過(guò)實(shí)時(shí)數(shù)據(jù)庫(kù)提供的接口函數(shù)進(jìn)行數(shù)據(jù)的操作;對(duì)需要長(zhǎng)期保存的非共享數(shù)據(jù),如采樣值的數(shù)/模轉(zhuǎn)換系數(shù)、控制組態(tài)值等,可用文件管理系統(tǒng)進(jìn)行直接存取[4]。
綜上所述,可通過(guò)使用外存數(shù)據(jù)庫(kù)(Access數(shù)據(jù)庫(kù))、文件管理系統(tǒng)和內(nèi)存數(shù)據(jù)庫(kù)(實(shí)時(shí)數(shù)據(jù)庫(kù))等多種存取方式、多種存儲(chǔ)介質(zhì)相結(jié)合的方法存儲(chǔ)數(shù)據(jù),以保證數(shù)據(jù)的共享性和獨(dú)立性。同時(shí)還能達(dá)到節(jié)約內(nèi)存、保證系統(tǒng)響應(yīng)速度的目的[5]。
本文采用面向?qū)ο缶幊?object-oriented programming,OOP)技術(shù),將實(shí)時(shí)數(shù)據(jù)庫(kù)定義為類(lèi)的形式,各功能模塊通過(guò)對(duì)實(shí)時(shí)數(shù)據(jù)庫(kù)的接口函數(shù)調(diào)用,實(shí)現(xiàn)與實(shí)時(shí)數(shù)據(jù)庫(kù)的關(guān)聯(lián)。
系統(tǒng)運(yùn)行時(shí)按用戶(hù)組態(tài)好的數(shù)據(jù)文件生成不同類(lèi)型的實(shí)時(shí)數(shù)據(jù)類(lèi)對(duì)象。這些類(lèi)建立的對(duì)象分別對(duì)應(yīng)于現(xiàn)場(chǎng)的每個(gè)實(shí)時(shí)量。由于實(shí)時(shí)量很多,為了能夠方便地管理這些對(duì)象,完成對(duì)數(shù)據(jù)的各種操作管理,將管理程序的所有功能封裝成一個(gè)專(zhuān)用的類(lèi)Mdataunit,用Mdataunit類(lèi)將這些實(shí)時(shí)數(shù)據(jù)庫(kù)的各個(gè)對(duì)象聚集起來(lái),以便管理。具體的聚集方法是:首先根據(jù)不同的數(shù)據(jù)類(lèi)建立起不同的List鏈表,通過(guò)鏈表將這些不同的結(jié)構(gòu)連接起來(lái);然后把這些建立起來(lái)的鏈表作為Mdataunit的數(shù)據(jù)成員進(jìn)行管理。現(xiàn)將實(shí)時(shí)數(shù)據(jù)庫(kù)類(lèi)的各操作函數(shù)定義為以下幾個(gè)模塊,如圖1所示。

圖1 實(shí)時(shí)數(shù)據(jù)庫(kù)類(lèi)Fig.1 Category of real-time database
部分實(shí)時(shí)數(shù)據(jù)庫(kù)類(lèi)的設(shè)計(jì)程序如下。


實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)事務(wù)調(diào)度如圖2所示。

圖2 實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)事務(wù)調(diào)度Fig.2 Transaction scheduling of real-time database system
在組態(tài)軟件系統(tǒng)進(jìn)入運(yùn)行環(huán)境時(shí),還要進(jìn)行現(xiàn)場(chǎng)數(shù)據(jù)采集、數(shù)據(jù)處理、圖形顯示和報(bào)警事務(wù)等操作,所有的事務(wù)要求并行處理。如果等待時(shí)間過(guò)長(zhǎng),將無(wú)法滿(mǎn)足實(shí)時(shí)性要求,這就需要一個(gè)事務(wù)調(diào)度并按照事務(wù)的優(yōu)先級(jí)統(tǒng)一調(diào)度,完成各事務(wù)的協(xié)調(diào)工作,以滿(mǎn)足系統(tǒng)實(shí)時(shí)性要求[6]。為此,先建立三個(gè)優(yōu)先級(jí):實(shí)時(shí)數(shù)據(jù)請(qǐng)求類(lèi)、趨勢(shì)數(shù)據(jù)請(qǐng)求類(lèi)和歷史數(shù)據(jù)類(lèi)。在進(jìn)行調(diào)度時(shí),根據(jù)先到先服務(wù)的原則將任務(wù)放置于不同的優(yōu)先級(jí)隊(duì)列中,然后以不同的優(yōu)先級(jí)進(jìn)行調(diào)度,在同一隊(duì)列中采用時(shí)間片輪轉(zhuǎn)算法實(shí)現(xiàn)服務(wù)先后。
時(shí)間片輪轉(zhuǎn)法是一種經(jīng)典的調(diào)度算法,其基本思想是將處理機(jī)的處理時(shí)間劃分成一個(gè)個(gè)的時(shí)間片,就緒隊(duì)列中的諸進(jìn)程按所分配的時(shí)間片輪流使用處理機(jī)資源。進(jìn)程調(diào)度程序總是選擇就緒隊(duì)列中的第一個(gè)進(jìn)程,當(dāng)進(jìn)程分配的時(shí)間片用完時(shí),這個(gè)進(jìn)程就被強(qiáng)迫讓出處理機(jī),并且進(jìn)入就緒隊(duì)列的末尾重新排隊(duì),等待下一次調(diào)度。同時(shí),進(jìn)程調(diào)度又去選擇就緒隊(duì)列中的下一個(gè)進(jìn)程,分配給它一個(gè)時(shí)間片,以投入運(yùn)行。如此循環(huán)往復(fù),實(shí)現(xiàn)實(shí)時(shí)調(diào)度各事務(wù)。
工業(yè)控制中的數(shù)據(jù)包括現(xiàn)場(chǎng)采集的數(shù)據(jù)、組態(tài)參數(shù)、計(jì)算數(shù)據(jù)、屬性數(shù)據(jù)和控制數(shù)據(jù)等。這些數(shù)據(jù)既有模擬量、數(shù)字量,也有字符型量。本文選用VC++作為開(kāi)發(fā)工具,利用面向?qū)ο蠹夹g(shù),將實(shí)時(shí)數(shù)據(jù)庫(kù)中的數(shù)據(jù)對(duì)象類(lèi)分為模擬量、數(shù)字量和字符串三種,分別定義為模擬量類(lèi)CAnalog、數(shù)字量類(lèi)CDigital和字符串類(lèi)CMystring。所有的類(lèi)均派生自CObject類(lèi)。CObject類(lèi)是Windows系統(tǒng)下用于表示對(duì)象的最基本類(lèi),是一個(gè)抽象類(lèi)。實(shí)時(shí)數(shù)據(jù)庫(kù)定義的所有域都是相應(yīng)實(shí)時(shí)數(shù)據(jù)庫(kù)類(lèi)的屬性。此外,每種實(shí)時(shí)數(shù)據(jù)庫(kù)類(lèi)由特定的成員函數(shù)進(jìn)行屬性的處理。下面給出模擬量類(lèi)定義的部分程序,其他類(lèi)的定義基本相似。


為了節(jié)省內(nèi)存、提高程序的執(zhí)行效率,本文利用動(dòng)態(tài)鏈接庫(kù)(dynamic link library,DLL)和全局內(nèi)存共享技術(shù)來(lái)建立系統(tǒng)運(yùn)行時(shí)的實(shí)時(shí)數(shù)據(jù)庫(kù)。動(dòng)態(tài)鏈接庫(kù)DLL是Windows中的一種特殊的程序單元,被稱(chēng)為非任務(wù)的可執(zhí)行模塊,它們由調(diào)用者的任務(wù)所驅(qū)動(dòng)。動(dòng)態(tài)鏈接是相對(duì)于靜態(tài)鏈接來(lái)定義的,靜態(tài)鏈接是由連接程序?qū)㈧o態(tài)連接庫(kù)中的函數(shù)或資源在連接時(shí)拷貝給每個(gè)運(yùn)行程序[7-8]。
在VC++6.0新建窗口中擴(kuò)展生成DLL的VC程序框架,在生成的程序框架中定義動(dòng)態(tài)鏈接庫(kù)的數(shù)據(jù)結(jié)構(gòu)后,把實(shí)時(shí)數(shù)據(jù)封裝為一個(gè)類(lèi) CVariable-Database[8],它是 MFC 中的類(lèi) CDatabase的派生。所有數(shù)據(jù)庫(kù)接口訪問(wèn)函數(shù)定義為類(lèi)CVariableDatabase的成員函數(shù)。將CVariableDatabase類(lèi)作為輸出類(lèi),便于管理和維護(hù)。下面是動(dòng)態(tài)鏈接庫(kù)類(lèi)的具體實(shí)現(xiàn)。


實(shí)時(shí)數(shù)據(jù)庫(kù)接口是系統(tǒng)提供給用戶(hù)的一個(gè)開(kāi)放的接口規(guī)范,它允許用戶(hù)利用該接口直接訪問(wèn)實(shí)時(shí)數(shù)據(jù)庫(kù)。這就為用戶(hù)開(kāi)發(fā)輸入輸出接口驅(qū)動(dòng)程序和用戶(hù)算法模塊提供了方便快捷的途徑[9-10]。動(dòng)態(tài)鏈接庫(kù)中的類(lèi)CVariableDatabase的實(shí)現(xiàn),為數(shù)據(jù)庫(kù)提供了一套實(shí)時(shí)數(shù)據(jù)庫(kù)接口,用于實(shí)現(xiàn)用戶(hù)與實(shí)時(shí)數(shù)據(jù)庫(kù)之間的高速數(shù)據(jù)傳遞和對(duì)實(shí)時(shí)數(shù)據(jù)庫(kù)的讀寫(xiě)、查詢(xún)和管理等功能。
由于系統(tǒng)直接利用這些接口函數(shù)實(shí)現(xiàn)和實(shí)時(shí)數(shù)據(jù)庫(kù)的數(shù)據(jù)交換,因此,系統(tǒng)不但具有全面的開(kāi)放性和二次開(kāi)發(fā)的功能,且其實(shí)時(shí)性也大大優(yōu)于其他數(shù)據(jù)交換協(xié)議。
組態(tài)軟件中的實(shí)時(shí)數(shù)據(jù)庫(kù)技術(shù)是當(dāng)前較新的數(shù)據(jù)庫(kù)研究方向,有很大的發(fā)展空間與潛力。本文采用面向?qū)ο蟮脑O(shè)計(jì)思想,將實(shí)時(shí)數(shù)據(jù)庫(kù)的操作以類(lèi)的方式實(shí)現(xiàn),并且利用類(lèi)的繼承、派生和重載等特性提高程序質(zhì)量;利用動(dòng)態(tài)鏈接庫(kù)和全局內(nèi)存共享技術(shù)來(lái)建立系統(tǒng)實(shí)時(shí)數(shù)據(jù)庫(kù),并為用戶(hù)提供一組接口函數(shù)實(shí)現(xiàn)數(shù)據(jù)庫(kù)的訪問(wèn),大大提高了實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)的實(shí)時(shí)性與開(kāi)放性。
[1]王荃,金海東,李福中.工控組態(tài)軟件實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].化工自動(dòng)化及儀表,2000,27(3):40 -43.
[2]王成光,蘇宏業(yè),褚健.石化企業(yè)大型實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)的結(jié)構(gòu)設(shè)計(jì)[J].化工自動(dòng)化及儀表,2002,29(5):7 -11.
[3]錢(qián)笑宇,張彥武.工業(yè)實(shí)時(shí)數(shù)據(jù)庫(kù)的研究和設(shè)計(jì)[J].計(jì)算機(jī)工程,2005,31(5):98 -132.
[4]張會(huì)彥,周麗虹.新型構(gòu)件化組態(tài)軟件中實(shí)時(shí)數(shù)據(jù)庫(kù)設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用于軟件,2009,26(7):153 -174.
[5]楊華麗,石銳,胡捷,等.組態(tài)軟件中實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)[J].實(shí)驗(yàn)技術(shù)與管理,2007,24(3):80 -83.
[6]宋清昆,孫元娜,王學(xué)偉,等.組態(tài)軟件實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)的設(shè)計(jì)[J].計(jì)算機(jī)應(yīng)用,2008,27(1):55 -57.
[7]闞宏進(jìn),劉希遠(yuǎn),李翠玲.基于VC++工控組態(tài)軟件實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)的設(shè)計(jì)[J].甘肅工業(yè)大學(xué)學(xué)報(bào),2001,27(4):73 -76.
[8]孫鑫,余安萍.VC++深入詳解[M].北京:電子工業(yè)出版社,2006.
[9]楊立保,許忠仁.組態(tài)軟件實(shí)時(shí)數(shù)據(jù)庫(kù)的研究與設(shè)計(jì)[J].自動(dòng)化儀表,2009,30(8):19 -21.
[10]姜軍銀,侯立剛.基于COM技術(shù)的通用數(shù)據(jù)庫(kù)存取組件的設(shè)計(jì)[J].遼寧石油化工大學(xué)學(xué)報(bào),2005,25(1):75-77.