肖 俊
(武漢大學(xué) 自動(dòng)化系,湖北 武漢 430072)
隨著工業(yè)控制過程的復(fù)雜性和集成性的提高,工業(yè)自動(dòng)化系統(tǒng)也變得更復(fù)雜,系統(tǒng)的集成度也越來越高。而傳統(tǒng)控制系統(tǒng)中不同設(shè)備之間的通信成為急需解決的問題。由于各廠商之間的通信協(xié)議不一致,不同廠商生產(chǎn)的設(shè)備之間通信往往需要專門的軟硬件設(shè)備或者根本就無法通信。OPC技術(shù)就是為了解決這個(gè)問題而產(chǎn)生的。
OPC(OLE for Process Control,過程控制對象連接與嵌入技術(shù))是OPC基金會組織推廣的工業(yè)控制和生產(chǎn)自動(dòng)化領(lǐng)域中的硬件和軟件之間的標(biāo)準(zhǔn)接口[1]。它是Windows平臺下的,工業(yè)應(yīng)用程序之間的一種高效通信技術(shù)規(guī)范。它以組件對象模型(COM/DCOM/COM+)為基礎(chǔ),采用客戶端/服務(wù)器模式。OPC定義了一套標(biāo)準(zhǔn)的COM接口,允許各種不同設(shè)備之間以相同的方式進(jìn)行通信。這極大地改善了傳統(tǒng)的控制系統(tǒng)中各設(shè)備之間通信以及硬件升級等帶來的各種問題。
OPC對于不同的工業(yè)用途有不同的規(guī)范。目前已經(jīng)推出的OPC規(guī)范有OPC數(shù)據(jù)存取規(guī)范、OPC報(bào)警與事件規(guī)范、OPC歷史數(shù)據(jù)存取規(guī)范、OPC安全性規(guī)范、OPC服務(wù)器數(shù)據(jù)交換規(guī)范等一系列規(guī)范,以及目前仍處于制定中的OPC Common IO(OPC公共輸入輸出接口)等規(guī)范。
OPC規(guī)范是基于COM技術(shù)的。其體系結(jié)構(gòu)是客戶端—服務(wù)器體系。其體系圖如圖1所示。
從圖1中可以看出OPC不僅提供了C/C++語言編寫用的定制接口,也提供了自動(dòng)化接口,方便VB、Java、Delphi等語言的編寫,極大提高了各種語言的支持。
圖1 OPC體系結(jié)構(gòu)
OPC對象有三種:OPC服務(wù)器對象、OPC組對象、OPC項(xiàng)對象[2]。OPC項(xiàng)對象是三種對象中最小的單位。一個(gè)項(xiàng)對象就是一個(gè)對應(yīng)的數(shù)據(jù)。而OPC組對象是管理項(xiàng)集合的對象,對組對象進(jìn)行添加、刪除項(xiàng)等相關(guān)操作。OPC服務(wù)器對象包含所有的組對象,對外暴露了一些簡單的接口。這些接口可以客戶端連接然后再對組對象進(jìn)行操作。OPC服務(wù)器可以和任何遵循OPC協(xié)議的客戶端進(jìn)行通信。
OPC數(shù)據(jù)存取規(guī)范著重于對現(xiàn)場設(shè)備的在線數(shù)據(jù)進(jìn)行存取。每個(gè)OPC客戶端可以連接到一個(gè)或多個(gè)不同廠商提供的OPC服務(wù)器。多個(gè)OPC服務(wù)器也可以和一個(gè)OPC客戶端進(jìn)行通信。
在OPC規(guī)范中,OPC服務(wù)器與OPC客戶端的數(shù)據(jù)存取有三種方式:同步、異步、訂閱[2][3]。此三種方式都可進(jìn)行客戶端讀取數(shù)據(jù)。而客戶端向服務(wù)器寫數(shù)據(jù)只有兩種方式:同步寫和異步寫。
同步數(shù)據(jù)存取是指,客戶端首先向OPC服務(wù)器提出請求,OPC服務(wù)器將客戶端要求的數(shù)據(jù)作為方法的參數(shù)返回給OPC客戶端,OPC客戶端在數(shù)據(jù)被返回前必須處于等待狀態(tài)。這種方式比較簡單,適用于數(shù)據(jù)量少的情況。若數(shù)據(jù)量增多,效率會大幅下降。如圖2所示為同步式數(shù)據(jù)訪問。
圖2 同步式數(shù)據(jù)訪問
異步訪問方式則不需要等待,客戶端向服務(wù)器提出請求后,OPC服務(wù)器幾乎立即將方法返回,客戶端隨后進(jìn)行其他處理。當(dāng)OPC服務(wù)器完成數(shù)據(jù)存取時(shí),在客戶端產(chǎn)生一個(gè)回調(diào),在回調(diào)信息中指明數(shù)據(jù)。異步式數(shù)據(jù)存取比同步數(shù)據(jù)存取效率高。最大程度節(jié)省了CPU和網(wǎng)絡(luò)資源。如圖3所示為異步式數(shù)據(jù)存取。
圖3 異步式數(shù)據(jù)存取
訂閱式數(shù)據(jù)采集與以上兩種方式不同。如圖4所示為訂閱式數(shù)據(jù)采集。這種方式下,OPC客戶端并不需要向服務(wù)器提出請求。而是服務(wù)器周期性地掃描緩沖區(qū)的數(shù)據(jù)。如果數(shù)據(jù)發(fā)生變化或者變化超過一定范圍,就通知客戶端并發(fā)送數(shù)據(jù)。訂閱式數(shù)據(jù)采集實(shí)質(zhì)上是異步數(shù)據(jù)存取方式的一種。相比于同步數(shù)據(jù)存取和異步數(shù)據(jù)存取,訂閱式數(shù)據(jù)采集方式可以有效降低客戶端訪問服務(wù)器的次數(shù),并且最大程度避免數(shù)據(jù)量大時(shí)網(wǎng)絡(luò)阻塞的情況。但是這種方式也有缺點(diǎn),即訂閱式數(shù)據(jù)采集只能獲得數(shù)據(jù)而不能向服務(wù)器寫數(shù)據(jù)。若要向服務(wù)器寫數(shù)據(jù)則必須采用同步數(shù)據(jù)存取或異步數(shù)據(jù)存取。不過,現(xiàn)在的工業(yè)控制系統(tǒng)中,需要監(jiān)測的數(shù)據(jù)遠(yuǎn)比需要調(diào)節(jié)的參數(shù)要多。因此訂閱式數(shù)據(jù)采集仍有良好的優(yōu)勢。
圖4 訂閱式數(shù)據(jù)采集
在OPC的集中數(shù)據(jù)存取方式中,單純的同步讀寫和異步讀寫都是非常容易做到的,在文獻(xiàn)中都做了明確的說明。而OPC訂閱式數(shù)據(jù)采集由于涉及到COM連接點(diǎn)的知識,這種方式的實(shí)現(xiàn)則較為復(fù)雜。OPC訂閱式數(shù)據(jù)采集在不同的OPC規(guī)范版本中有輕微改動(dòng)。OPC1.0規(guī)范中使用COM的通報(bào)連接機(jī)制,在OPC2.0規(guī)范中又增加了對連接點(diǎn)的支持[1][4]。采用訂閱式數(shù)據(jù)采集,需通過回調(diào)由服務(wù)器通知客戶端。這樣,客戶端程序設(shè)計(jì)接收器對象。OPC2.0規(guī)范支持從IadviseSink接口以及IOPCDataCallback接口派生的接收器。OPC2.0規(guī)范中增加的IOPCDataCallback比前一個(gè)版本功能更加強(qiáng)大且使用更方便。在這里只對從IOPCDataCallback接口派生的接收器進(jìn)行論述。
接收器的設(shè)計(jì)涉及到COM編程的相關(guān)知識,在這里可以參考文獻(xiàn)[5]。
接收器設(shè)計(jì)的關(guān)鍵代碼如下:
上述接口申明均可在OPC基金會規(guī)范中找到。OPCCallback 中要實(shí)現(xiàn) OnDataChange、On-ReadComplete、OnWriteComplete 以 及 OnCancel-Complete函數(shù)。
OPC客戶端利用訂閱方式讀取數(shù)據(jù)的步驟如下。由于訂閱方式讀寫數(shù)據(jù)實(shí)質(zhì)上是異步讀寫的一種特殊形式,所以在下面的步驟中加入了異步讀寫的過程。在文獻(xiàn)[2][4]中已經(jīng)詳細(xì)說明了如何創(chuàng)建OPC服務(wù)器對象并添加組等一系列基本操作。這里不再贅述,假設(shè)客戶端已經(jīng)得到了指向OPC服務(wù)器組對象Iunknown接口的指針。
(1)通過調(diào)用QueryInterface獲取Iconnection-PointerContainer接口指針。
(2)調(diào)用 IconnectionPointerContainer接口的FindConnectionPoint函數(shù)獲取IconnectionPoint接口指針。
(3)調(diào)用IconnectionPoint接口的Advise方法將接收器連接到OPC服務(wù)器組對象,并將客戶端的IOPCCallback接口指針傳遞給服務(wù)器。調(diào)用組對象的IOPCGroupStateMgt接口的SetSate方法設(shè)置刷新速率。
(4)調(diào)用IOPCAsyncIO2接口的Read函數(shù)進(jìn)行異步讀數(shù)據(jù)。
(5)OPC服務(wù)器按照設(shè)定好的刷新速率從數(shù)據(jù)源讀取數(shù)據(jù)。若數(shù)據(jù)發(fā)生變化,則利用On-DataChange函數(shù)將數(shù)據(jù)發(fā)送給客戶端。
(6)客戶端調(diào)用IOPCAsyncIO2接口的Write函數(shù)進(jìn)行異步寫數(shù)據(jù)。
(7)異步讀寫及訂閱式讀取急速,調(diào)用Unadvised斷開連接。然后逐一釋放各接口。
OPC在工業(yè)自動(dòng)控制領(lǐng)域已經(jīng)得到了廣泛的應(yīng)用。在PLC、工業(yè)網(wǎng)絡(luò)、SCADA等系統(tǒng)中隨處可見。它利用了成熟的計(jì)算機(jī)技術(shù)解決了控制系統(tǒng)中“信息孤島”的問題,讓各個(gè)廠家的設(shè)備之間可以進(jìn)行穩(wěn)定快速開放的數(shù)據(jù)交換。對于OPC技術(shù)的使用,應(yīng)根據(jù)控制系統(tǒng)的詳細(xì)要求選用OPC技術(shù)具體實(shí)現(xiàn)的方式,以達(dá)到最好的資源利用和控制效果。
[1]OPC FOUNDATION.Data Access Custom Interface Specification Version 2.05[M].2001.
[2]鄭 立.OPC應(yīng)用程序入門[M].2002
[3]喬加新.OPC客戶端與OPC服務(wù)器的交互方式的研究[J].信息技術(shù),2005,(8).
[4]蔡祥云等.OPC規(guī)范及其開發(fā)應(yīng)用[J].昆明理工大學(xué)學(xué)報(bào),2001,27(3).
[5]潘愛民.COM原理與應(yīng)用[M].北京:清華大學(xué)出版社,1999.