引言
隨著某化工倉儲企業(yè)生產(chǎn)經(jīng)營規(guī)模的不斷擴(kuò)大,不同時期所采用的現(xiàn)場儀表不同往往使得儀表種類越來越多,需要處理的數(shù)據(jù)量也越來越大。這些數(shù)據(jù)有的通過PLc控制系統(tǒng)采集,有的甚至還需要人工抄表和手動錄入數(shù)據(jù),這不僅造成了工作效率低下,而且還容易導(dǎo)致各個生產(chǎn)區(qū)之間的信息彼此孤立。形成一個個信息孤島。信息孤島使得企業(yè)的生產(chǎn)管理人員無法及時獲知準(zhǔn)確有效的數(shù)據(jù)并及時做出決策,這在一定程度上影響了企業(yè)的生產(chǎn)運(yùn)營。在工業(yè)信息化的大背景下,有必要將各孤立系統(tǒng)的數(shù)據(jù)進(jìn)行集成整合,建立
實時數(shù)據(jù)庫系統(tǒng),從而為上層ERP系統(tǒng)及應(yīng)用軟件提供準(zhǔn)確實時的數(shù)據(jù)。
由于該企業(yè)的大部分儀表還能正常使用,如直接淘汰、更換系統(tǒng)將會造成很大的資源浪費(fèi)。本文結(jié)合該企業(yè)的數(shù)據(jù)采集改造項目,設(shè)計實現(xiàn)了一套對全廠生產(chǎn)數(shù)據(jù)進(jìn)行集成處理的軟件系統(tǒng)。
1 系統(tǒng)設(shè)計
罐區(qū)實時生產(chǎn)數(shù)據(jù)主要有儲罐液位、溫度和壓力等,這些原始數(shù)據(jù)由現(xiàn)場的液位計、多點溫度測量儀、壓力表等獲取。該化工倉儲企業(yè)現(xiàn)有一套西門子s7.300 PLC控制系統(tǒng)、2臺AWG一ⅡA型巡檢儀、若干AwG—IB型光電智能液位儀、若干科隆BMloo雷達(dá)液位計、若干帶通信接口的罐旁指示儀和其他一些溫度、壓力、液位傳感器。這些現(xiàn)場測量儀表有的通過4—20 mA的模擬信號或通信線接入到PLc控制系統(tǒng)中,有的通過帶有通信接口的罐旁指示儀或直接接入到巡檢儀(二次表),其他的則未接人任何系統(tǒng)。
根據(jù)現(xiàn)有系統(tǒng)設(shè)備的特點,數(shù)據(jù)采集軟件需實現(xiàn)以下3個功能:與PLc控制系統(tǒng)通信并采集數(shù)據(jù)、從巡檢儀中采集數(shù)據(jù)、直接與現(xiàn)場表通信并采集數(shù)據(jù)。
整個數(shù)據(jù)采集系統(tǒng)以數(shù)據(jù)采集為中心,在一臺工控機(jī)上運(yùn)行數(shù)據(jù)采集程序;從底層采集各部分原始數(shù)據(jù),根據(jù)相應(yīng)的計算標(biāo)準(zhǔn)計算體積、儲量等;并通過網(wǎng)絡(luò)通信協(xié)議將數(shù)據(jù)轉(zhuǎn)存到數(shù)據(jù)服務(wù)器。這些數(shù)據(jù)作為歷史數(shù)據(jù)存人關(guān)系數(shù)據(jù)庫,為上層的應(yīng)用提供數(shù)據(jù)。系統(tǒng)結(jié)構(gòu)圖如圖l所示。
2 數(shù)據(jù)通信
由于系統(tǒng)中的設(shè)備類型各不相同,它們各自具有不同的通信協(xié)議,因此,數(shù)據(jù)采集程序必須遵循相應(yīng)的通信規(guī)范才能從各種設(shè)備中讀到數(shù)據(jù)。
本系統(tǒng)數(shù)據(jù)通信解決方案如下。
①與PLc控制系統(tǒng)的通信采用OPc協(xié)議。OPc過程控制數(shù)據(jù)采集的標(biāo)準(zhǔn),為目前主流的組態(tài)軟件所遵循。西門子的上位機(jī)軟件支持0PC標(biāo)準(zhǔn),并提供0PC Server服務(wù),即只要在客戶端開發(fā)OPCClient,就可請求到存放在OPc Senrer中的過程數(shù)據(jù)。
②由于OPC標(biāo)準(zhǔn)被大多數(shù)自動化廠家所采用,所以部分底層數(shù)據(jù)采集設(shè)備也支持OPc。在通信軟件中開發(fā)OPC Senrer程序,將硬件設(shè)備作為0Pc的數(shù)據(jù)源,可直接從底層采集設(shè)備中獲取過程數(shù)據(jù)值。
③與巡檢儀及部分現(xiàn)場儀表的通信采用Modbus協(xié)議。巡檢儀及大部分現(xiàn)場設(shè)備都支持目前工業(yè)領(lǐng)域最流行的通信協(xié)議之一的Modbus。通過工控機(jī)串口與它們提供的接口相連,即可進(jìn)行主從方式通信。
④部分不支持通信的采集設(shè)備,可將數(shù)值轉(zhuǎn)換為4—20 InA模擬信號,接入到PLC控制系統(tǒng)中,再通過OPC方式采集。
⑤由于OPc服務(wù)器很難穿過防火墻進(jìn)行數(shù)據(jù)傳輸,所以采集程序與數(shù)據(jù)服務(wù)器及上層應(yīng)用軟件之間通過UDP協(xié)議交換數(shù)據(jù)。通過該解決方案,所有的數(shù)據(jù)都能接入到采集系統(tǒng)。并進(jìn)行實時準(zhǔn)確測量。
3 系統(tǒng)實現(xiàn)
主程序分為Modbus通信模塊、0PC通信模塊、uDP通信模塊和數(shù)據(jù)計算模塊。程序采用多線程技術(shù),將各種數(shù)據(jù)的接收和發(fā)送放在優(yōu)先級較高的線程中。在數(shù)據(jù)收發(fā)期間,數(shù)據(jù)的計算處理并不影響主程序的運(yùn)行。此外,在程序中采用全局內(nèi)存存放實時采集的數(shù)據(jù),以便于數(shù)據(jù)的快速存取交換。系統(tǒng)主要程序基于VC++實現(xiàn)。
3.1 Modb哪通信模塊
M0dbus協(xié)議包括AscII、RTu(遠(yuǎn)程終端單元)、TcP等工作模式,本系統(tǒng)采用較高數(shù)據(jù)傳送密度的RTU通信模式。在該模式下,數(shù)據(jù)通信一般采用主從方式,主機(jī)向從設(shè)備發(fā)出請求消息;從設(shè)備接收到正確消息后就可以發(fā)送數(shù)據(jù)到主機(jī),以響應(yīng)請求H1。Modbus RTu消息幀結(jié)構(gòu)如圖2所示,其中,T1一T2一T3一T4。為不小于3.5個字符時間的停頓間隔。
Modbus協(xié)議需要對數(shù)據(jù)進(jìn)行校驗。串行協(xié)議中除有奇偶校驗外,I刪模式還采用16位CRc(循環(huán)冗長檢測)校驗。CRC的生成流程具體如下。
①預(yù)置一個16位寄存器為oFFFFH(全1),即為CRC寄存器。
②把數(shù)據(jù)幀中的第一個字節(jié)的8位與cRc寄存器中的低字節(jié)進(jìn)行異或運(yùn)算,結(jié)果存入CRC寄存器。
③將CRc寄存器向右移一位,最高位填以0,最低位移出并檢測其值。
④如果最低位為O,則進(jìn)行下一次移位;如果最低位為l,將cRc寄存器與一個0A00lH進(jìn)行異或運(yùn)算。
⑤重復(fù)步驟③一步驟④,直到8次移位,這樣就處理完了一個完整的8位數(shù)據(jù)。
⑥處理下一個8位數(shù)據(jù),直到所有的字節(jié)處理結(jié)束.最終CRC寄存器的值就是cRc的值。
3.2 OPC通信模塊
OPC服務(wù)器由服務(wù)器、組和數(shù)據(jù)項這3類對象組成。服務(wù)器對象具有服務(wù)器的所有信息,同時也是組對象的容器。組對象具有本組的所有信息,同時包容數(shù)據(jù)項。項對象是讀寫數(shù)據(jù)的最小邏輯單位,項與具體的位號相連。OPC服務(wù)器支持自動化接口和定制接口兩種訪問接口。
OPC C1ienI的具體開發(fā)流程如下。
①初始化coM庫,當(dāng)需要調(diào)用cOM庫時,需使coInitializeEx()來為當(dāng)前線程初始化c0M庫。CoInitializeEx()提供了一個讓用戶可以選擇多線程模式還是單線程模式的參數(shù)。
HRESUIJ hr=CoInitializeEx(NULL,COINIT—MU加THREADED);
②通過oPc服務(wù)器的ProgID查詢cLsID,通過給定的ProgID,采用CLSIDFromPmdD()函數(shù)從注冊表中查找出對應(yīng)的類標(biāo)符。
CLSlD(Class Identifer);
HRESUIJ hr=CLSlDFmmProgID(m—strProgID,&clsid);
③創(chuàng)建OPC服務(wù)器對象,并查詢OPc服務(wù)器對象的IOPCsenrer接口。通過調(diào)用cocreateInstaJlceEx()函數(shù),不僅可以在本機(jī)中創(chuàng)建COM對象并得到一個接口指針,還可以實現(xiàn)遠(yuǎn)程訪問。將Mu哪一QI結(jié)構(gòu)體數(shù)組中指向IOPCserver接口的元素賦值給變量m—pISen,er,以獲取lOPCsenrer接口,進(jìn)而可以使用該接口完成對組對象進(jìn)行創(chuàng)建、刪除、枚舉和獲取當(dāng)前狀態(tài)等操作。
IOPCServer*Im_pISen,er;
m—pIserver=(IOPcsen,er木)m arrMultiQI[MQIIOPCSERVER].pItf;
④添加OPC組對象,并查詢IOPCItemMgt接口,通過IOPcserver接口的AddGroup()方法添加組對象,它將返回一個指向OPC組對象Iunknown的指針。通過Iunknown的QueryInte血ce方法可獲得0Pc組對象的IOPcItemMgt接口指針,進(jìn)而可以使用該接口完成對各項進(jìn)行添加、刪除和設(shè)置參數(shù)等操作。
hr=pUnknmm一>QlueryInterf砬e[uD—10PCItemMgt,(void**)&(nLpIItemMgt)];
②通過oPc服務(wù)器的ProgID查詢cLsID,通過給定的ProgID,采用CLSIDFromPmdD()函數(shù)從注冊表中查找出對應(yīng)的類標(biāo)符。
CLSlD(Class Identifer);
HRESUIJ hr=CLSlDFmmProgID(m—strProgID,&clsid);
③創(chuàng)建OPC服務(wù)器對象,并查詢OPc服務(wù)器對象的IOPCsenrer接口。通過調(diào)用cocreateInstaJlceEx()函數(shù),不僅可以在本機(jī) 中創(chuàng)建COM對象并得到一個接口指針,還可以實現(xiàn)遠(yuǎn)程訪問。將Mu哪一QI結(jié)構(gòu)體數(shù)組中指向IOPCserver接口的元素賦值給變量m— pISen,er,以獲取lOPCsenrer接口,進(jìn)而可以使用該接口完成對組對象進(jìn)行創(chuàng)建、刪除、枚舉和獲取當(dāng)前狀態(tài)等操作。
IOPCServer*Im_pISen,er;
m—pIserver=(IOPcsen,er木)m arrMultiQI[MQIIOPCSERVER].pItf;
④添加OPC組對象,并查詢IOPCItemMgt接口,通過IOPcserver接口的AddGroup()方法添加組對象,它將返回一個指向OPC組 對象Iunknown的指針。通過Iunknown的QueryInte血ce方法可獲得0Pc組對象的IOPcItemMgt接口指針,進(jìn)而可以使用該 接口完成對各項進(jìn)行添加、刪除和設(shè)置參數(shù)等操作。
hr=pUnknmm一>QlueryInterf砬e[uD—10PCItemMgt,(void**)&(nLpIItemMgt)];
⑤添加項:為保存項的相關(guān)屬性值的結(jié)構(gòu)體數(shù)組進(jìn)行賦值。以該結(jié)構(gòu)體數(shù)組為參數(shù),用10PcltemMgt接口的AddItem()方法添加項。
hr=m—pIItemMgt一>AddItems(dwCount,
//[in]要添加的項的數(shù)目
pItemAll置y,
//[in]保存項相關(guān)屬性值的結(jié)構(gòu)體數(shù)組
&pResults, //[out]返同數(shù)組
&pErrors); //【out]
HREsuLT數(shù)組,告訴客戶每個項是否成功添加
⑥同步讀寫:通過Iunknown的QueryInter厶lce方法,獲得0PC組對象的IOPcsyncIO接口指針。
hr=pUnknown一>QueryInte梳e(IIDjOPcSyllcIO,
(void**)&(m_pIS)mc));
采用10PCSyncl0接口的Read()方法,完成同步讀操作。
采用IOPCSyncIO接口的write()方法,完成同步寫操作。
⑦釋放:在程序關(guān)閉之前,需要刪除已創(chuàng)建的OPC對象并釋放內(nèi)存。
首先刪除以下項:
HRESU【JT Ilr = m—pIItemMgt一>RemoveItes(dwcount,phserver,&perrors);
接著釋放OPC組對象的IOPCItemMgt接口和IOPCSyncIO接口,然后刪除OPC組對象:調(diào)用服務(wù)器對象m—pIsen,er的RemoveGroup()方法,刪除0PC組對象,再調(diào)用Release()釋放服務(wù)器資源,最后關(guān)閉COM庫。
3.3 UDP通信模塊
用戶數(shù)據(jù)報協(xié)議(user data protocol,UDP)是一個簡單的面向數(shù)據(jù)包的傳輸層協(xié)議舊J,它所提供的是非面向連接的、不可靠的數(shù)據(jù)流傳輸。UDP不提供報文到達(dá)確認(rèn)、排序、 可靠以及流量控制等功能;它只是將應(yīng)用程序傳遞給IP層的數(shù)據(jù)報發(fā)送出去,但是并不能保證它們能到達(dá)目的地。由于uDP在傳輸數(shù)據(jù)報前不用在客戶和服務(wù)器 之間建立一個連接,且沒有超時重發(fā)等機(jī)制,因此,其傳輸速度更快。uDP數(shù)據(jù)通信格式和數(shù)據(jù)結(jié)構(gòu)定義如下。
UDP請求數(shù)據(jù)報格式如圖3所示。
其中,起始符為字符“撐”,ASCIl碼為35(十進(jìn)制);結(jié)束符為回車符,ASCII碼為13;請求位號長度為10 B,為同定長度,位號不足10 B的用空格符補(bǔ)充。定義一個UDP請求數(shù)據(jù)報可同時打包不超過30個位號。
UDP應(yīng)答數(shù)據(jù)報格式如圖4所示。
其中,起始符為字符“!”,AScII碼為33(十進(jìn)制);結(jié)束符為回車符,ASCII碼為13;應(yīng)答位號長度為lO B,為固定長度,位號不足10 B的用空格符補(bǔ)充;返回值長度為20 B,為同定長度,數(shù)據(jù)不足20 B的用空格符補(bǔ)充;連接符、位號與數(shù)據(jù)之間用“=”號連接,AsCII碼為6l。定義一個uDP應(yīng)答數(shù)據(jù)報可同時打包不超過30個
位號的數(shù)據(jù),數(shù)據(jù)報總長度不超過990 B。
本系統(tǒng)在MFC中使用CS0cket類實現(xiàn)UDP通信。Csocket是對winsock API的封裝,用于管理通信,使得用戶可以直接避免調(diào)用API函數(shù),數(shù)據(jù)的收發(fā)也因此變得簡單。
程序?qū)崿F(xiàn)時,系統(tǒng)分別構(gòu)造服務(wù)器和客戶端套接字對象,調(diào)用套接字對象的c刪()成員函數(shù)初始化套接字。調(diào)用Csocket類的重載函數(shù) onReceive()響應(yīng)接收事件;調(diào)用ReceiveFbm(1pBIlf,bu|‰n,RemoteIP,RemotePon,0)接收數(shù)據(jù)報,并 按照協(xié)議格式將數(shù)據(jù)從數(shù)據(jù)報中取出。按照通信協(xié)議將需要發(fā)送的數(shù)據(jù)打包,并調(diào)用SendTo(1pBuf,Sen掇 rLen,RenlDtePon,Remot椰,0)發(fā)送數(shù)據(jù)報。
4 關(guān)于實時數(shù)據(jù)庫的探討
該套數(shù)據(jù)采集軟件的設(shè)計與實現(xiàn),實際上為企業(yè)構(gòu)建了一個實時數(shù)據(jù)庫系統(tǒng)。程序中采用全局內(nèi)存共享技術(shù)對實時數(shù)據(jù)進(jìn)行存取,并采用內(nèi)存、文件管理、關(guān)系數(shù)據(jù)庫相結(jié)合的數(shù)據(jù)存儲策略,使系統(tǒng)在響應(yīng)速度、實時數(shù)據(jù)的共享性和時間一致性方面初步滿足了
實時數(shù)據(jù)庫系統(tǒng)的定義要求。
5 結(jié)束語
系統(tǒng)自投用以來運(yùn)行正常,效果良好,不僅解決了在生產(chǎn)數(shù)據(jù)管理過程中存在的問題,而且節(jié)省了購買SCADA硬件、軟件系統(tǒng)的大筆費(fèi)用。同時,避免了大量仍能使用的儀表設(shè)備的淘汰棄置,具有一定的經(jīng)濟(jì)效益。
轉(zhuǎn)載請注明出處:拓步ERP資訊網(wǎng)http://www.ezxoed.cn/
本文標(biāo)題:化工倉儲企業(yè)儲罐數(shù)據(jù)采集系統(tǒng)的設(shè)計與實現(xiàn)
本文網(wǎng)址:http://www.ezxoed.cn/html/consultation/1083937528.html