北京首鋼自動化信息技術(shù)有限公司 李亮舉,劉孟祎
現(xiàn)代工業(yè)的特點是要求生產(chǎn)全過程的實時監(jiān)控,高速的實時數(shù)據(jù)處理,長期的歷史數(shù)據(jù)存儲以及生產(chǎn)信息的集成與共享。在工業(yè)生產(chǎn)過程中,計算機控制技術(shù)已經(jīng)得到了普及,先進的控制理論和計算機技術(shù)相結(jié)合更好地解決了生產(chǎn)工藝日益復(fù)雜,控制質(zhì)量要求越來越高的問題。
在實際工業(yè)自動化控制過程中需要處理大量的數(shù)據(jù),數(shù)據(jù)變化速度快,并且存在大量非結(jié)構(gòu)化數(shù)據(jù)(包括圖象、聲音、視頻等)以及半結(jié)構(gòu)化數(shù)據(jù)。實時數(shù)據(jù)庫的長處在于不需要人工干預(yù),可實時處理大量并發(fā)的數(shù)據(jù)信息;關(guān)系數(shù)據(jù)庫可以非常簡便地實現(xiàn)對象信息的定義和存儲。因此,基于工業(yè)自動化控制的需求以及兩種數(shù)據(jù)庫各自不同的優(yōu)勢,產(chǎn)生了實時數(shù)據(jù)庫與關(guān)系數(shù)據(jù)庫的結(jié)合使用,從而產(chǎn)生了兩種數(shù)據(jù)庫之間密切頻繁地相互通訊。為了解決這一問題,進行了數(shù)據(jù)交換服務(wù)的設(shè)計與實現(xiàn)。
RealTime Database (RTDB)實時數(shù)據(jù)庫是數(shù)據(jù)庫技術(shù)發(fā)展的一個分支,是數(shù)據(jù)庫技術(shù)結(jié)合實時處理技術(shù)產(chǎn)生的,適用于處理不斷更新的快速變化的數(shù)據(jù)及具有時間限制的事務(wù)。實時數(shù)據(jù)庫是開發(fā)實時控制系統(tǒng)、數(shù)據(jù)采集系統(tǒng)等的重要支撐,它有較高的I/O事務(wù)吞吐量和高效的數(shù)據(jù)壓縮技術(shù),可以實現(xiàn)實時、高效、可靠的數(shù)據(jù)存儲和查詢,同時為用戶節(jié)省磁盤空間。實時數(shù)據(jù)庫主要應(yīng)用于工業(yè)監(jiān)控,在實際生產(chǎn)中存儲著每個工藝過程點采集到的大量數(shù)據(jù)。實時數(shù)據(jù)庫也存在缺點,它的存儲能力有限。
Relational Database (RDB)是指采用關(guān)系模型的關(guān)系數(shù)據(jù)庫,是一些相互之間存在一定關(guān)聯(lián)的表的集合。關(guān)系數(shù)據(jù)庫的存儲能力強,旨在處理永久、穩(wěn)定的數(shù)據(jù),便于企業(yè)的生產(chǎn)管理、數(shù)據(jù)分析以及決策。在工業(yè)控制中使用關(guān)系數(shù)據(jù)庫對大量歷史數(shù)據(jù)進行存儲、管理和分析。但是關(guān)系數(shù)據(jù)庫的數(shù)據(jù)處理速度低,無法對生產(chǎn)過程數(shù)據(jù)進行及時高效的存儲。
數(shù)據(jù)交換服務(wù)管理著不同來源、不同屬性的海量數(shù)據(jù),為用戶提供快捷方便的服務(wù),包括從實時數(shù)據(jù)庫(RTDB)到關(guān)系數(shù)據(jù)庫(RDB)的數(shù)據(jù)轉(zhuǎn)換存儲,和關(guān)系數(shù)據(jù)庫(RDB)到實時數(shù)據(jù)庫(RTDB)的數(shù)據(jù)轉(zhuǎn)換存儲。數(shù)據(jù)交換服務(wù)為不同數(shù)據(jù)庫之間的互連互通提供了包含加載、轉(zhuǎn)換、傳輸和存儲等操作,可以有效解決數(shù)據(jù)及時、高效地上傳下達,在安全、方便、快捷、順暢的進行數(shù)據(jù)交換的同時保證數(shù)據(jù)的一致性和準(zhǔn)確性,實現(xiàn)數(shù)據(jù)的一次采集、多次分析使用,為各種應(yīng)用和決策支持提供良好的數(shù)據(jù)環(huán)境。
圖1 數(shù)據(jù)事務(wù)處理示意圖
使用鏈表可以方便有層次地進行管理和擴展,鏈表中的每個結(jié)點包括數(shù)據(jù)域和指針域,其中數(shù)據(jù)域存儲數(shù)據(jù)元素的信息,指針域中存儲結(jié)點直接后繼的存儲位置。在數(shù)據(jù)交換服務(wù)中采用三層鏈表結(jié)構(gòu)如圖2所示,將連接connection作為第一級鏈表,每個連接下的表格table掛接到二級鏈表上,綁定bind則作為第三級鏈表。其中:
連接(Connection)鏈表:list
表(Table)鏈表:list
綁定(Bind)鏈表:list
圖2 數(shù)據(jù)交換服務(wù)的三層鏈表結(jié)構(gòu)
由于鏈表不要求邏輯上相鄰的元素在物理位置上也相鄰,因此它沒有順序存儲結(jié)構(gòu)所具有的弱點,但同時也失去了順序表可隨機存取的優(yōu)點。
在數(shù)據(jù)交換服務(wù)中,轉(zhuǎn)存的單位定義為數(shù)據(jù)表,用戶可以通過客戶端定義數(shù)據(jù)表中需要轉(zhuǎn)存的數(shù)據(jù)點、數(shù)據(jù)轉(zhuǎn)存的方向、轉(zhuǎn)存的時間間隔等相關(guān)信息。用戶可以完成增加、刪除和修改數(shù)據(jù)表等操作。
2.1.1 RTDB的讀取和存儲
使用冶金過程控制系統(tǒng)開發(fā)平臺的分布式進程通訊中間件進行RTDB數(shù)據(jù)的讀取和存儲。讀寫過程調(diào)用等待接口、請求接口和應(yīng)答接口。
2.1.2 RDB的讀取和存儲
RDB的讀取和存儲采用的是ADO技術(shù)。ADO是開發(fā)訪問OLE數(shù)據(jù)庫應(yīng)用程序所使用的一種數(shù)據(jù)庫訪問組件,是一種可以訪問各種數(shù)據(jù)類型的連接機制,具有容易使用、數(shù)據(jù)庫訪問速度高、內(nèi)存支出少、使用較少的網(wǎng)絡(luò)流量的優(yōu)點,其性能和易用性都達到了極佳水平。利用ADO對象并通過ODBC或OLE DB,可以實現(xiàn)對任意數(shù)據(jù)庫的存取和訪問,包括SQL Server、Oracle、Access、Excel以及文本文件、圖形文件等數(shù)據(jù)源。
ADO模型包括7個對象,其中主要對象有3個:Connection、Command和 Recordset ,可以被獨立創(chuàng)建和釋放。此外,還包括其他4個集合對象:Fields、Errors、Parameters和Properties。一個典型的ADO應(yīng)用程序使用Connection對象建立與數(shù)據(jù)源的連接,然后使用Command對象給出對數(shù)據(jù)庫操作的命令,如插入數(shù)據(jù)或者查詢數(shù)據(jù)等,而Recordset用于對結(jié)果集進行維護或者瀏覽等操作。其中Command連接字符串與對應(yīng)的數(shù)據(jù)源有關(guān),不同的數(shù)據(jù)源使用不同的命令,對于關(guān)系數(shù)據(jù)庫,通常使用SQL作為命令語言。使用ADO進行RDB讀取和存儲主要包括以下步驟:
① 初始化COM庫,引入ADO庫定義文件。
::CoInitialize (NULL);
#import "C:program filescommon filessystemadomsado15.dll"no_namespace rename("EOF", "EndOfFile")
② 用Connection對象連接數(shù)據(jù)庫。
ORACLE數(shù)據(jù)庫的連接字符串為:數(shù)據(jù)庫提供者OraOLEDB.Oracle.1;用戶名;密碼;數(shù)據(jù)源oracles; pConn ->Open(連接字符串,用戶名,密碼,同異步);
SQ LSe rve r數(shù)據(jù)庫的連接字符串為:數(shù)據(jù)庫提供者SQLOLEDB;數(shù)據(jù)庫Database;用戶名;密碼;數(shù)據(jù)源127.0.0.1"; 連接:pConn ->Open(連接字符串,用戶名,密碼,同異步);
③ 利用建立好的連接,通過Command對象執(zhí)行SQL命令,使用Recordset對象取得結(jié)果記錄集進行處理、查詢,更新數(shù)據(jù)庫。
pCommand->Execute(&vRecordsAffected,NULL,adCmdUnknown );
④關(guān)閉連接,釋放對象所占的資源。
::CoUninitialize();
變體VARIANT數(shù)據(jù)類型是所有沒被顯式聲明(用如Private、Public 或 Static等語句)為其他類型變量,能夠在運行期間動態(tài)改變類型的數(shù)據(jù)類型。變體能支持所有簡單的數(shù)據(jù)類型,如整型、浮點型、字符串、布爾型、日期時間、貨幣等。數(shù)值數(shù)據(jù)為負數(shù)時范圍從-1.797693134862315E308 到-4.94066E-324,正數(shù)時則從4.94066E-324 到 1.797693134862315E308。
可以用 Variant 數(shù)據(jù)類型來替換各種數(shù)據(jù)類型,有很強的適應(yīng)性。通常,數(shù)值Variant 數(shù)據(jù)保持為其Variant中原來的數(shù)據(jù)類型。例如,算術(shù)運算是針對含Byte、Integer、Long或 Single 之一的Variant執(zhí)行的,如果把一個Integer賦值給Variant,則接下來的運算會把此Variant當(dāng)成Integer來處理,但是當(dāng)運算結(jié)果超過原來數(shù)據(jù)類型的正常范圍時,存在Variant中的結(jié)果會被提升到能表示較大數(shù)據(jù)范圍的數(shù)據(jù)類型。如 Byte 則提升到Integer,Integer 則提升到Long,而Long和Single則提升為Double。當(dāng)Variant變量中有Decimal及Double值超過它們各自的范圍時,則會發(fā)生錯誤。
Variant數(shù)據(jù)結(jié)構(gòu)包含兩個域,第一個是vt域,定義成各種類型的數(shù)據(jù)成員構(gòu)成的聯(lián)合體,它決定著第二個域的數(shù)據(jù)類型;第二個域是一個用來指明聯(lián)合體中目前起作用的數(shù)據(jù)類型的變量,名稱隨著vt域中輸入值的不同而改變。變體接收到的數(shù)據(jù)存儲在聯(lián)合體的某個數(shù)據(jù)成員中。例如:當(dāng)一個long型數(shù)據(jù)存入Variant類型時,vt域類型為VT_I4,其第二個域使用的名稱是lVal。對Variant變量的賦值方法:首先給vt成員賦值,指明數(shù)據(jù)類型,再對聯(lián)合結(jié)構(gòu)中相同數(shù)據(jù)類型的變量賦值。例如:variant v; int a=2013; v.vt=VT_I4; v.lVal=a。
2.2.1 實時數(shù)據(jù)庫到ORACLE、SQLServer關(guān)系數(shù)據(jù)庫轉(zhuǎn)換
從實時數(shù)據(jù)庫讀出來數(shù)據(jù),存入關(guān)系數(shù)據(jù)庫之前先把數(shù)據(jù)轉(zhuǎn)換成變體類型,再將變體類型存入關(guān)系數(shù)據(jù)庫。存入關(guān)系數(shù)據(jù)庫的數(shù)據(jù)類型和從數(shù)據(jù)庫取出的變體類型是有確定的對應(yīng)關(guān)系的,具體關(guān)系如表1和表2所示:
表1 ORACLE數(shù)據(jù)類型和變體類型對應(yīng)關(guān)系
表2 SQLServer數(shù)據(jù)類型和變體類型對應(yīng)關(guān)系
一些VARIANT支持的類型如VT_I2(short整型)、VT_UI2(unsigned short無符號整型)、VT_UI4(unsigned long 無符號長整型)可以直接定義,但是無法從ORACLE或者SQLServer關(guān)系數(shù)據(jù)庫中取出這些類型的數(shù)據(jù)。
在數(shù)據(jù)交換服務(wù)的類型轉(zhuǎn)換過程中,進行了嚴格的類型匹配檢查以及合法轉(zhuǎn)換的數(shù)值范圍檢查,如果不符合要求則為非法轉(zhuǎn)換,服務(wù)會報錯提示類型轉(zhuǎn)換失敗,需要用戶重新設(shè)置數(shù)據(jù)類型。
例如RTDB的XT_XCHAR類型轉(zhuǎn)換到RDB的NUMBER類型時,需要做以下檢查:
①字符串是否已初始化,如果未初始化則報錯提示用戶需要先進行初始化操作。
②從字符串到數(shù)字類型轉(zhuǎn)換首位是否為數(shù)字或者符號位的檢查,如果首位不是數(shù)字或者符號位,則轉(zhuǎn)換是非法的,服務(wù)報錯。
③首位之外的其他位是否為數(shù)字或者小數(shù)點的檢查,不是數(shù)字或者小數(shù)點則是非法轉(zhuǎn)換,服務(wù)報錯。
④末位是否為數(shù)字的檢查,不是數(shù)字則是非法轉(zhuǎn)換,報錯。
2.2.2 ORACLE、SQLServer關(guān)系數(shù)據(jù)庫到實時數(shù)據(jù)庫轉(zhuǎn)換
從關(guān)系數(shù)據(jù)庫取出變體類型的數(shù)據(jù),進行數(shù)據(jù)類型轉(zhuǎn)換,再存入實時數(shù)據(jù)庫。在類型轉(zhuǎn)換時,同樣需要進行嚴格的類型匹配檢查以及合法轉(zhuǎn)換的數(shù)值范圍檢查。
例如:RDB的 VT_I2類型到RTDB的XT_UI2類型轉(zhuǎn)換時,需要合法轉(zhuǎn)換數(shù)值范圍的檢查。Int的數(shù)據(jù)范圍是-32768~32767,unsigned int的數(shù)據(jù)范圍是0~65535。因此當(dāng)需要轉(zhuǎn)換的數(shù)值處于[-32768,0)時,服務(wù)會報錯提示轉(zhuǎn)換非法。
數(shù)據(jù)類型轉(zhuǎn)換的分支很多,分支總個數(shù)是實時數(shù)據(jù)庫數(shù)據(jù)類型的個數(shù)與關(guān)系數(shù)據(jù)庫數(shù)據(jù)類型個數(shù)的笛卡爾積,而在每個分支中的類型匹配檢查個數(shù)以及合法轉(zhuǎn)換數(shù)值范圍檢查個數(shù)則更為龐大,十分復(fù)雜。
數(shù)據(jù)交換服務(wù)開發(fā)完成后首先應(yīng)用到了冶金過程控制系統(tǒng)開發(fā)平臺的數(shù)據(jù)平臺中。數(shù)據(jù)平臺涉及到大量的數(shù)據(jù)采集、分析計算處理和數(shù)據(jù)存儲轉(zhuǎn)換,數(shù)據(jù)交換服務(wù)能夠很好地完成其中的數(shù)據(jù)讀取、存儲和轉(zhuǎn)換功能,轉(zhuǎn)換存儲效率較高,功能良好。該服務(wù)在自動控制系統(tǒng)中可以對現(xiàn)場收集到的數(shù)據(jù)進行出色地處理,滿足工業(yè)現(xiàn)場的需要。
數(shù)據(jù)交換服務(wù)是工業(yè)自動化信息化發(fā)展過程中自動控制系統(tǒng)的一個重要組成部分,該服務(wù)運行穩(wěn)定,可以快速而準(zhǔn)確地提供實時數(shù)據(jù)庫和關(guān)系數(shù)據(jù)庫之間數(shù)據(jù)的加載、轉(zhuǎn)換、傳輸和存儲服務(wù),在解決數(shù)據(jù)共享上發(fā)揮著重要作用,有利于對現(xiàn)有數(shù)據(jù)資源進行重新整合,充分發(fā)掘數(shù)據(jù)資源的潛在價值,滿足了不同業(yè)務(wù)的協(xié)同需求。
[1]李亮舉, 彭會軍. 冶金過程控制開發(fā)平臺中進程通信系統(tǒng)的開發(fā)及應(yīng)用[J]. 首鋼科技. 2011,11: 12-16.
[2]David Sceppa著, 石鈞, 葛俊譯. ADO編程技術(shù)[M]. 清華大學(xué)出版社, 2001.
[3]嚴蔚敏, 吳偉民著. 數(shù)據(jù)結(jié)構(gòu)[M]. 清華大學(xué)出版社, 2005.
[4]王海亮, 張利民, 王海鳳, 鄭建茹等著. 精通Oracle 10g[M]. 中國水利水電出版社, 2005.
[5]Raphael Pender著, 蘇劍等譯. 標(biāo)準(zhǔn)C++編程寶典[M].電子工業(yè)出版社,2001.