文章介紹了在面向工控自動化過程的實時監控系統建設中,實時數據庫系統的設計。針對實時數據庫系統的特點,分析了實時數據庫的功能模塊、存儲結構、事務調度和并發控制等關鍵技術并給出了具體實現方法。在實現過程中采用了多媒體定時器、內存映射文件、多線程、同步對象等技術,保證了系統的穩定性和強實時性。
1 引言
現代工業的特點要求全過程的實時監控,高速的實時數據處理、長期的歷史數據存儲以及生產信息的集成與共享。要滿足上述對生產數據的處理要求僅靠大量采用集散控制系統(DCS)和關系數據庫技術并不能完全解決問題。DCS數據存儲能力有限,同時企業中異構的DCS無法進行有效的數據共享。而關系數據庫數據處理速度低,無法對生產過程數據進行及時高效的存儲。
為了解決上述問題,實時數據庫作為一個關鍵的支撐技術引入工業控制系統。在生產設備運行過程中,實時數據庫系統實時采集設備的運行數據,隨時掌握裝置的運行情況,并通過對生產過程的關鍵數據的實時監控分析,對出現的問題即時進行處理,使生產的運行狀態保持平穩。實時數據庫還是是連接工業生產控制系統與企業上層管理系統的橋梁,企業可以通過實時數據庫系統提供的數據平臺,為經營決策、計劃調度、先進過程控制,質量監控等分系統提供同一的數據平臺。
2 實時數據庫系統概念和特點
實時數據庫系統(RTDBS)就是其事務和數據都可以有定時特性或顯式的定時限制的數據庫系統。系統的正確性不僅依賴于邏輯結果,而且還依賴于邏輯結果產生的時間。對于實時數據庫系統,數據的一致性和執行的周期性是重要的目標,由于在實時系統中經常以固定的時間周期收集被控系統的實時數據,相應的控制系統也必須周期性地處理數據和作出響應;由于傳統的關系型數據庫在一些時限要求嚴格的場合不能滿足實時系統對數據實時性的要求,而內存直接尋址是一種具有高速的數據訪問方式,在技術上采用內存數據庫是解決這一問題的理想解決方案。
整個實時數據庫系統方案的設計分為駐內和留外兩個部分,駐內部分即為內存數據庫,是實時數據庫的主體,存儲形式可采用順序結構,B樹結構或多目錄搜索哈希技術(散列技術)。內存數據庫定時進行事務處理,對超過一定時間的數據從內存中清除,寫到外存數據庫中。外存數據庫即磁盤數據庫或歷史數據庫,用于歷史記錄分析,報表生成答應或相關決策等等。本系統歷史數據庫采用的是Microsoft公司的數據庫產品SQLServer。
3 關鍵技術研究和實現
3.1數據的實時采集
在工業控制系統中,數據采集程序的實時性和穩定性對于整個工控系統的性能起著至關重要的作用。Windos提供的定時器TImer遠達不到要求,必須使用精度更高的定時器來取代。
Windows系統下的多媒體定時器API函數timeSetevent和timeKillEvent就能很好的滿足實時性的要求。該多媒體定時器工作在自己的線程內,且它的線程優先級(threadprioritylevel)設定為THREAD_PRIORITY_TIME_CRITICAL,這比絕大部分的線程優先權數值都高,相比工作在用戶界面線程內的Timer定時器來說,它不受消息機制的影響,能夠達到很高的定時精度。它的最高定時精度能夠達到1ms,能夠滿足較高實時性的要求。
3.2內存數據庫技術
內存數據庫指數據庫常駐內存及事務的數據存取只涉及內存。內存數據庫是支持實時事務的一種最佳技術,其本質特征是其“主拷貝”或“工作版本”常駐內存,活動事務只與實時內存數據庫的內存拷貝交互,顯然,它需要較大的內存量。內存數據庫可以簡記為MMDB。MMDB的“工作版本”常駐內存,在任何一個事務執行過程中沒有內外存間數據I/O。這為系統較準確估算和安排事務的運行時間、實現事務的定時限制打下了基礎,從而滿足外部事務應用對響應時間和事務吞吐率的需求。
3.2.1利用內存映射文件共享內存
共享內存是實時數據庫核心技術之一。所謂內存映射文件,即在內存中申請一塊內存空間,將一個文件與這塊空間相聯系,再進行內存映射,這樣,操作文件就有和操作內存一樣的效率,幾個進程可以通過操作該映射文件,實現進程間在內存一級的高速數據交互。當采用內存映射文件方式時,Windows對于再次使用該文件的進程不在創建新的映射文件對象而共享前一段內存映射對象,并將該對象映射成兩個地址空間,這種機制不僅有效地利用了內存,同時也實現了數據的共享。要在Windows2000下實現內存讀寫一級的數據通信效率,唯一的辦法就是使用內存映射文件。內存映射文件使用方法如下:
(1)創建或打開文件內核對象
創建或打開一個文件內核對象,總要調用CreateFileCreateFile函數:HANDLECreateFile
(2)創建一個文件映射內核對象。
調用CreateFile函數,可將文件映像的物理存儲器位置告訴操作系統。這時,必須告訴系統,文件映射對象需要多少物理存儲器。若進行這項操作,可以調用CreateFileMapping函數:HANDLECreateFileMapping(HANDLEhFile,PSECURITY_ATTRIBUTESpsa,DWORDfdwProtect,DWORDdwMaximumSizeHigh,DWORDdwMaximumSizeLow,PCTSTRpszName)。系統創建文件映射對象,并將用于標識該對象的句柄返回該調用線程。如果系統無法創建文件映射對象,便返回一個NULL句柄值。
如果內存映射共享文件只是為了進程間互相傳送信息,而完全沒有要將其設置為磁盤文件的情況下,可以直接在內存中定義一個空間來進行數據交互。方法很簡單:在調用CreateFileMapping函數時,設置(HANDLE)0xFFFFFFFF作為hFile參數。這樣就告訴系統不映射Windows磁盤上的內容,而只是要Windows把內存中一區域看成文件。
(3)將文件數據映射到進程地地址空間。
當創建一個文件映射對象后,仍必須讓系統為文件數據保留一個地址空間區域,并將文件數據作為映射到該區域的物理存儲器進行提交。可通過MapViewOfFile函數來進行這項操作:PVOIDMapViewOfFile(HANDLEhFileMappingObject,DWORDdwDesireAddress,DWORDdwFileOffsetHigh,DOWRDdwFileOffsetLow,SIZE_TdwNumberOfBytesToMap);當一個文件視圖映射到進程的地址空間中時,必須規定兩件事。首先,必須告訴系統數據文件中哪個字節該作為視圖中的第一個字節來映射。可用dwFileOffsetHigh和dwFileOffsetLow參數來進行這項操作。其次,必須告訴系統,數據文件有多少字節需要映射到地址空間。可使用dwNumberOfBytesToMap參數來設定。
(4)從進程的地址空間中撤銷文件數據的映像。
當不需要保留映射到你的進程地址空間區域中的文件數據時,可通過調用下面的函數來釋放:
BOOLUnmapViewOfFile(PVOIDpvBaseAddress)。
(5)關閉文件映射對象和文件對象。
若要關閉文件映射對象和文件對象,只需要兩次調用CloseHandle函數。
3.2.2內存數據庫的存儲
由于數據庫存放在內存中,不再像普通數據庫那樣作為大量磁盤文件的集合,而是內存中可直接尋址的數據。內存直接尋址,是目前訪問速度最快的存儲設備,從而能夠滿足高度實時性的要求。從工業以太網得到的實時數據,經過應用程序處理后,將其引入內存數據庫中。根據工控自動化系統的特點,在工控自動化系統中,對實時數據庫操作最多的是根據工位名等進行的精確查詢、更新,如每秒鐘可能有成千上萬個工位需要更新其實時數據記錄。所以,散列技術將是工控系統中內存數據庫存取算法的首選。
構造散列函數需要考慮計算散列函數所需要的時間(包括硬件指令的因素),過于復雜的散列函數將影響系統的實時性。構造散列函數的方法很多,常用的有直接定址法、平方取中法、折疊法、保留余數法。其中保留余數法是一種最簡單、也最常用的構造散列函數的方法,它不僅可以對關鍵字直接取模,也可以在折疊、平方取中等運算后取模。另外,關鍵字的選擇將影響散列函數的均勻性,盡可能使關鍵字經過散列函數得到一個隨機的地址,以便使一組關鍵字的散列地址均勻分布在整個地址區間中,從而減少沖突。構造散列函數需要考慮一下兩個問題:(1)如何構造使節點“分布均勻”;(2)一旦發生沖突,用什么方法解決。綜上考慮,我們采用雙重散列技術。首先雙重散列所產生的探測序列能夠查找整個散列表,但選取的輔助散列函數g(k)必須與M互素。其次,雙重散列可以產生Θ(m2)種探測序列,使得處理碰撞時,選取空位置更加隨機,選取合理的輔助散列函數將使得散列表很少產生堆積。如果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實時事務調度
實時數據庫是應用系統的數據處理中心,系統各個部分均以實時數據庫作為公共區進行數據交換,實現各個部分協調動作。系統運行后,實時數據庫要同時進行下位機的數據采集、數據處理、圖形顯示刷新、歷史數據存盤、事件報警、現場控制等事務。其調度模型如圖1所示,所有事務都要進行并行處理。

?
實時事務調度是一個較復雜的算法問題,考慮到時間限制,其調度策略可分為三類:①優先級調度算法;②時間片輪算法;③多級反饋隊列調度算法。而實時事務調度一般都是圍繞事務的優先級進行的,在只有一個CPU的機器上,將CPU時間按照一定的優先級分配給各個事務,定期處理某一事務而不會使某一事務處理時間過長,可用多線程編程技術來實現這種并行控制,實時調度各類事務。本系統就采用優先級調度算法,其優先權分配策略采用最大密度事務付給最高優先權。本系統中除了控制事務和數據采集事務對實時性要求比較高外,其他數據處理類型事務的緊迫性和定時性要求相對較低,因此,本系統對不同類型的事務分配不同的優先權,以最大限度地提高系統的性能。
3.3多線程編程技術的引入
在工控系統中,實時數據庫系統要實現現場數據的實時更新,能夠根據現場數據進行安全監控,對現場的數據根據用戶的設置時間間隔進行保存,對發生事故的監控點進行事故追憶等,這些功能若全部由一個線程來完成,會因資源沖突等問題而影響處理效率。為此,我們采用了多線程編程技術。整個系統由通信線程、報警處理線程、寫歷史數據庫線程、圖形顯示線程、實時曲線顯示線程和主界面線程等。
撰寫多線程程序的一個最具挑戰性的問題就是:如何讓一個線程和另一個線程合作。這引出了一個非常重要的問題:同步。所謂同步是指進程、線程間相互通信時避免破壞各自數據的能力。在本系統中,我們引入了“讀者-寫者”模型,在該模型中,有多個讀者和多個寫者,以內存數據庫為臨界資源進行同步訪問。其中通信線程、寫歷史數據庫線程為“寫者”線程,報警處理線程、圖形顯示線程、實時曲線顯示線程為“讀者”線程。“讀者-寫者”模型的讀寫操作限制如下所示:①寫-寫互斥:不能有兩個寫者同時進行寫操作;②讀-寫互斥:不能同時有一個線程在讀,而另一個線程在寫;③讀-讀允許:可以有一個或多個讀者在讀[7]。這樣,整個系統通過各個線程之間的相互協調來工作,可以避免因循環檢測而浪費系統效率,比較好地解決了各線程訪問內存數據庫之間的同步問題。
4 結束語
實時數據庫是數據庫技術的一個分支,在工業控制過程中,其開放的體系結構和高效的數據存儲模式,使得它對生產過程信息的集成發揮著重要的作用,有著及其廣泛的應用前景。本文介紹了在工業控制系統中實時數據庫的功能、特點和事務,在此基礎上通過對多媒體定時器、內存數據庫技術、多線程及其同步技術等關鍵技術的分析和研究,給出了實時數據庫系統的具體實現方法。系統經實際運行,證明該實時數據庫運行安全、可靠、穩定性強,取得了令人滿意的效果。
?
?
?
評論