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