北京首鋼自動(dòng)化信息技術(shù)有限公司 李亮舉,劉孟祎
現(xiàn)代工業(yè)的特點(diǎn)是要求生產(chǎn)全過(guò)程的實(shí)時(shí)監(jiān)控,高速的實(shí)時(shí)數(shù)據(jù)處理,長(zhǎng)期的歷史數(shù)據(jù)存儲(chǔ)以及生產(chǎn)信息的集成與共享。在工業(yè)生產(chǎn)過(guò)程中,計(jì)算機(jī)控制技術(shù)已經(jīng)得到了普及,先進(jìn)的控制理論和計(jì)算機(jī)技術(shù)相結(jié)合更好地解決了生產(chǎn)工藝日益復(fù)雜,控制質(zhì)量要求越來(lái)越高的問(wèn)題。
在實(shí)際工業(yè)自動(dòng)化控制過(guò)程中需要處理大量的數(shù)據(jù),數(shù)據(jù)變化速度快,并且存在大量非結(jié)構(gòu)化數(shù)據(jù)(包括圖象、聲音、視頻等)以及半結(jié)構(gòu)化數(shù)據(jù)。實(shí)時(shí)數(shù)據(jù)庫(kù)的長(zhǎng)處在于不需要人工干預(yù),可實(shí)時(shí)處理大量并發(fā)的數(shù)據(jù)信息;關(guān)系數(shù)據(jù)庫(kù)可以非常簡(jiǎn)便地實(shí)現(xiàn)對(duì)象信息的定義和存儲(chǔ)。因此,基于工業(yè)自動(dòng)化控制的需求以及兩種數(shù)據(jù)庫(kù)各自不同的優(yōu)勢(shì),產(chǎn)生了實(shí)時(shí)數(shù)據(jù)庫(kù)與關(guān)系數(shù)據(jù)庫(kù)的結(jié)合使用,從而產(chǎn)生了兩種數(shù)據(jù)庫(kù)之間密切頻繁地相互通訊。為了解決這一問(wèn)題,進(jìn)行了數(shù)據(jù)交換服務(wù)的設(shè)計(jì)與實(shí)現(xiàn)。
RealTime Database (RTDB)實(shí)時(shí)數(shù)據(jù)庫(kù)是數(shù)據(jù)庫(kù)技術(shù)發(fā)展的一個(gè)分支,是數(shù)據(jù)庫(kù)技術(shù)結(jié)合實(shí)時(shí)處理技術(shù)產(chǎn)生的,適用于處理不斷更新的快速變化的數(shù)據(jù)及具有時(shí)間限制的事務(wù)。實(shí)時(shí)數(shù)據(jù)庫(kù)是開(kāi)發(fā)實(shí)時(shí)控制系統(tǒng)、數(shù)據(jù)采集系統(tǒng)等的重要支撐,它有較高的I/O事務(wù)吞吐量和高效的數(shù)據(jù)壓縮技術(shù),可以實(shí)現(xiàn)實(shí)時(shí)、高效、可靠的數(shù)據(jù)存儲(chǔ)和查詢(xún),同時(shí)為用戶節(jié)省磁盤(pán)空間。實(shí)時(shí)數(shù)據(jù)庫(kù)主要應(yīng)用于工業(yè)監(jiān)控,在實(shí)際生產(chǎn)中存儲(chǔ)著每個(gè)工藝過(guò)程點(diǎn)采集到的大量數(shù)據(jù)。實(shí)時(shí)數(shù)據(jù)庫(kù)也存在缺點(diǎn),它的存儲(chǔ)能力有限。
Relational Database (RDB)是指采用關(guān)系模型的關(guān)系數(shù)據(jù)庫(kù),是一些相互之間存在一定關(guān)聯(lián)的表的集合。關(guān)系數(shù)據(jù)庫(kù)的存儲(chǔ)能力強(qiáng),旨在處理永久、穩(wěn)定的數(shù)據(jù),便于企業(yè)的生產(chǎn)管理、數(shù)據(jù)分析以及決策。在工業(yè)控制中使用關(guān)系數(shù)據(jù)庫(kù)對(duì)大量歷史數(shù)據(jù)進(jìn)行存儲(chǔ)、管理和分析。但是關(guān)系數(shù)據(jù)庫(kù)的數(shù)據(jù)處理速度低,無(wú)法對(duì)生產(chǎn)過(guò)程數(shù)據(jù)進(jìn)行及時(shí)高效的存儲(chǔ)。
數(shù)據(jù)交換服務(wù)管理著不同來(lái)源、不同屬性的海量數(shù)據(jù),為用戶提供快捷方便的服務(wù),包括從實(shí)時(shí)數(shù)據(jù)庫(kù)(RTDB)到關(guān)系數(shù)據(jù)庫(kù)(RDB)的數(shù)據(jù)轉(zhuǎn)換存儲(chǔ),和關(guān)系數(shù)據(jù)庫(kù)(RDB)到實(shí)時(shí)數(shù)據(jù)庫(kù)(RTDB)的數(shù)據(jù)轉(zhuǎn)換存儲(chǔ)。數(shù)據(jù)交換服務(wù)為不同數(shù)據(jù)庫(kù)之間的互連互通提供了包含加載、轉(zhuǎn)換、傳輸和存儲(chǔ)等操作,可以有效解決數(shù)據(jù)及時(shí)、高效地上傳下達(dá),在安全、方便、快捷、順暢的進(jìn)行數(shù)據(jù)交換的同時(shí)保證數(shù)據(jù)的一致性和準(zhǔn)確性,實(shí)現(xiàn)數(shù)據(jù)的一次采集、多次分析使用,為各種應(yīng)用和決策支持提供良好的數(shù)據(jù)環(huán)境。

圖1 數(shù)據(jù)事務(wù)處理示意圖
使用鏈表可以方便有層次地進(jìn)行管理和擴(kuò)展,鏈表中的每個(gè)結(jié)點(diǎn)包括數(shù)據(jù)域和指針域,其中數(shù)據(jù)域存儲(chǔ)數(shù)據(jù)元素的信息,指針域中存儲(chǔ)結(jié)點(diǎn)直接后繼的存儲(chǔ)位置。在數(shù)據(jù)交換服務(wù)中采用三層鏈表結(jié)構(gòu)如圖2所示,將連接connection作為第一級(jí)鏈表,每個(gè)連接下的表格table掛接到二級(jí)鏈表上,綁定bind則作為第三級(jí)鏈表。其中:
連接(Connection)鏈表:list
表(Table)鏈表:list
綁定(Bind)鏈表:list

圖2 數(shù)據(jù)交換服務(wù)的三層鏈表結(jié)構(gòu)
由于鏈表不要求邏輯上相鄰的元素在物理位置上也相鄰,因此它沒(méi)有順序存儲(chǔ)結(jié)構(gòu)所具有的弱點(diǎn),但同時(shí)也失去了順序表可隨機(jī)存取的優(yōu)點(diǎn)。
在數(shù)據(jù)交換服務(wù)中,轉(zhuǎn)存的單位定義為數(shù)據(jù)表,用戶可以通過(guò)客戶端定義數(shù)據(jù)表中需要轉(zhuǎn)存的數(shù)據(jù)點(diǎn)、數(shù)據(jù)轉(zhuǎn)存的方向、轉(zhuǎn)存的時(shí)間間隔等相關(guān)信息。用戶可以完成增加、刪除和修改數(shù)據(jù)表等操作。
2.1.1 RTDB的讀取和存儲(chǔ)
使用冶金過(guò)程控制系統(tǒng)開(kāi)發(fā)平臺(tái)的分布式進(jìn)程通訊中間件進(jìn)行RTDB數(shù)據(jù)的讀取和存儲(chǔ)。讀寫(xiě)過(guò)程調(diào)用等待接口、請(qǐng)求接口和應(yīng)答接口。
2.1.2 RDB的讀取和存儲(chǔ)
RDB的讀取和存儲(chǔ)采用的是ADO技術(shù)。ADO是開(kāi)發(fā)訪問(wèn)OLE數(shù)據(jù)庫(kù)應(yīng)用程序所使用的一種數(shù)據(jù)庫(kù)訪問(wèn)組件,是一種可以訪問(wèn)各種數(shù)據(jù)類(lèi)型的連接機(jī)制,具有容易使用、數(shù)據(jù)庫(kù)訪問(wèn)速度高、內(nèi)存支出少、使用較少的網(wǎng)絡(luò)流量的優(yōu)點(diǎn),其性能和易用性都達(dá)到了極佳水平。利用ADO對(duì)象并通過(guò)ODBC或OLE DB,可以實(shí)現(xiàn)對(duì)任意數(shù)據(jù)庫(kù)的存取和訪問(wèn),包括SQL Server、Oracle、Access、Excel以及文本文件、圖形文件等數(shù)據(jù)源。
ADO模型包括7個(gè)對(duì)象,其中主要對(duì)象有3個(gè):Connection、Command和 Recordset ,可以被獨(dú)立創(chuàng)建和釋放。此外,還包括其他4個(gè)集合對(duì)象:Fields、Errors、Parameters和Properties。一個(gè)典型的ADO應(yīng)用程序使用Connection對(duì)象建立與數(shù)據(jù)源的連接,然后使用Command對(duì)象給出對(duì)數(shù)據(jù)庫(kù)操作的命令,如插入數(shù)據(jù)或者查詢(xún)數(shù)據(jù)等,而Recordset用于對(duì)結(jié)果集進(jìn)行維護(hù)或者瀏覽等操作。其中Command連接字符串與對(duì)應(yīng)的數(shù)據(jù)源有關(guān),不同的數(shù)據(jù)源使用不同的命令,對(duì)于關(guān)系數(shù)據(jù)庫(kù),通常使用SQL作為命令語(yǔ)言。使用ADO進(jìn)行RDB讀取和存儲(chǔ)主要包括以下步驟:
① 初始化COM庫(kù),引入ADO庫(kù)定義文件。
::CoInitialize (NULL);
#import "C:program filescommon filessystemadomsado15.dll"no_namespace rename("EOF", "EndOfFile")
② 用Connection對(duì)象連接數(shù)據(jù)庫(kù)。
ORACLE數(shù)據(jù)庫(kù)的連接字符串為:數(shù)據(jù)庫(kù)提供者OraOLEDB.Oracle.1;用戶名;密碼;數(shù)據(jù)源oracles; pConn ->Open(連接字符串,用戶名,密碼,同異步);
SQ LSe rve r數(shù)據(jù)庫(kù)的連接字符串為:數(shù)據(jù)庫(kù)提供者SQLOLEDB;數(shù)據(jù)庫(kù)Database;用戶名;密碼;數(shù)據(jù)源127.0.0.1"; 連接:pConn ->Open(連接字符串,用戶名,密碼,同異步);
③ 利用建立好的連接,通過(guò)Command對(duì)象執(zhí)行SQL命令,使用Recordset對(duì)象取得結(jié)果記錄集進(jìn)行處理、查詢(xún),更新數(shù)據(jù)庫(kù)。
pCommand->Execute(&vRecordsAffected,NULL,adCmdUnknown );
④關(guān)閉連接,釋放對(duì)象所占的資源。
::CoUninitialize();
變體VARIANT數(shù)據(jù)類(lèi)型是所有沒(méi)被顯式聲明(用如Private、Public 或 Static等語(yǔ)句)為其他類(lèi)型變量,能夠在運(yùn)行期間動(dòng)態(tài)改變類(lèi)型的數(shù)據(jù)類(lèi)型。變體能支持所有簡(jiǎn)單的數(shù)據(jù)類(lèi)型,如整型、浮點(diǎn)型、字符串、布爾型、日期時(shí)間、貨幣等。數(shù)值數(shù)據(jù)為負(fù)數(shù)時(shí)范圍從-1.797693134862315E308 到-4.94066E-324,正數(shù)時(shí)則從4.94066E-324 到 1.797693134862315E308。
可以用 Variant 數(shù)據(jù)類(lèi)型來(lái)替換各種數(shù)據(jù)類(lèi)型,有很強(qiáng)的適應(yīng)性。通常,數(shù)值Variant 數(shù)據(jù)保持為其Variant中原來(lái)的數(shù)據(jù)類(lèi)型。例如,算術(shù)運(yùn)算是針對(duì)含Byte、Integer、Long或 Single 之一的Variant執(zhí)行的,如果把一個(gè)Integer賦值給Variant,則接下來(lái)的運(yùn)算會(huì)把此Variant當(dāng)成Integer來(lái)處理,但是當(dāng)運(yùn)算結(jié)果超過(guò)原來(lái)數(shù)據(jù)類(lèi)型的正常范圍時(shí),存在Variant中的結(jié)果會(huì)被提升到能表示較大數(shù)據(jù)范圍的數(shù)據(jù)類(lèi)型。如 Byte 則提升到Integer,Integer 則提升到Long,而Long和Single則提升為Double。當(dāng)Variant變量中有Decimal及Double值超過(guò)它們各自的范圍時(shí),則會(huì)發(fā)生錯(cuò)誤。
Variant數(shù)據(jù)結(jié)構(gòu)包含兩個(gè)域,第一個(gè)是vt域,定義成各種類(lèi)型的數(shù)據(jù)成員構(gòu)成的聯(lián)合體,它決定著第二個(gè)域的數(shù)據(jù)類(lèi)型;第二個(gè)域是一個(gè)用來(lái)指明聯(lián)合體中目前起作用的數(shù)據(jù)類(lèi)型的變量,名稱(chēng)隨著vt域中輸入值的不同而改變。變體接收到的數(shù)據(jù)存儲(chǔ)在聯(lián)合體的某個(gè)數(shù)據(jù)成員中。例如:當(dāng)一個(gè)long型數(shù)據(jù)存入Variant類(lèi)型時(shí),vt域類(lèi)型為VT_I4,其第二個(gè)域使用的名稱(chēng)是lVal。對(duì)Variant變量的賦值方法:首先給vt成員賦值,指明數(shù)據(jù)類(lèi)型,再對(duì)聯(lián)合結(jié)構(gòu)中相同數(shù)據(jù)類(lèi)型的變量賦值。例如:variant v; int a=2013; v.vt=VT_I4; v.lVal=a。
2.2.1 實(shí)時(shí)數(shù)據(jù)庫(kù)到ORACLE、SQLServer關(guān)系數(shù)據(jù)庫(kù)轉(zhuǎn)換
從實(shí)時(shí)數(shù)據(jù)庫(kù)讀出來(lái)數(shù)據(jù),存入關(guān)系數(shù)據(jù)庫(kù)之前先把數(shù)據(jù)轉(zhuǎn)換成變體類(lèi)型,再將變體類(lèi)型存入關(guān)系數(shù)據(jù)庫(kù)。存入關(guān)系數(shù)據(jù)庫(kù)的數(shù)據(jù)類(lèi)型和從數(shù)據(jù)庫(kù)取出的變體類(lèi)型是有確定的對(duì)應(yīng)關(guān)系的,具體關(guān)系如表1和表2所示:

表1 ORACLE數(shù)據(jù)類(lèi)型和變體類(lèi)型對(duì)應(yīng)關(guān)系

表2 SQLServer數(shù)據(jù)類(lèi)型和變體類(lèi)型對(duì)應(yīng)關(guān)系
一些VARIANT支持的類(lèi)型如VT_I2(short整型)、VT_UI2(unsigned short無(wú)符號(hào)整型)、VT_UI4(unsigned long 無(wú)符號(hào)長(zhǎng)整型)可以直接定義,但是無(wú)法從ORACLE或者SQLServer關(guān)系數(shù)據(jù)庫(kù)中取出這些類(lèi)型的數(shù)據(jù)。
在數(shù)據(jù)交換服務(wù)的類(lèi)型轉(zhuǎn)換過(guò)程中,進(jìn)行了嚴(yán)格的類(lèi)型匹配檢查以及合法轉(zhuǎn)換的數(shù)值范圍檢查,如果不符合要求則為非法轉(zhuǎn)換,服務(wù)會(huì)報(bào)錯(cuò)提示類(lèi)型轉(zhuǎn)換失敗,需要用戶重新設(shè)置數(shù)據(jù)類(lèi)型。
例如RTDB的XT_XCHAR類(lèi)型轉(zhuǎn)換到RDB的NUMBER類(lèi)型時(shí),需要做以下檢查:
①字符串是否已初始化,如果未初始化則報(bào)錯(cuò)提示用戶需要先進(jìn)行初始化操作。
②從字符串到數(shù)字類(lèi)型轉(zhuǎn)換首位是否為數(shù)字或者符號(hào)位的檢查,如果首位不是數(shù)字或者符號(hào)位,則轉(zhuǎn)換是非法的,服務(wù)報(bào)錯(cuò)。
③首位之外的其他位是否為數(shù)字或者小數(shù)點(diǎn)的檢查,不是數(shù)字或者小數(shù)點(diǎn)則是非法轉(zhuǎn)換,服務(wù)報(bào)錯(cuò)。
④末位是否為數(shù)字的檢查,不是數(shù)字則是非法轉(zhuǎn)換,報(bào)錯(cuò)。
2.2.2 ORACLE、SQLServer關(guān)系數(shù)據(jù)庫(kù)到實(shí)時(shí)數(shù)據(jù)庫(kù)轉(zhuǎn)換
從關(guān)系數(shù)據(jù)庫(kù)取出變體類(lèi)型的數(shù)據(jù),進(jìn)行數(shù)據(jù)類(lèi)型轉(zhuǎn)換,再存入實(shí)時(shí)數(shù)據(jù)庫(kù)。在類(lèi)型轉(zhuǎn)換時(shí),同樣需要進(jìn)行嚴(yán)格的類(lèi)型匹配檢查以及合法轉(zhuǎn)換的數(shù)值范圍檢查。
例如:RDB的 VT_I2類(lèi)型到RTDB的XT_UI2類(lèi)型轉(zhuǎn)換時(shí),需要合法轉(zhuǎn)換數(shù)值范圍的檢查。Int的數(shù)據(jù)范圍是-32768~32767,unsigned int的數(shù)據(jù)范圍是0~65535。因此當(dāng)需要轉(zhuǎn)換的數(shù)值處于[-32768,0)時(shí),服務(wù)會(huì)報(bào)錯(cuò)提示轉(zhuǎn)換非法。

數(shù)據(jù)類(lèi)型轉(zhuǎn)換的分支很多,分支總個(gè)數(shù)是實(shí)時(shí)數(shù)據(jù)庫(kù)數(shù)據(jù)類(lèi)型的個(gè)數(shù)與關(guān)系數(shù)據(jù)庫(kù)數(shù)據(jù)類(lèi)型個(gè)數(shù)的笛卡爾積,而在每個(gè)分支中的類(lèi)型匹配檢查個(gè)數(shù)以及合法轉(zhuǎn)換數(shù)值范圍檢查個(gè)數(shù)則更為龐大,十分復(fù)雜。
數(shù)據(jù)交換服務(wù)開(kāi)發(fā)完成后首先應(yīng)用到了冶金過(guò)程控制系統(tǒng)開(kāi)發(fā)平臺(tái)的數(shù)據(jù)平臺(tái)中。數(shù)據(jù)平臺(tái)涉及到大量的數(shù)據(jù)采集、分析計(jì)算處理和數(shù)據(jù)存儲(chǔ)轉(zhuǎn)換,數(shù)據(jù)交換服務(wù)能夠很好地完成其中的數(shù)據(jù)讀取、存儲(chǔ)和轉(zhuǎn)換功能,轉(zhuǎn)換存儲(chǔ)效率較高,功能良好。該服務(wù)在自動(dòng)控制系統(tǒng)中可以對(duì)現(xiàn)場(chǎng)收集到的數(shù)據(jù)進(jìn)行出色地處理,滿足工業(yè)現(xiàn)場(chǎng)的需要。
數(shù)據(jù)交換服務(wù)是工業(yè)自動(dòng)化信息化發(fā)展過(guò)程中自動(dòng)控制系統(tǒng)的一個(gè)重要組成部分,該服務(wù)運(yùn)行穩(wěn)定,可以快速而準(zhǔn)確地提供實(shí)時(shí)數(shù)據(jù)庫(kù)和關(guān)系數(shù)據(jù)庫(kù)之間數(shù)據(jù)的加載、轉(zhuǎn)換、傳輸和存儲(chǔ)服務(wù),在解決數(shù)據(jù)共享上發(fā)揮著重要作用,有利于對(duì)現(xiàn)有數(shù)據(jù)資源進(jìn)行重新整合,充分發(fā)掘數(shù)據(jù)資源的潛在價(jià)值,滿足了不同業(yè)務(wù)的協(xié)同需求。
[1]李亮舉, 彭會(huì)軍. 冶金過(guò)程控制開(kāi)發(fā)平臺(tái)中進(jìn)程通信系統(tǒng)的開(kāi)發(fā)及應(yīng)用[J]. 首鋼科技. 2011,11: 12-16.
[2]David Sceppa著, 石鈞, 葛俊譯. ADO編程技術(shù)[M]. 清華大學(xué)出版社, 2001.
[3]嚴(yán)蔚敏, 吳偉民著. 數(shù)據(jù)結(jié)構(gòu)[M]. 清華大學(xué)出版社, 2005.
[4]王海亮, 張利民, 王海鳳, 鄭建茹等著. 精通Oracle 10g[M]. 中國(guó)水利水電出版社, 2005.
[5]Raphael Pender著, 蘇劍等譯. 標(biāo)準(zhǔn)C++編程寶典[M].電子工業(yè)出版社,2001.