孫學(xué)華 錢思宇
(南京工業(yè)大學(xué)電子信息與工程學(xué)院,江蘇 南京 210009)
隨著某化工倉儲(chǔ)企業(yè)生產(chǎn)經(jīng)營規(guī)模的不斷擴(kuò)大,不同時(shí)期所采用的現(xiàn)場儀表不同往往使得儀表種類越來越多,需要處理的數(shù)據(jù)量也越來越大。這些數(shù)據(jù)有的通過PLC控制系統(tǒng)采集,有的甚至還需要人工抄表和手動(dòng)錄入數(shù)據(jù),這不僅造成了工作效率低下,而且還容易導(dǎo)致各個(gè)生產(chǎn)區(qū)之間的信息彼此孤立,形成一個(gè)個(gè)信息孤島。信息孤島使得企業(yè)的生產(chǎn)管理人員無法及時(shí)獲知準(zhǔn)確有效的數(shù)據(jù)并及時(shí)做出決策,這在一定程度上影響了企業(yè)的生產(chǎn)運(yùn)營。在工業(yè)信息化的大背景下,有必要將各孤立系統(tǒng)的數(shù)據(jù)進(jìn)行集成整合,建立實(shí)時(shí)數(shù)據(jù)庫系統(tǒng),從而為上層ERP系統(tǒng)及應(yīng)用軟件提供準(zhǔn)確實(shí)時(shí)的數(shù)據(jù)。
由于該企業(yè)的大部分儀表還能正常使用,如直接淘汰、更換系統(tǒng)將會(huì)造成很大的資源浪費(fèi)。本文結(jié)合該企業(yè)的數(shù)據(jù)采集改造項(xiàng)目,設(shè)計(jì)實(shí)現(xiàn)了一套對(duì)全廠生產(chǎn)數(shù)據(jù)進(jìn)行集成處理的軟件系統(tǒng)。
罐區(qū)實(shí)時(shí)生產(chǎn)數(shù)據(jù)主要有儲(chǔ)罐液位、溫度和壓力等,這些原始數(shù)據(jù)由現(xiàn)場的液位計(jì)、多點(diǎn)溫度測量儀、壓力表等獲取。該化工倉儲(chǔ)企業(yè)現(xiàn)有一套西門子S7-300 PLC控制系統(tǒng)、2臺(tái)AWG-ⅡA型巡檢儀、若干AWG-IB型光電智能液位儀、若干科隆BM100雷達(dá)液位計(jì)、若干帶通信接口的罐旁指示儀和其他一些溫度、壓力、液位傳感器。這些現(xiàn)場測量儀表有的通過4~20 mA的模擬信號(hào)或通信線接入到PLC控制系統(tǒng)中,有的通過帶有通信接口的罐旁指示儀或直接接入到巡檢儀(二次表),其他的則未接入任何系統(tǒng)。
根據(jù)現(xiàn)有系統(tǒng)設(shè)備的特點(diǎn),數(shù)據(jù)采集軟件需實(shí)現(xiàn)以下3個(gè)功能:與PLC控制系統(tǒng)通信并采集數(shù)據(jù)、從巡檢儀中采集數(shù)據(jù)、直接與現(xiàn)場表通信并采集數(shù)據(jù)。
整個(gè)數(shù)據(jù)采集系統(tǒng)以數(shù)據(jù)采集為中心,在一臺(tái)工控機(jī)上運(yùn)行數(shù)據(jù)采集程序;從底層采集各部分原始數(shù)據(jù),根據(jù)相應(yīng)的計(jì)算標(biāo)準(zhǔn)計(jì)算體積、儲(chǔ)量等;并通過網(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)圖如圖1所示。
圖1 系統(tǒng)結(jié)構(gòu)圖Fig.1 Structure of the system
由于系統(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)軟件所遵循[1]。西門子的上位機(jī)軟件支持OPC標(biāo)準(zhǔn),并提供OPC Server服務(wù),即只要在客戶端開發(fā)OPC Client,就可請(qǐng)求到存放在OPC Server中的過程數(shù)據(jù)[2]。
②由于OPC標(biāo)準(zhǔn)被大多數(shù)自動(dòng)化廠家所采用,所以部分底層數(shù)據(jù)采集設(shè)備也支持OPC。在通信軟件中開發(fā)OPC Server程序,將硬件設(shè)備作為OPC的數(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 mA模擬信號(hào),接入到PLC控制系統(tǒng)中,再通過OPC方式采集。
⑤由于OPC服務(wù)器很難穿過防火墻進(jìn)行數(shù)據(jù)傳輸,所以采集程序與數(shù)據(jù)服務(wù)器及上層應(yīng)用軟件之間通過UDP協(xié)議交換數(shù)據(jù)[3]。
通過該解決方案,所有的數(shù)據(jù)都能接入到采集系統(tǒng),并進(jìn)行實(shí)時(shí)準(zhǔn)確測量。
主程序分為Modbus通信模塊、OPC通信模塊、UDP通信模塊和數(shù)據(jù)計(jì)算模塊。程序采用多線程技術(shù),將各種數(shù)據(jù)的接收和發(fā)送放在優(yōu)先級(jí)較高的線程中。在數(shù)據(jù)收發(fā)期間,數(shù)據(jù)的計(jì)算處理并不影響主程序的運(yùn)行。此外,在程序中采用全局內(nèi)存存放實(shí)時(shí)采集的數(shù)據(jù),以便于數(shù)據(jù)的快速存取交換。系統(tǒng)主要程序基于VC++實(shí)現(xiàn)。
Modbus協(xié)議包括ASCII、RTU(遠(yuǎn)程終端單元)、TCP等工作模式,本系統(tǒng)采用較高數(shù)據(jù)傳送密度的RTU通信模式。在該模式下,數(shù)據(jù)通信一般采用主從方式,主機(jī)向從設(shè)備發(fā)出請(qǐng)求消息;從設(shè)備接收到正確消息后就可以發(fā)送數(shù)據(jù)到主機(jī),以響應(yīng)請(qǐng)求[4]。Modbus RTU消息幀結(jié)構(gòu)如圖2所示,其中,T1-T2-T3-T4為不小于3.5個(gè)字符時(shí)間的停頓間隔。
圖2 Modbus RTU消息幀結(jié)構(gòu)Fig.2 Structure of the message frame of Modbus RTU
Modbus協(xié)議需要對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)。串行協(xié)議中除有奇偶校驗(yàn)外,RTU模式還采用16位CRC(循環(huán)冗長檢測)校驗(yàn)。CRC的生成流程具體如下。
① 預(yù)置一個(gè)16位寄存器為0FFFFH(全1),即為CRC寄存器。
②把數(shù)據(jù)幀中的第一個(gè)字節(jié)的8位與CRC寄存器中的低字節(jié)進(jìn)行異或運(yùn)算,結(jié)果存入CRC寄存器。
③將CRC寄存器向右移一位,最高位填以0,最低位移出并檢測其值。
④如果最低位為0,則進(jìn)行下一次移位;如果最低位為1,將CRC寄存器與一個(gè)0A001H進(jìn)行異或運(yùn)算。
⑤重復(fù)步驟③~步驟④,直到8次移位,這樣就處理完了一個(gè)完整的8位數(shù)據(jù)。
⑥處理下一個(gè)8位數(shù)據(jù),直到所有的字節(jié)處理結(jié)束,最終CRC寄存器的值就是CRC的值。
OPC服務(wù)器由服務(wù)器、組和數(shù)據(jù)項(xiàng)這3類對(duì)象組成[5]。服務(wù)器對(duì)象具有服務(wù)器的所有信息,同時(shí)也是組對(duì)象的容器。組對(duì)象具有本組的所有信息,同時(shí)包容數(shù)據(jù)項(xiàng)。項(xiàng)對(duì)象是讀寫數(shù)據(jù)的最小邏輯單位,項(xiàng)與具體的位號(hào)相連[6]。OPC服務(wù)器支持自動(dòng)化接口和定制接口兩種訪問接口。
OPC Client的具體開發(fā)流程如下。
①初始化COM庫,當(dāng)需要調(diào)用COM庫時(shí),需使用CoInitializeEx()來為當(dāng)前線程初始化 COM庫[7]。CoInitializeEx()提供了一個(gè)讓用戶可以選擇多線程模式還是單線程模式的參數(shù)。
②通過OPC服務(wù)器的ProgID查詢CLSID,通過給定的ProgID,采用CLSIDFromProgID()函數(shù)從注冊(cè)表中查找出對(duì)應(yīng)的類標(biāo)符。
③創(chuàng)建OPC服務(wù)器對(duì)象,并查詢OPC服務(wù)器對(duì)象的IOPCServer接口。通過調(diào)用CoCreateInstanceEx()函數(shù),不僅可以在本機(jī)中創(chuàng)建COM對(duì)象并得到一個(gè)接口指針,還可以實(shí)現(xiàn)遠(yuǎn)程訪問。將MULTI_QI結(jié)構(gòu)體數(shù)組中指向IOPCServer接口的元素賦值給變量m_pIServer,以獲取IOPCServer接口,進(jìn)而可以使用該接口完成對(duì)組對(duì)象進(jìn)行創(chuàng)建、刪除、枚舉和獲取當(dāng)前狀態(tài)等操作。
④添加OPC組對(duì)象,并查詢IOPCItemMgt接口,通過IOPCServer接口的AddGroup()方法添加組對(duì)象,它將返回一個(gè)指向OPC組對(duì)象IUnknown的指針。通過IUnknown的QueryInterface方法可獲得OPC組對(duì)象的IOPCItemMgt接口指針,進(jìn)而可以使用該接口完成對(duì)各項(xiàng)進(jìn)行添加、刪除和設(shè)置參數(shù)等操作。
⑤添加項(xiàng):為保存項(xiàng)的相關(guān)屬性值的結(jié)構(gòu)體數(shù)組進(jìn)行賦值。以該結(jié)構(gòu)體數(shù)組為參數(shù),用IOPCItemMgt接口的AddItem()方法添加項(xiàng)。
⑥同步讀寫:通過IUnknown的QueryInterface方法,獲得OPC組對(duì)象的IOPCSyncIO接口指針。
采用IOPCSyncIO接口的Read()方法,完成同步讀操作。
采用IOPCSyncIO接口的Write()方法,完成同步寫操作。
⑦ 釋放:在程序關(guān)閉之前,需要?jiǎng)h除已創(chuàng)建的OPC對(duì)象并釋放內(nèi)存。
首先刪除以下項(xiàng):
接著釋放OPC組對(duì)象的IOPCItemMgt接口和IOPCSyncIO接口,然后刪除OPC組對(duì)象:調(diào)用服務(wù)器對(duì)象m_pIServer的RemoveGroup()方法,刪除OPC組對(duì)象,再調(diào)用Release()釋放服務(wù)器資源,最后關(guān)閉COM庫。
用戶數(shù)據(jù)報(bào)協(xié)議(user data protocol,UDP)是一個(gè)簡單的面向數(shù)據(jù)包的傳輸層協(xié)議[8],它所提供的是非面向連接的、不可靠的數(shù)據(jù)流傳輸。UDP不提供報(bào)文到達(dá)確認(rèn)、排序、可靠以及流量控制等功能;它只是將應(yīng)用程序傳遞給IP層的數(shù)據(jù)報(bào)發(fā)送出去,但是并不能保證它們能到達(dá)目的地[9]。由于UDP在傳輸數(shù)據(jù)報(bào)前不用在客戶和服務(wù)器之間建立一個(gè)連接,且沒有超時(shí)重發(fā)等機(jī)制,因此,其傳輸速度更快。UDP數(shù)據(jù)通信格式和數(shù)據(jù)結(jié)構(gòu)定義如下。
UDP請(qǐng)求數(shù)據(jù)報(bào)格式如圖3所示。
圖3 UDP請(qǐng)求數(shù)據(jù)報(bào)格式Fig.3 Request datagram format of UDP
其中,起始符為字符“#”,ASCII碼為 35(十進(jìn)制);結(jié)束符為回車符,ASCII碼為13;請(qǐng)求位號(hào)長度為10 B,為固定長度,位號(hào)不足10 B的用空格符補(bǔ)充。定義一個(gè)UDP請(qǐng)求數(shù)據(jù)報(bào)可同時(shí)打包不超過30個(gè)位號(hào)。
UDP應(yīng)答數(shù)據(jù)報(bào)格式如圖4所示。
圖4 UDP應(yīng)答數(shù)據(jù)報(bào)格式Fig.4 Response datagram format of UDP
其中,起始符為字符“!”,ASCII碼為33(十進(jìn)制);結(jié)束符為回車符,ASCII碼為13;應(yīng)答位號(hào)長度為10 B,為固定長度,位號(hào)不足10 B的用空格符補(bǔ)充;返回值長度為20 B,為固定長度,數(shù)據(jù)不足20 B的用空格符補(bǔ)充;連接符、位號(hào)與數(shù)據(jù)之間用“=”號(hào)連接,ASCII碼為61。定義一個(gè)UDP應(yīng)答數(shù)據(jù)報(bào)可同時(shí)打包不超過30個(gè)位號(hào)的數(shù)據(jù),數(shù)據(jù)報(bào)總長度不超過990 B。
本系統(tǒng)在MFC中使用CSocket類實(shí)現(xiàn)UDP通信。CSocket是對(duì)WinSock API的封裝,用于管理通信,使得用戶可以直接避免調(diào)用API函數(shù),數(shù)據(jù)的收發(fā)也因此變得簡單。
程序?qū)崿F(xiàn)時(shí),系統(tǒng)分別構(gòu)造服務(wù)器和客戶端套接字對(duì)象,調(diào)用套接字對(duì)象的Creat()成員函數(shù)初始化套接字。調(diào)用CSocket類的重載函數(shù)OnReceive()響應(yīng)接收事件;調(diào)用 ReceiveFrom(lpBuf,bufLen,RemoteIP,RemotePort,0)接收數(shù)據(jù)報(bào),并按照協(xié)議格式將數(shù)據(jù)從數(shù)據(jù)報(bào)中取出。按照通信協(xié)議將需要發(fā)送的數(shù)據(jù)打包,并調(diào)用SendTo(lpBuf,SendStrLen,RemotePort,RemoteIP,0)發(fā)送數(shù)據(jù)報(bào)。
該套數(shù)據(jù)采集軟件的設(shè)計(jì)與實(shí)現(xiàn),實(shí)際上為企業(yè)構(gòu)建了一個(gè)實(shí)時(shí)數(shù)據(jù)庫系統(tǒng)。程序中采用全局內(nèi)存共享技術(shù)對(duì)實(shí)時(shí)數(shù)據(jù)進(jìn)行存取,并采用內(nèi)存、文件管理、關(guān)系數(shù)據(jù)庫相結(jié)合的數(shù)據(jù)存儲(chǔ)策略,使系統(tǒng)在響應(yīng)速度、實(shí)時(shí)數(shù)據(jù)的共享性和時(shí)間一致性方面初步滿足了實(shí)時(shí)數(shù)據(jù)庫系統(tǒng)的定義要求[10]。
系統(tǒng)自投用以來運(yùn)行正常,效果良好,不僅解決了在生產(chǎn)數(shù)據(jù)管理過程中存在的問題,而且節(jié)省了購買SCADA硬件、軟件系統(tǒng)的大筆費(fèi)用。同時(shí),避免了大量仍能使用的儀表設(shè)備的淘汰棄置,具有一定的經(jīng)濟(jì)效益。
[1]蔣近,段斌.基于OPC技術(shù)的監(jiān)控主站實(shí)時(shí)數(shù)據(jù)傳輸[J].電力自動(dòng)化設(shè)備,2008,28(9):97-100.
[2]西門子(中國)有限公司自動(dòng)化與驅(qū)動(dòng)集團(tuán).深入淺出西門子S7-300 PLC[M].北京:北京航空航天大學(xué)出版社,2004.
[3]牛丹丹,孫學(xué)華.貯油罐存量管理系統(tǒng)的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2009,26(7):165-167.
[4]邊凌燕.基于CP341模塊的MODBUS協(xié)議免驅(qū)動(dòng)應(yīng)用[J].電氣傳動(dòng),2009,39(2):72-75.
[5]李世學(xué),王小進(jìn),余光洪.OPC技術(shù)及其在SCADA系統(tǒng)中的應(yīng)用[J].船電技術(shù),2010,30(3):27-29.
[6]徐思成,李增權(quán),郭國選.基于OPC技術(shù)和以太網(wǎng)的異構(gòu)網(wǎng)絡(luò)集成[J].儀表技術(shù)與傳感器,2011(1):109-110.
[7]陳群.石化企業(yè)CIMS基礎(chǔ)數(shù)據(jù)集成平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)[J].工業(yè)控制計(jì)算機(jī),2009,22(9):70-74.
[8]李一鳴,任勇毛,李俊.基于UDP的傳輸協(xié)議性能比較與分析[J].計(jì)算機(jī)應(yīng)用研究,2010,27(10):3906-3910.
[9]周麗娟.基于UDP協(xié)議的Socket網(wǎng)絡(luò)編程[J].電腦知識(shí)與技術(shù),2008,4(7):1867-1868.
[10]楊立保,許忠仁.組態(tài)軟件實(shí)時(shí)數(shù)據(jù)庫的研究與設(shè)計(jì)[J].自動(dòng)化儀表,2009,30(8):19-21.