劉紅霞,徐 磊
(南京工業大學 電子與信息工程學院,南京 211816)
組態軟件是用于數據采集與過程控制的專用軟件[1],在工業控制領域中有著重要的作用。實時數據庫系統作為組態軟件的核心,它保存著系統運行時產生的動態數據和系統正常運行所需的各種信息[2]。這些信息對管理層及時分析設備運行狀況、了解生產現場的實施情況、實現上層信息系統與地層控制系統的集成以及故障診斷都具有重要的意義。
國外對實時數據庫系統的研究起步較早,代表產品有美國ASPEN-tech的Infoplus和OSI公司的PI等。目前國外實時數據庫產品占據了大部分的國內市場份額,但對于大部分中小型企業,他們無力承擔高額的費用。雖然國內一些實時數據庫產品在價格上有一定優勢,但在數據處理能力及速度、系統穩定性存在一些不足。因此研發具有自主知識產權的實時數據庫系統具有重要意義,實時數據庫系統的設計與結構的開發也顯得尤為重要。
本文結合作者的工程實踐,介紹了組態軟件實時數據庫系統及其特征,闡述了實時數據庫設計開發過程中的關鍵技術,在此基礎上提出了一套切實可行的實時數據庫設計方案,并進行了性能的驗證。
實時數據庫系統(RTDBMS)是傳統數據庫系統(DBMS)與實時處理技術在功能特性上的完善和無縫集成[3]。實時數據庫系統是指其事務和數據具有定時特性或顯示的定時限制的數據庫系統。系統的正確性不僅依賴于邏輯結果,還依賴于邏輯結果產生的時間[4]。與傳統的數據庫管理系統一切為了保證結果的絕對性相反,實時數據庫系統將實時性看得比結果的準確性還要重要,經常會通過折中和權衡數據的完全性、準確性、一致性來求得數據的及時性。
實時數據庫系統作為組態軟件的核心,為組態軟件的上層管理模塊、歷史數據庫模塊等提供數據的實時管理功能。實時數據庫結構設計上的好壞直接影響到組態軟件開發的成敗。
實時數據庫系統是整個組態軟件系統的核心部分,其它子系統圍繞實時數據庫系統運行。它在底層設備和上層管理系統之間起到數據采集和數據處理的作用。
本文將實時數據庫系統分為3個子系統,分別是用于實現數據庫配置工作的開發系統、用于運行環境的運行系統和實現數據采集管理的數據采集服務器。實時數據庫系統結構如圖1所示。
開發系統實現實時數據庫系統的配置工作,是系統運行的前提。組態后會生成組態數據庫文件,該數據庫文件記錄了數據結構的信息,如系統變量點的數量、變量點的數據類型、畫面程序等,供實時數據庫運行系統的初始化模塊讀取。

圖1 實時數據庫系統結構圖Fig.1 Real-time database system structure
運行系統用于現場監控,實時反映現場的生產狀況。運行系統作為實時數據庫系統的核心,實時地進行數據管理,運行系統以內存數據庫為中心,其它子模塊協同工作,實現系統的管理。
數據采集服務器是實時數據庫系統與底層控制設備進行直接交互的接口,主要由設備驅動管理、數據采集線程管理、本地緩沖區管理和數據同步管理4個子系統組成。數據采集服務器將采集的數據更新至實時數據庫,實時數據庫負責將報警、畫面顯示、歷史數據存儲等消息及時通知相應的子系統處理。
各子系統采取一定的方式進行通信,共同協作完成系統功能。開發系統和運行系統以組態數據庫文件為基礎進行通信,實現由配置到運行的過程;數據采集服務器和運行系統之間通過數據同步線程和內存數據庫的交互實現數據的同步更新。
開發系統由圖形用戶接口模塊、功能管理模塊、內存管理模塊、核心功能管理模塊、導入導出模塊以及組態數據庫文件組成。
數據是所有數據庫系統的基本組成單位。實時數據庫中的數據一共存在八種變量類型:IO離散型變量、IO整型變量、IO模擬型變量、IO字符串變量、內存離散型變量、內存整型變量、內存模擬型變量和內存字符串變量。本系統采用面向對象的設計思想,采用4種數據結構來表示上述8種數據類型,并且使用類中的一個成員變量來區分是IO變量還是內存變量。
組態數據庫文件用于保存實時數據庫系統的變量信息,本系統采用順序文件結構來存儲數據變量,并將數據庫文件分為:頭文件、記錄塊和結束標記。同時系統采用位置記錄緩沖區來避免在刪除變量時產生大量的磁盤讀寫操作。索引結構和基本數據緩沖區能夠快速定位變量,進行賦值等操作。同時采用了變量的刪除保護策略,防止因為變量被錯誤地刪除而使系統產生不可預計的錯誤。技術人員除了可以采用標準的圖形用戶接口來進行變量的配置,還可以使用Excel的方式對系統變量進行組態,方便快捷。
運行系統以開發系統為前提,根據組態數據庫文件進行系統的初始化工作。運行系統作為組態軟件的核心部分,負責數據的實施管理,包括事務的處理、并發控制、事件管理、歷史數據的存儲等,運行系統結構如圖2所示。

圖2 運行系統結構圖Fig.2 Running system structure
為了提高數據處理效率,運行系統采用內存數據庫實現事務的實時處理,大大減少了系統對磁盤的操作。內存數據庫的結構直接決定了實時數據庫的效率、穩定性和靈活性。為了滿足實時特性,當子系統向實時數據庫提交事務時,數據庫系統必須要能快速定位到相應變量。數組結構適合實現快速定位,但是數組結構必須要求連續的內存空間來存儲數據。當系統存在大量變量點時,大容量的連續內存很難得到滿足。而且系統中的八種變量類型所需要的內存空間不同,如果統一分配,將造成內存的浪費。解決以上問題,本文采用索引結構和二級緩存技術實現數據的快速定位,索引結構和二級緩存技術原理如圖3所示。

圖3 索引結構和二級緩存技術原理圖Fig.3 Two caching techniques and index structure
索引結構采用數組結構實現,根據唯一的變量名,可以定位出內存數據庫中相應的數據單元。一級緩沖區中存儲各個數據項的基本信息和附加信息指針。基本信息是從不同數據類型提取的統一信息,包括變量的名字、類型及數據值等。附加信息是一個數據指針,指向二級緩沖區,存放不同變量除基本信息外的剩余信息。二級緩沖區中每個記錄單元所需要的內存空間較大,可以單獨在堆上進行內存空間的分配。索引結構和二級緩存技術能夠充分利用內存資源,進行快速定位,以便于對事務的請求進行快速響應。
一個優秀的實時數據庫系統,需要快速反應各種事務的請求,并及時處理。在實時數據庫系統中,事務指對一個數據對象進行的一系列的讀和寫的操作。實時事務的調度一般是基于事務的優先級策略,事務的優先級策略大致可分為靜態優先級策略和動態優先級策略。靜態優先級策略是指在系統運行之前已經確定事務的優先級,而動態優先級策略則是在運行時根據相關參數來確定事務的優先級。本系統采用靜態優先級調度策略,避免因為動態優先級的調整所帶來的系統開銷,從而提高運行系統實時特性。系統采用單調比率算法對事務的優先級進行計算。
組態軟件中多個子系統都會與實時數據庫運行系統進行交互,如果允許子系統間的串行操作,則會極大地降低系統的工作效率,因此系統采用樂觀并發控制協議實現實時數據庫的事務管理。
為了滿足運行系統對實時性的要求,采用GetTickCount函數來進行定時的數據采集,該函數返回系統開機以來所經過的毫秒數。通過該函數以及多線程的方式可以最大限度地提高數據采集的精度。
實時數據庫數據采集服務器主要通過設備驅動程序與現場設備進行實時通信,以完成系統對數據的采集功能。自動化系統中,現場的設備主要有PLC、DCS、板卡等,這些設備支持不同的通信協議,這就需要數據采集服務器能夠有效地管理設備以及高效地采集數據。本系統中的數據采集服務器能夠對不同通信協議以及不同接入方式的設備進行統一的管理,其結構如圖4所示。

圖4 數據采集服務器結構圖Fig.4 Data collection server structure
各個采集線程負責通過調用硬件的驅動程序和硬件進行實時交互,將從設備采集到的數據統一送入本地緩沖區,本地緩沖區以鏈表形式維護數據。最后通過數據更新線程將數據和實時數據庫進行數據同步。
為了對不同類型的設備統一管理,將設備進行抽象化,建立統一的數據模型。數據模型CDevice結
構如下:
class CDevice
{
public:
WORD devid;//設備的 ID 號
Char deviceName[32];//設備名稱
Char logicName[32];//設備的邏輯名稱
Char address[32];//設備寄存器地址
Char information[64];//設備描述
DEVADDR devAddr;//設備地址
short status;//設備的狀態
WORD statusid;//狀態 id 號
short enable;//使能控制
bool useModem;//是否使用調制解調器
char szPhoneNum[16];//撥號號碼
bool statusChange;//狀態是否改變
UINT timerCount;//通訊出現故障時,嘗試重建連接的次數
UINT retryInterval;//通訊出現故障時,重建連接的時間間隔
}
由于硬件設備的種類繁多,在不同場合,需要使用的驅動程序也各有不同,因此需要對驅動程序進行統一的管理[5]。本文采用統一驅動接口模型的方式,遵循COM規范,用C++進行開發,對驅動程序接口進行抽象,制訂驅動程序的接口規范,并以DLL的形式進行封裝[6]。
數據采集服務器采用多線程的方式,將數據采集分散在各個線程中完成,保證數據采集的相互獨立性。
內存數據庫是實現實時數據庫運行系統的核心,它使系統能夠從內存中存取相關的數據,避免大量的硬盤操作,從而提高了效率。本文對內存數據庫和關系型數據庫的存取效率進行了比較。關系數據庫采用Access數據庫,向關系型數據庫插入500及1000條記錄,向內存數據庫中插入1000及5000條記錄,記錄時間并進行對比,結果如表1所示。

表1 內存數據庫和關系數據庫測試數據Tab.1 Memory and relational databases test data
對比可以看出,內存數據庫在存取數據的效率上遠高于關系型數據庫。采用內存數據庫為核心的實時數據庫系統能夠很好地滿足組態軟件對實時性的需求。
實時數據庫系統中采用了二級緩存技術,高效地利用了系統中內存碎片,大大減小了內存的開銷。為了驗證二級緩存技術在內存需求上的改進,系統初始化了2萬個變量點,離散型、整數型、浮點型和字符串型各5000點,分別使用普通一級緩存結構和二級緩存結構,在內存需求方面進行對比,對比如表2所示。

表2 內存開銷對比Tab.2 Comparison of memory usage
從上述對比可以看出,二級緩存技術大大減少了內存的開銷。
數據處理在實時數據庫系統中是最常見的操作。本文采用高效的索引結構能夠快速定位變量,并通過二級緩存技術對變量進行各種操作。為了驗證其性能,在20000點的實際工程中,對分布在不同位置的20個不同類型的變量點進行5000次的循環寫入操作,測試結果如表3所示。

表3 數據處理測試Tab.3 Data processing test
從以上測試數據可以看出,10萬次的數據寫入僅需要3094 ms,即實時數據庫平均每秒可以完成32000多次數據的索引以及寫入操作,其性能完全能夠滿足軟實時特性的需求。
以某省農村商業銀行機房環境監控系統為例,展示實時數據庫系統的應用情況。該監控系統主要完成商業銀行機房環境的監控,以實時數據庫為核心,通過數據采集服務器來完成D86、AC86、UPS以及智能空調等設備的數據采集以及控制。系統同時利用ModbusTCP驅動程序將全市各地ATM取款機的通信數據實時地展示出來,供機房工作人員分析及查看。監控系統會將產生的報警及時地通過短信、電話等方式告知工作人員,方便工作人員及時處理,減少不必要的經濟損失。環境監控系統的結構如圖5所示。

圖5 環境監控系統結構圖Fig.5 Environmental monitoring system structure
該系統為工作人員提供了準確的現場數據,精美的圖形界面,并提供多種方式來查詢歷史數據,這些歷史數據為故障的分析和數據挖掘提供了依據。該系統的成功應用,驗證了本文提出的實時數據庫系統的設計具有現實的可行性。
本文通過對中小企業的需求分析,結合組態軟件的特點,提出了組態軟件實時數據庫系統設計方案,采用組件化的思想將系統分為開發系統、運行系統和數據采集服務器,并詳細介紹了各個子系統的設計以及實現,并對系統性能進行了驗證,最后列舉實際案例證實方案的可行性。
本文提出的實時數據庫系統已經廣泛應用于各類中小企業,成功應用于樓宇、化工、生工等多類不同的監控系統,為企業創造了一定的經濟效益。
[1] 馮彥.針對高速數據采集和設備控制的組態軟件[D].上海:上海交通大學,2006.
[2] 宋清昆,孫元娜,王學偉,等.組態軟件實時數據庫系統設計[J].自動化技術與應用,2008,2(1):55-57.
[3] 張亮.基于MES的生產實績回報系統研究[D].天津:河北工業大學,2005.
[4] 葉建位.大型實時數據庫關鍵技術及系統構架[D].杭州:浙江大學,2005.
[5] 張勇旭,李力雄,康盛.通用組態軟件驅動程序的設計與開發[J].南京:工業控制計算機 2009,22(9):1-3,6.
[6] 孫鑫,余安萍.VC++深入詳解[M].北京:電子工業出版社,2006:435-480,701-731.