工控系統(tǒng)中實(shí)時(shí)數(shù)據(jù)庫(kù)關(guān)鍵技術(shù)研究與實(shí)現(xiàn)
1 引言
現(xiàn)代工業(yè)的特點(diǎn)要求全過(guò)程的實(shí)時(shí)監(jiān)控,高速的實(shí)時(shí)數(shù)據(jù)處理、長(zhǎng)期的歷史數(shù)據(jù)存儲(chǔ)以及生產(chǎn)信息的集成與共享。要滿足上述對(duì)生產(chǎn)數(shù)據(jù)的處理要求僅靠大量采用集散控制系統(tǒng)(DCS)和關(guān)系數(shù)據(jù)庫(kù)技術(shù)并不能完全解決問(wèn)題。DCS數(shù)據(jù)存儲(chǔ)能力有限,同時(shí)企業(yè)中異構(gòu)的DCS無(wú)法進(jìn)行有效的數(shù)據(jù)共享。而關(guān)系數(shù)據(jù)庫(kù)數(shù)據(jù)處理速度低,無(wú)法對(duì)生產(chǎn)過(guò)程數(shù)據(jù)進(jìn)行及時(shí)高效的存儲(chǔ)。
為了解決上述問(wèn)題,實(shí)時(shí)數(shù)據(jù)庫(kù)作為一個(gè)關(guān)鍵的支撐技術(shù)引入工業(yè)控制系統(tǒng)。在生產(chǎn)設(shè)備運(yùn)行過(guò)程中,實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)實(shí)時(shí)采集設(shè)備的運(yùn)行數(shù)據(jù),隨時(shí)掌握裝置的運(yùn)行情況,并通過(guò)對(duì)生產(chǎn)過(guò)程的關(guān)鍵數(shù)據(jù)的實(shí)時(shí)監(jiān)控分析,對(duì)出現(xiàn)的問(wèn)題即時(shí)進(jìn)行處理,使生產(chǎn)的運(yùn)行狀態(tài)保持平穩(wěn)。實(shí)時(shí)數(shù)據(jù)庫(kù)還是是連接工業(yè)生產(chǎn)控制系統(tǒng)與企業(yè)上層管理系統(tǒng)的橋梁,企業(yè)可以通過(guò)實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)提供的數(shù)據(jù)平臺(tái),為經(jīng)營(yíng)決策、計(jì)劃調(diào)度、先進(jìn)過(guò)程控制,質(zhì)量監(jiān)控等分系統(tǒng)提供同一的數(shù)據(jù)平臺(tái)。
2 實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)概念和特點(diǎn)
實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)(RTDBS)就是其事務(wù)和數(shù)據(jù)都可以有定時(shí)特性或顯式的定時(shí)限制的數(shù)據(jù)庫(kù)系統(tǒng)。系統(tǒng)的正確性不僅依賴于邏輯結(jié)果,而且還依賴于邏輯結(jié)果產(chǎn)生的時(shí)間。對(duì)于實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng),數(shù)據(jù)的一致性和執(zhí)行的周期性是重要的目標(biāo),由于在實(shí)時(shí)系統(tǒng)中經(jīng)常以固定的時(shí)間周期收集被控系統(tǒng)的實(shí)時(shí)數(shù)據(jù),相應(yīng)的控制系統(tǒng)也必須周期性地處理數(shù)據(jù)和作出響應(yīng);由于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)在一些時(shí)限要求嚴(yán)格的場(chǎng)合不能滿足實(shí)時(shí)系統(tǒng)對(duì)數(shù)據(jù)實(shí)時(shí)性的要求,而內(nèi)存直接尋址是一種具有高速的數(shù)據(jù)訪問(wèn)方式,在技術(shù)上采用內(nèi)存數(shù)據(jù)庫(kù)是解決這一問(wèn)題的理想解決方案。
整個(gè)實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)方案的設(shè)計(jì)分為駐內(nèi)和留外兩個(gè)部分,駐內(nèi)部分即為內(nèi)存數(shù)據(jù)庫(kù),是實(shí)時(shí)數(shù)據(jù)庫(kù)的主體,存儲(chǔ)形式可采用順序結(jié)構(gòu),B樹(shù)結(jié)構(gòu)或多目錄搜索哈希技術(shù)(散列技術(shù))。內(nèi)存數(shù)據(jù)庫(kù)定時(shí)進(jìn)行事務(wù)處理,對(duì)超過(guò)一定時(shí)間的數(shù)據(jù)從內(nèi)存中清除,寫(xiě)到外存數(shù)據(jù)庫(kù)中。外存數(shù)據(jù)庫(kù)即磁盤(pán)數(shù)據(jù)庫(kù)或歷史數(shù)據(jù)庫(kù),用于歷史記錄分析,報(bào)表生成答應(yīng)或相關(guān)決策等等。本系統(tǒng)歷史數(shù)據(jù)庫(kù)采用的是Microsoft公司的數(shù)據(jù)庫(kù)產(chǎn)品SQLServer。
3 關(guān)鍵技術(shù)研究和實(shí)現(xiàn)
3.1數(shù)據(jù)的實(shí)時(shí)采集
在工業(yè)控制系統(tǒng)中,數(shù)據(jù)采集程序的實(shí)時(shí)性和穩(wěn)定性對(duì)于整個(gè)工控系統(tǒng)的性能起著至關(guān)重要的作用。Windos提供的定時(shí)器TImer遠(yuǎn)達(dá)不到要求,必須使用精度更高的定時(shí)器來(lái)取代。
Windows系統(tǒng)下的多媒體定時(shí)器API函數(shù)timeSetevent和timeKillEvent就能很好的滿足實(shí)時(shí)性的要求。該多媒體定時(shí)器工作在自己的線程內(nèi),且它的線程優(yōu)先級(jí)(threadprioritylevel)設(shè)定為T(mén)HREAD_PRIORITY_TIME_CRITICAL,這比絕大部分的線程優(yōu)先權(quán)數(shù)值都高,相比工作在用戶界面線程內(nèi)的Timer定時(shí)器來(lái)說(shuō),它不受消息機(jī)制的影響,能夠達(dá)到很高的定時(shí)精度。它的最高定時(shí)精度能夠達(dá)到1ms,能夠滿足較高實(shí)時(shí)性的要求。
3.2內(nèi)存數(shù)據(jù)庫(kù)技術(shù)
內(nèi)存數(shù)據(jù)庫(kù)指數(shù)據(jù)庫(kù)常駐內(nèi)存及事務(wù)的數(shù)據(jù)存取只涉及內(nèi)存。內(nèi)存數(shù)據(jù)庫(kù)是支持實(shí)時(shí)事務(wù)的一種最佳技術(shù),其本質(zhì)特征是其“主拷貝”或“工作版本”常駐內(nèi)存,活動(dòng)事務(wù)只與實(shí)時(shí)內(nèi)存數(shù)據(jù)庫(kù)的內(nèi)存拷貝交互,顯然,它需要較大的內(nèi)存量。內(nèi)存數(shù)據(jù)庫(kù)可以簡(jiǎn)記為MMDB。MMDB的“工作版本”常駐內(nèi)存,在任何一個(gè)事務(wù)執(zhí)行過(guò)程中沒(méi)有內(nèi)外存間數(shù)據(jù)I/O。這為系統(tǒng)較準(zhǔn)確估算和安排事務(wù)的運(yùn)行時(shí)間、實(shí)現(xiàn)事務(wù)的定時(shí)限制打下了基礎(chǔ),從而滿足外部事務(wù)應(yīng)用對(duì)響應(yīng)時(shí)間和事務(wù)吞吐率的需求。
3.2.1利用內(nèi)存映射文件共享內(nèi)存
共享內(nèi)存是實(shí)時(shí)數(shù)據(jù)庫(kù)核心技術(shù)之一。所謂內(nèi)存映射文件,即在內(nèi)存中申請(qǐng)一塊內(nèi)存空間,將一個(gè)文件與這塊空間相聯(lián)系,再進(jìn)行內(nèi)存映射,這樣,操作文件就有和操作內(nèi)存一樣的效率,幾個(gè)進(jìn)程可以通過(guò)操作該映射文件,實(shí)現(xiàn)進(jìn)程間在內(nèi)存一級(jí)的高速數(shù)據(jù)交互。當(dāng)采用內(nèi)存映射文件方式時(shí),Windows對(duì)于再次使用該文件的進(jìn)程不在創(chuàng)建新的映射文件對(duì)象而共享前一段內(nèi)存映射對(duì)象,并將該對(duì)象映射成兩個(gè)地址空間,這種機(jī)制不僅有效地利用了內(nèi)存,同時(shí)也實(shí)現(xiàn)了數(shù)據(jù)的共享。要在Windows2000下實(shí)現(xiàn)內(nèi)存讀寫(xiě)一級(jí)的數(shù)據(jù)通信效率,唯一的辦法就是使用內(nèi)存映射文件。內(nèi)存映射文件使用方法如下:
?。?)創(chuàng)建或打開(kāi)文件內(nèi)核對(duì)象
創(chuàng)建或打開(kāi)一個(gè)文件內(nèi)核對(duì)象,總要調(diào)用CreateFileCreateFile函數(shù):HANDLECreateFilePCSTRpszFile-Name,DWORDdwDesirdAccess,DWORDdwShare-Mode,PSECURITY_ATTRIBUTESpsa,DWORDdwCreatiONDisposition,DWORDdwFlags
AndAtributes,HANDLEhTemplateFile),如果CreateFile函數(shù)成功地創(chuàng)建或打開(kāi)指定的文件,便返回一個(gè)文件內(nèi)存對(duì)象地句柄,否則返回INVALID_HANDLE_VALUE。
(2)創(chuàng)建一個(gè)文件映射內(nèi)核對(duì)象。
調(diào)用CreateFile函數(shù),可將文件映像的物理存儲(chǔ)器位置告訴操作系統(tǒng)。這時(shí),必須告訴系統(tǒng),文件映射對(duì)象需要多少物理存儲(chǔ)器。若進(jìn)行這項(xiàng)操作,可以調(diào)用CreateFileMapping函數(shù):HANDLECreateFileMapping(HANDLEhFile,PSECURITY_ATTRIBUTESpsa,DWORDfdwProtect,DWORDdwMaximum
SizeHigh,DWORDdwMaximumSizeLow,PCTSTRpszName)。系統(tǒng)創(chuàng)建文件映射對(duì)象,并將用于標(biāo)識(shí)該對(duì)象的句柄返回該調(diào)用線程。如果系統(tǒng)無(wú)法創(chuàng)建文件映射對(duì)象,便返回一個(gè)NULL句柄值。
如果內(nèi)存映射共享文件只是為了進(jìn)程間互相傳送信息,而完全沒(méi)有要將其設(shè)置為磁盤(pán)文件的情況下,可以直接在內(nèi)存中定義一個(gè)空間來(lái)進(jìn)行數(shù)據(jù)交互。方法很簡(jiǎn)單:在調(diào)用CreateFileMapping函數(shù)時(shí),設(shè)置(HANDLE)0xFFFFFFFF作為hFile參數(shù)。這樣就告訴系統(tǒng)不映射Windows磁盤(pán)上的內(nèi)容,而只是要Windows把內(nèi)存中一區(qū)域看成文件。
(3)將文件數(shù)據(jù)映射到進(jìn)程地地址空間。
當(dāng)創(chuàng)建一個(gè)文件映射對(duì)象后,仍必須讓系統(tǒng)為文件數(shù)據(jù)保留一個(gè)地址空間區(qū)域,并將文件數(shù)據(jù)作為映射到該區(qū)域的物理存儲(chǔ)器進(jìn)行提交。可通過(guò)MapViewOfFile函數(shù)來(lái)進(jìn)行這項(xiàng)操作:PVOIDMapViewOfFile(HANDLEhFileMappingObject,DWORDdwDesireAddress,DWORDdwFileOffsetHigh,
DOWRDdwFileOffsetLow,SIZE_TdwNumberOfBytesToMap);當(dāng)一個(gè)文件視圖映射到進(jìn)程的地址空間中時(shí),必須規(guī)定兩件事。首先,必須告訴系統(tǒng)數(shù)據(jù)文件中哪個(gè)字節(jié)該作為視圖中的第一個(gè)字節(jié)來(lái)映射??捎胐wFileOffsetHigh和dwFileOffsetLow參數(shù)來(lái)進(jìn)行這項(xiàng)操作。其次,必須告訴系統(tǒng),數(shù)據(jù)文件有多少字節(jié)需要映射到地址空間。可使用dwNumberOfBytesToMap參數(shù)來(lái)設(shè)定。
(4)從進(jìn)程的地址空間中撤銷文件數(shù)據(jù)的映像。
當(dāng)不需要保留映射到你的進(jìn)程地址空間區(qū)域中的文件數(shù)據(jù)時(shí),可通過(guò)調(diào)用下面的函數(shù)來(lái)釋放:
BOOLUnmapViewOfFile(PVOIDpvBaseAddress)。
?。?)關(guān)閉文件映射對(duì)象和文件對(duì)象。
若要關(guān)閉文件映射對(duì)象和文件對(duì)象,只需要兩次調(diào)用CloseHandle函數(shù)。
3.2.2內(nèi)存數(shù)據(jù)庫(kù)的存儲(chǔ)
由于數(shù)據(jù)庫(kù)存放在內(nèi)存中,不再像普通數(shù)據(jù)庫(kù)那樣作為大量磁盤(pán)文件的集合,而是內(nèi)存中可直接尋址的數(shù)據(jù)。內(nèi)存直接尋址,是目前訪問(wèn)速度最快的存儲(chǔ)設(shè)備,從而能夠滿足高度實(shí)時(shí)性的要求。從工業(yè)以太網(wǎng)得到的實(shí)時(shí)數(shù)據(jù),經(jīng)過(guò)應(yīng)用程序處理后,將其引入內(nèi)存數(shù)據(jù)庫(kù)中。根據(jù)工控自動(dòng)化系統(tǒng)的特點(diǎn),在工控自動(dòng)化系統(tǒng)中,對(duì)實(shí)時(shí)數(shù)據(jù)庫(kù)操作最多的是根據(jù)工位名等進(jìn)行的精確查詢、更新,如每秒鐘可能有成千上萬(wàn)個(gè)工位需要更新其實(shí)時(shí)數(shù)據(jù)記錄。所以,散列技術(shù)將是工控系統(tǒng)中內(nèi)存數(shù)據(jù)庫(kù)存取算法的首選。
構(gòu)造散列函數(shù)需要考慮計(jì)算散列函數(shù)所需要的時(shí)間(包括硬件指令的因素),過(guò)于復(fù)雜的散列函數(shù)將影響系統(tǒng)的實(shí)時(shí)性。構(gòu)造散列函數(shù)的方法很多,常用的有直接定址法、平方取中法、折疊法、保留余數(shù)法。其中保留余數(shù)法是一種最簡(jiǎn)單、也最常用的構(gòu)造散列函數(shù)的方法,它不僅可以對(duì)關(guān)鍵字直接取模,也可以在折疊、平方取中等運(yùn)算后取模。另外,關(guān)鍵字的選擇將影響散列函數(shù)的均勻性,盡可能使關(guān)鍵字經(jīng)過(guò)散列函數(shù)得到一個(gè)隨機(jī)的地址,以便使一組關(guān)鍵字的散列地址均勻分布在整個(gè)地址區(qū)間中,從而減少?zèng)_突。構(gòu)造散列函數(shù)需要考慮一下兩個(gè)問(wèn)題:(1)如何構(gòu)造使節(jié)點(diǎn)“分布均勻”;(2)一旦發(fā)生沖突,用什么方法解決。綜上考慮,我們采用雙重散列技術(shù)。首先雙重散列所產(chǎn)生的探測(cè)序列能夠查找整個(gè)散列表,但選取的輔助散列函數(shù)g(k)必須與M互素。其次,雙重散列可以產(chǎn)生Θ(m2)種探測(cè)序列,使得處理碰撞時(shí),選取空位置更加隨機(jī),選取合理的輔助散列函數(shù)將使得散列表很少產(chǎn)生堆積。如果M是素?cái)?shù),且h(k)=kmodM,則我們可以設(shè)g(k)=1+(kmod(M-1));但由于M-1是偶數(shù),因而命名g(k)=1+(kmod(M-2))將更好。這就提示我們選擇M使得M和M-2好像1021和1019這樣的“孿生素?cái)?shù)”。
3.2.3實(shí)時(shí)事務(wù)調(diào)度
實(shí)時(shí)數(shù)據(jù)庫(kù)是應(yīng)用系統(tǒng)的數(shù)據(jù)處理中心,系統(tǒng)各個(gè)部分均以實(shí)時(shí)數(shù)據(jù)庫(kù)作為公共區(qū)進(jìn)行數(shù)據(jù)交換,實(shí)現(xiàn)各個(gè)部分協(xié)調(diào)動(dòng)作。系統(tǒng)運(yùn)行后,實(shí)時(shí)數(shù)據(jù)庫(kù)要同時(shí)進(jìn)行下位機(jī)的數(shù)據(jù)采集、數(shù)據(jù)處理、圖形顯示刷新、歷史數(shù)據(jù)存盤(pán)、事件報(bào)警、現(xiàn)場(chǎng)控制等事務(wù)。其調(diào)度模型如圖1所示,所有事務(wù)都要進(jìn)行并行處理。
實(shí)時(shí)事務(wù)調(diào)度是一個(gè)較復(fù)雜的算法問(wèn)題,考慮到時(shí)間限制,其調(diào)度策略可分為三類:①優(yōu)先級(jí)調(diào)度算法;②時(shí)間片輪算法;③多級(jí)反饋隊(duì)列調(diào)度算法。而實(shí)時(shí)事務(wù)調(diào)度一般都是圍繞事務(wù)的優(yōu)先級(jí)進(jìn)行的,在只有一個(gè)CPU的機(jī)器上,將CPU時(shí)間按照一定的優(yōu)先級(jí)分配給各個(gè)事務(wù),定期處理某一事務(wù)而不會(huì)使某一事務(wù)處理時(shí)間過(guò)長(zhǎng),可用多線程編程技術(shù)來(lái)實(shí)現(xiàn)這種并行控制,實(shí)時(shí)調(diào)度各類事務(wù)。本系統(tǒng)就采用優(yōu)先級(jí)調(diào)度算法,其優(yōu)先權(quán)分配策略采用最大密度事務(wù)付給最高優(yōu)先權(quán)。本系統(tǒng)中除了控制事務(wù)和數(shù)據(jù)采集事務(wù)對(duì)實(shí)時(shí)性要求比較高外,其他數(shù)據(jù)處理類型事務(wù)的緊迫性和定時(shí)性要求相對(duì)較低,因此,本系統(tǒng)對(duì)不同類型的事務(wù)分配不同的優(yōu)先權(quán),以最大限度地提高系統(tǒng)的性能。
3.3多線程編程技術(shù)的引入
在工控系統(tǒng)中,實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)要實(shí)現(xiàn)現(xiàn)場(chǎng)數(shù)據(jù)的實(shí)時(shí)更新,能夠根據(jù)現(xiàn)場(chǎng)數(shù)據(jù)進(jìn)行安全監(jiān)控,對(duì)現(xiàn)場(chǎng)的數(shù)據(jù)根據(jù)用戶的設(shè)置時(shí)間間隔進(jìn)行保存,對(duì)發(fā)生事故的監(jiān)控點(diǎn)進(jìn)行事故追憶等,這些功能若全部由一個(gè)線程來(lái)完成,會(huì)因資源沖突等問(wèn)題而影響處理效率。為此,我們采用了多線程編程技術(shù)。整個(gè)系統(tǒng)由通信線程、報(bào)警處理線程、寫(xiě)歷史數(shù)據(jù)庫(kù)線程、圖形顯示線程、實(shí)時(shí)曲線顯示線程和主界面線程等。
撰寫(xiě)多線程程序的一個(gè)最具挑戰(zhàn)性的問(wèn)題就是:如何讓一個(gè)線程和另一個(gè)線程合作。這引出了一個(gè)非常重要的問(wèn)題:同步。所謂同步是指進(jìn)程、線程間相互通信時(shí)避免破壞各自數(shù)據(jù)的能力。在本系統(tǒng)中,我們引入了“讀者-寫(xiě)者”模型,在該模型中,有多個(gè)讀者和多個(gè)寫(xiě)者,以內(nèi)存數(shù)據(jù)庫(kù)為臨界資源進(jìn)行同步訪問(wèn)。其中通信線程、寫(xiě)歷史數(shù)據(jù)庫(kù)線程為“寫(xiě)者”線程,報(bào)警處理線程、圖形顯示線程、實(shí)時(shí)曲線顯示線程為“讀者”線程。“讀者-寫(xiě)者”模型的讀寫(xiě)操作限制如下所示:①寫(xiě)-寫(xiě)互斥:不能有兩個(gè)寫(xiě)者同時(shí)進(jìn)行寫(xiě)操作;②讀-寫(xiě)互斥:不能同時(shí)有一個(gè)線程在讀,而另一個(gè)線程在寫(xiě);③讀-讀允許:可以有一個(gè)或多個(gè)讀者在讀[7]。這樣,整個(gè)系統(tǒng)通過(guò)各個(gè)線程之間的相互協(xié)調(diào)來(lái)工作,可以避免因循環(huán)檢測(cè)而浪費(fèi)系統(tǒng)效率,比較好地解決了各線程訪問(wèn)內(nèi)存數(shù)據(jù)庫(kù)之間的同步問(wèn)題。
4 結(jié)束語(yǔ)
實(shí)時(shí)數(shù)據(jù)庫(kù)是數(shù)據(jù)庫(kù)技術(shù)的一個(gè)分支,在工業(yè)控制過(guò)程中,其開(kāi)放的體系結(jié)構(gòu)和高效的數(shù)據(jù)存儲(chǔ)模式,使得它對(duì)生產(chǎn)過(guò)程信息的集成發(fā)揮著重要的作用,有著及其廣泛的應(yīng)用前景。本文介紹了在工業(yè)控制系統(tǒng)中實(shí)時(shí)數(shù)據(jù)庫(kù)的功能、特點(diǎn)和事務(wù),在此基礎(chǔ)上通過(guò)對(duì)多媒體定時(shí)器、內(nèi)存數(shù)據(jù)庫(kù)技術(shù)、多線程及其同步技術(shù)等關(guān)鍵技術(shù)的分析和研究,給出了實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)的具體實(shí)現(xiàn)方法。系統(tǒng)經(jīng)實(shí)際運(yùn)行,證明該實(shí)時(shí)數(shù)據(jù)庫(kù)運(yùn)行安全、可靠、穩(wěn)定性強(qiáng),取得了令人滿意的效果。
評(píng)論