龔 勛,王淑營
(西南交通大學(xué) 信息科學(xué)與技術(shù)學(xué)院,成都 611756)
傳統(tǒng)工業(yè)數(shù)據(jù)采集系統(tǒng),由于生產(chǎn)設(shè)備種類較多、規(guī)格不一,缺乏統(tǒng)一的工業(yè)標(biāo)準(zhǔn),不同設(shè)備廠商提供的硬件設(shè)備在設(shè)備驅(qū)動程序的開發(fā)、設(shè)備升級更新之后的維護工作、以及各應(yīng)用程序之間通信方面存在困難[1,2].OPC (Object Linking and Embedding for Process Control,過程控制的對象鏈接與嵌入技術(shù))技術(shù)的誕生解決了這些問題,極大提高了數(shù)據(jù)采集系統(tǒng)的開放性和互通性.OPC 技術(shù)是基于微軟的COM/DCOM 技術(shù)(Component Object Model,組件對象模型)發(fā)展而來,所有符合OPC 標(biāo)準(zhǔn)的數(shù)據(jù)采集客戶端程序都可以讀取OPC 服務(wù)器采集的生產(chǎn)過程數(shù)據(jù),大大提高了控制系統(tǒng)、現(xiàn)場生產(chǎn)設(shè)備和企業(yè)上層應(yīng)用軟件之間的互操作性,為數(shù)據(jù)采集系統(tǒng)的發(fā)展奠定了基礎(chǔ)[3].
近年來,較多學(xué)者在OPC 數(shù)據(jù)采集客戶端的設(shè)計與實現(xiàn)上進行了相關(guān)研究,但是這些實現(xiàn)的客戶端難以適應(yīng)復(fù)雜多變的采集環(huán)境.文獻[4]介紹了OPC 客戶端與服務(wù)器之間的接口、數(shù)據(jù)讀取方式等,對實現(xiàn)OPC 客戶端有一定參考價值,但并未進行具體實現(xiàn).文獻[5]基于VB 語言、自動化接口實現(xiàn)OPC 客戶端,通過使用OPCDAAuto.dll 自動化包裝庫,把定制接口轉(zhuǎn)換成自動化接口.但由于其在大數(shù)據(jù)量數(shù)據(jù)采集時,傳輸實時性較低,以及多客戶端連接時,OPC 服務(wù)器壓力較大等方面的限制.文獻[6]討論了在讀取OPC 服務(wù)器數(shù)據(jù)后,OPC 客戶端和數(shù)據(jù)庫通信問題,實現(xiàn)利用數(shù)據(jù)庫存儲采集數(shù)據(jù).但是隨著數(shù)據(jù)采集量越來越多,這種方式不支持海量數(shù)據(jù)存儲,并且會失去數(shù)據(jù)庫已有檢索算法的優(yōu)勢,精確查詢的性能會降低.
相比于傳統(tǒng)的OPC 客戶端開發(fā)周期長,難度大,適應(yīng)性差.本文通過分析OPC 客戶端和服務(wù)器之間的通信接口、數(shù)據(jù)讀取方式、數(shù)據(jù)存儲方式,基于C#設(shè)計實現(xiàn)了采用自動化通信接口,訂閱式數(shù)據(jù)讀取方式的OPC 客戶端,在簡化開發(fā)工作量的同時支持采集數(shù)據(jù)直接存儲到實時數(shù)據(jù)庫,方便精確查詢使用,還支持以文本文件形式存儲,以備后續(xù)進行問題追溯時查詢,在性能方面,OPC 服務(wù)器能同時支持多個OPC 客戶端連接訪問,對服務(wù)器的性能消耗較低.所以,本文設(shè)計的客戶端在功能支持、發(fā)開工作量、數(shù)據(jù)傳輸實時性、對服務(wù)器性能消耗方面都有較大改進.
在OPC 標(biāo)準(zhǔn)下,客戶端與服務(wù)器之間有兩種通信接口:定制接口和自動化接口[7],其中定制接口主要使用C/C++等過程性編程語言開發(fā),使用定制接口和服務(wù)器通信的方式比較復(fù)雜;另一種是自動化接口,主要使用Visual Basic,C#等語言開發(fā),相比于定制接口,由于自動化接口集成了組建對象模型特征,可以使用自動化包裝庫,所以開發(fā)相對簡單.并且,使用C#語言實現(xiàn)OPC 客戶端,不僅可以實現(xiàn)數(shù)據(jù)采集功能,還可以實現(xiàn)其他功能.其結(jié)構(gòu)如圖1所示.
采用定制接口方式與服務(wù)器通信需要開發(fā)人員熟練掌握相應(yīng)的COM 和DCOM 知識的綜合應(yīng)用,并且清楚的了解客戶端和服務(wù)器的整個通信過程,并且開發(fā)周期比較長.而采用自動化接口方式則更為方便,因為可以使用自動化包裝庫實現(xiàn)自動化接口轉(zhuǎn)化為定制接口.通過這種方式訪問服務(wù)器,降低了對開發(fā)人員的要求,縮短了開發(fā)周期.所以本文采用了自動化接口對方式.
圖1 客戶端與服務(wù)器通信接口
根據(jù)OPC 標(biāo)準(zhǔn),OPC 服務(wù)器包括6 類對象,分別是:服務(wù)器對象(OPC Server)、OPC 瀏覽器對象(OPC Browser)、OPC 組集合對象(OPC Groups)、OPC 組對象(OPC Group)、OPC 項集合對象(OPC Items)、OPC 項對象(OPC Item).開發(fā)人員需要熟悉了解這6 個對象的屬性、事件和方法[8–10].
OPC 服務(wù)器對象:OPC 標(biāo)準(zhǔn)中定義對COM 對象,是OPC 服務(wù)器的實例,也是創(chuàng)建其他5 個對象的基礎(chǔ);
OPC 瀏覽器對象:包含在服務(wù)器中存在的分支或項目名稱的集合,屬于與可選部分,如果連接的服務(wù)器不支持這個對象,客戶端則不會創(chuàng)建;
OPC 組集合對象:OPC Groups 與OPC Group 之間存在一對多的關(guān)系,是OPC Group 對象的集合,主要用于創(chuàng)建、刪除和管理OPC 組對象;
OPC 組對象:主要用來管理客戶端需要采集的數(shù)據(jù)項;
OPC 項集合對象:與OPC 項之間存在一對多的關(guān)系,是OPC 組的屬性之一,當(dāng)新添加一個數(shù)據(jù)采集項時被賦默認(rèn)的屬性,比如默認(rèn)狀態(tài)(defaultIsActive)、默認(rèn)數(shù)據(jù)更新周期(defaultRequestedDataType);
OPC 項對象:是客戶端與服務(wù)器之間的數(shù)據(jù)訪問連接.每個項由采集ID,變量值和時間戳構(gòu)成.
OPC 數(shù)據(jù)讀取規(guī)范定義了OPC 客戶端對現(xiàn)場生產(chǎn)設(shè)備產(chǎn)生數(shù)據(jù)對讀取方式.每個OPC 客戶端可以連接到多個不同的服務(wù)器,只要服務(wù)器滿足OPC 規(guī)范;多個OPC 服務(wù)器也可以和一個客戶端進行通信,只要客戶端符合OPC 標(biāo)準(zhǔn).在OPC 標(biāo)準(zhǔn)中,OPC 客戶端訪問服務(wù)器的方式有3 種:分別是同步數(shù)據(jù)訪問、異步數(shù)據(jù)訪問和訂閱式方式,其中訂閱式方式是特殊的異步方式[11].
同步數(shù)據(jù)訪問方式可用于客戶端訪問服務(wù)器數(shù)據(jù),也可以用于客戶端向服務(wù)器寫入數(shù)據(jù),當(dāng)客戶端讀取OPC 項對應(yīng)的實時數(shù)據(jù)時,客戶端程序一直處于等待狀態(tài),直到數(shù)據(jù)讀取完畢才能繼續(xù)下一階段的工作,當(dāng)寫入數(shù)據(jù)時也是如此.所以采用這種數(shù)據(jù)訪問方式會阻塞客戶端線程,適合短時間請求數(shù)據(jù)并且和服務(wù)器的數(shù)據(jù)交互量少的情況.當(dāng)出現(xiàn)大量數(shù)據(jù)交互或者客戶訪問,容易造成網(wǎng)路擁塞,性能下降[12,13].
同樣異步數(shù)據(jù)訪問方式可用于客戶端訪問服務(wù)器數(shù)據(jù),也可以用于客戶端向服務(wù)器寫入數(shù)據(jù),當(dāng)客戶端向服務(wù)器發(fā)送讀取或?qū)懭霐?shù)據(jù)請求后,不用等待消息的返回,隨后就可以進行其他事務(wù)的處理,當(dāng)服務(wù)器完成請求處理之后,服務(wù)器轉(zhuǎn)為客戶端,主動向原來的客戶端發(fā)送異步數(shù)據(jù)訪問完成事件,并將數(shù)據(jù)訪問結(jié)果返回給客戶端,客戶端接收處理完成事件.在這種方式下,數(shù)據(jù)訪問效率更高,能避免多客戶端大數(shù)據(jù)量請求造成的阻塞,并且可以節(jié)約CPU 和網(wǎng)絡(luò)資源.但是該方式需要客戶端程序增加事務(wù)管理功能,接收處理訪問完成事件,增加了編程難度,也額外增加了開發(fā)人員工作量.
訂閱式數(shù)據(jù)訪問方式是一種特殊的異步數(shù)據(jù)訪問方式,但不同于的是訂閱式方式只能用于客戶端讀取服務(wù)器端的數(shù)據(jù),不能向服務(wù)器寫入指令.但是在實際工業(yè)數(shù)據(jù)采集系統(tǒng)中,大部分情況是采集客戶端數(shù)據(jù).關(guān)鍵在于,進行數(shù)據(jù)交互時并不需要客戶端程序?qū)崟r向服務(wù)器發(fā)送請求,而是服務(wù)器自動周期性的掃描數(shù)據(jù)緩沖區(qū),若緩沖區(qū)中的數(shù)據(jù)值發(fā)生變化或者變化超過一定幅度,則更新數(shù)據(jù)緩沖區(qū),并向客戶端發(fā)送數(shù)據(jù)變化事件,客戶端實時處理接收的數(shù)據(jù)變化事件,所以采用訂閱式方式,需要服務(wù)器通知客戶端數(shù)據(jù)更新,客戶端需要增加接收器對象,接收器涉及到組建對象模型編程的相關(guān)知識,具體可查閱相關(guān)文獻,這里不在贅述.采用訂閱式數(shù)據(jù)訪問方式如圖2所示.
其中數(shù)據(jù)更新的變化范圍被稱為敏感帶(DeadBand),由于敏感帶的存在,可以無視模擬量的微小變化,減少了客戶端和服務(wù)器的負(fù)荷.相比于同步和異步數(shù)據(jù)訪問方式,訂閱式數(shù)據(jù)方式有效的降低了客戶端訪問服務(wù)器的次數(shù),減少了服務(wù)器的工作量,并且避免了因傳輸數(shù)據(jù)量大而造成的網(wǎng)絡(luò)阻塞情況,所以這種方式在大數(shù)據(jù)量訪問優(yōu)勢更為明顯.針對當(dāng)前制造業(yè)生產(chǎn)過程數(shù)據(jù)采集特點:采集數(shù)據(jù)量大、采樣頻率高并且傳輸實時性高,所以本文設(shè)計的OPC 客戶端選用訂閱式方式無疑是最佳的選擇.
圖2 訂閱式方式
OPC 客戶端總體設(shè)計如圖3所示,主要分為3 個部分:分別是建立連接、讀取數(shù)據(jù)和斷開連接;其中建立連接部分需要完成OPC 服務(wù)器與OPC 客戶端之間的身份確認(rèn),連接信息的保存等功能,具體包括枚舉本地OPC 服務(wù)器、初始化服務(wù)器對象、預(yù)覽初始化接口、枚舉地址空間等;讀取數(shù)據(jù)部分需要客戶端按照定義的分組信息完成從服務(wù)器讀取指定數(shù)據(jù)項,并完成數(shù)據(jù)轉(zhuǎn)儲功能,具體包括添加服務(wù)器對象、添加組對象、添加項對象、轉(zhuǎn)儲數(shù)據(jù)等;斷開連接部分需要客戶端終止與服務(wù)器的連接,釋放資源,同時服務(wù)器也需要確認(rèn)客戶端連接釋放.以上3 個功能模塊保證OPC 客戶端能順利訪問OPC 服務(wù)器所有數(shù)據(jù)項的時間戳、采集點唯一ID 和采集值[14,15].
其中關(guān)鍵部分包括創(chuàng)建OPC 服務(wù)器對象、OPC組對象和OPC 項對象,并管理這些對象的工作周期.一個OPC 服務(wù)器對象可以包含多個OPC 組對象,并且可以創(chuàng)建和刪除組對象;一個OPC 組對象可以包含多個OPC 項對象,OPC 組對象主要包含自身基本信息和其中所有的OPC 項對象信息;而OPC 項對象是最基本的單位,主要包含OPC 客戶端和服務(wù)器的連接信息和采集數(shù)據(jù)項信息等.其中OPC 服務(wù)器對象,OPC組對象和OPC 項對象以及每個對象需要用到的函數(shù)關(guān)系如圖4所示.
圖3 OPC 客戶端總體設(shè)計
圖4 OPC 各對象之間關(guān)系
圖4中提供的OPC 對象是所有對象的父類,只具有最基本的CompareTo()比較函數(shù),其他的子對象可以根據(jù)自身需要進行擴展;同時,提供了專門用于管理OPC 對象的OPCManager 管理單元,包含create()、add()和remove()等3 個函數(shù)分別用于新建、添加和刪除OPC 對象.OPC 服務(wù)器對象負(fù)責(zé)新增和刪除一個或者多個組對象,其中包含的getOPCBrowseTree()函數(shù)用于瀏覽地址空間并建立樹型關(guān)系.OPC 組對象主要是負(fù)責(zé)新建、添加、編輯和刪除OPC 項對象,項對象是與現(xiàn)場生產(chǎn)設(shè)備對應(yīng)的最基本的數(shù)據(jù)對象;OPC項對象調(diào)用getItemProperty()函數(shù)可以獲取采集數(shù)據(jù)項的唯一標(biāo)識ID、采集值和時間戳.
OPC 客戶端完成服務(wù)器數(shù)據(jù)讀取的過程包括預(yù)覽和初始化OPC 服務(wù)器、預(yù)覽地址空間以及添加和刪除組對象和項對象、數(shù)據(jù)讀取、數(shù)據(jù)轉(zhuǎn)儲.
預(yù)覽OPC 服務(wù)器名稱主要是通過枚舉本地所有的服務(wù)器信息并初始化需要連接的服務(wù)器對象來獲取服務(wù)器名稱和唯一標(biāo)識符,做好連接OPC 服務(wù)器的準(zhǔn)備工作;在初始化服務(wù)器對象的過程中需要調(diào)用OPC規(guī)范中管理各對象的函數(shù).比如OPCServerListClass()函數(shù)得到服務(wù)器的唯一標(biāo)識符,即可獲得初始化服務(wù)器,調(diào)用OPCServer.addGroup()方法創(chuàng)建OPC 組對象,然后接著獲取GroupName、updateRate 和ID 等參數(shù)信息,其中updateRate 表示采集數(shù)據(jù)等更新頻率,ID 就是標(biāo)識采集點的唯一標(biāo)識符.
建立OPC 服務(wù)器連接的過程就是初始化COM 對象的過程,需要根據(jù)之前獲得的唯一服務(wù)器標(biāo)識符來獲取COM 對象句柄地址并初始化OPCServer 接口函數(shù),然后進行服務(wù)器的連接.此階段OPC 服務(wù)器分為遠(yuǎn)程服務(wù)器和本地服務(wù)器,如果連接的是本地服務(wù)器則較為簡單,若連接的是遠(yuǎn)程服務(wù)器需要設(shè)置訪問類型為遠(yuǎn)程訪問,然后繼續(xù)調(diào)用COM 對象初始化函數(shù)進行服務(wù)器的遠(yuǎn)程連接.
預(yù)覽地址空間包括預(yù)覽通信接口并初始化和填充TreeView 控件等功能,為后續(xù)添加OPC 項對象做準(zhǔn)備,若數(shù)據(jù)采集的量比較大,需要手動輸入采集項名稱和路徑則效率較低,所以采用預(yù)覽地址空間的方法避免手動添加,直接調(diào)用OPCBrowseAddressSpace()函數(shù)作為預(yù)覽地址空間的函數(shù)接口,然后接著使用ChangeBrowsePosition()函數(shù)做為改變位置的函數(shù)接口,使用BrowseOPCItemIDS()函數(shù)獲取采集數(shù)據(jù)項相關(guān)參數(shù),方便用戶添加或者刪除需要的服務(wù)器對象、組對象和項對象.其讀取服務(wù)器數(shù)據(jù)的時序圖如圖5.
圖5 數(shù)據(jù)讀取時序圖
首先是創(chuàng)建一個OPC 組對象并驗證組對象的有效性,如果無效則會拋出相應(yīng)的異常并重新添加組對象,有效則繼續(xù)執(zhí)行,瀏覽服務(wù)器的地址空間,并調(diào)用函數(shù)addItem()添加項對象,每個項對象就是需要讀取的數(shù)據(jù)項基本單位,調(diào)用項對象的getQuality()、realItemValue()和dateTime()函數(shù)開始讀取數(shù)據(jù).
本文設(shè)計的數(shù)據(jù)轉(zhuǎn)儲模塊可以將讀取的數(shù)據(jù)轉(zhuǎn)儲到MySQL 數(shù)據(jù)庫,也可以轉(zhuǎn)儲為文本文件,連接MySQL 數(shù)據(jù)庫時需要使用到MySQL.Data.dll,這是專門用來管理連接和斷開數(shù)據(jù)庫連接的庫.轉(zhuǎn)儲數(shù)據(jù)到MySQL 數(shù)據(jù)庫時提供了數(shù)據(jù)庫連接模式和斷開模式,在連接模型下數(shù)據(jù)庫和客戶端一直保持連接狀態(tài),在斷開模式下客戶端和數(shù)據(jù)庫只在有數(shù)據(jù)更新的情況下才進行連接操作.結(jié)合現(xiàn)代制造業(yè)數(shù)據(jù)采集特點,采用斷開模式優(yōu)勢較為明顯,其中將數(shù)據(jù)轉(zhuǎn)儲到MySQL 數(shù)據(jù)庫時需要以下幾步:
(1)使用Connection 連接對象連接客戶端和數(shù)據(jù)庫,Connection 對象包含Open()和Close()方法,用于打開和關(guān)閉數(shù)據(jù)庫連接,只包含一個屬性ConnectionStrng屬性,這個屬性又包含了服務(wù)器名DataSourse、數(shù)據(jù)庫名InitialCatalog、用戶名UserName 和密碼PassWord 等;
(2)使用Command 對象對已經(jīng)建立連接的數(shù)據(jù)庫發(fā)出請求操作數(shù)據(jù)命令;
(3)將從服務(wù)器讀取來的數(shù)據(jù)放到數(shù)據(jù)適配器DataAdapter 對象中,然后把數(shù)據(jù)轉(zhuǎn)儲到DataSet 對象中;
(4)然后在本地的DataSet 對象中管理數(shù)據(jù),接著利用DataAdapter 對象進行數(shù)據(jù)庫寫入操作更新數(shù)據(jù),最后關(guān)閉Connection 連接.
在斷開模式下,不需要客戶端和數(shù)據(jù)庫服務(wù)器一直保持連接狀態(tài),這樣大大降低了服務(wù)器承受的壓力,減少了資源的浪費,支持多個客戶端同時發(fā)起連接請求的情況.
OPC 客戶端首頁如圖6所示,在首頁可以配置連接服務(wù)器的相關(guān)信息,服務(wù)器IP 地址和服務(wù)器名.為了使用的方便,該部分設(shè)計為只需一次配置的形式,首次配置的信息保存為XML 配置文件,如果服務(wù)器不更改則不用重新配置;同時提供定義分組、查看分組信息和分組管理功能的入口,以及顯示當(dāng)前正在采集的信息,包括采集組數(shù)量、采集項數(shù)量和開始采集時間等.
點擊查看分組信息,可以查看當(dāng)前客戶端已配置的所有分組列表,每個分組下的所有采集數(shù)據(jù)項列表,以及每個數(shù)據(jù)項當(dāng)前的采集時間點,采集值,具體如圖7所示.
圖6 客戶端首頁
圖7 查看分組信息
點擊定義分組,可以新建分組,定義分組名,配置該分組需要采集的所有數(shù)據(jù)項列表,以及該分組的數(shù)據(jù)項更新頻率等,具體如圖8所示.
圖8 定義分組
本文通過分析現(xiàn)代制造業(yè)的發(fā)展趨勢,以及當(dāng)前數(shù)據(jù)采集技術(shù)的弊端,設(shè)計開發(fā)了適合當(dāng)前工業(yè)控制系統(tǒng)需求的OPC 數(shù)據(jù)采集客戶端.其中詳細(xì)介紹了OPC 客戶端的通信接口、數(shù)據(jù)讀取方式和具體的實現(xiàn)步驟,并在實際生產(chǎn)環(huán)境投入使用,真正解決了當(dāng)前制造業(yè)在數(shù)據(jù)采集方面遇到的難點;驗證了客戶端與服務(wù)器數(shù)據(jù)讀取的穩(wěn)定性和實時性;對OPC 技術(shù)在數(shù)據(jù)采集方面的應(yīng)用進行了更深入的拓展.最后,希望本文可以為將來數(shù)據(jù)采集技術(shù)的深入研究起到拋磚引玉的作用.