肖 俊
(武漢大學 自動化系,湖北 武漢 430072)
隨著工業控制過程的復雜性和集成性的提高,工業自動化系統也變得更復雜,系統的集成度也越來越高。而傳統控制系統中不同設備之間的通信成為急需解決的問題。由于各廠商之間的通信協議不一致,不同廠商生產的設備之間通信往往需要專門的軟硬件設備或者根本就無法通信。OPC技術就是為了解決這個問題而產生的。
OPC(OLE for Process Control,過程控制對象連接與嵌入技術)是OPC基金會組織推廣的工業控制和生產自動化領域中的硬件和軟件之間的標準接口[1]。它是Windows平臺下的,工業應用程序之間的一種高效通信技術規范。它以組件對象模型(COM/DCOM/COM+)為基礎,采用客戶端/服務器模式。OPC定義了一套標準的COM接口,允許各種不同設備之間以相同的方式進行通信。這極大地改善了傳統的控制系統中各設備之間通信以及硬件升級等帶來的各種問題。
OPC對于不同的工業用途有不同的規范。目前已經推出的OPC規范有OPC數據存取規范、OPC報警與事件規范、OPC歷史數據存取規范、OPC安全性規范、OPC服務器數據交換規范等一系列規范,以及目前仍處于制定中的OPC Common IO(OPC公共輸入輸出接口)等規范。
OPC規范是基于COM技術的。其體系結構是客戶端—服務器體系。其體系圖如圖1所示。
從圖1中可以看出OPC不僅提供了C/C++語言編寫用的定制接口,也提供了自動化接口,方便VB、Java、Delphi等語言的編寫,極大提高了各種語言的支持。

圖1 OPC體系結構
OPC對象有三種:OPC服務器對象、OPC組對象、OPC項對象[2]。OPC項對象是三種對象中最小的單位。一個項對象就是一個對應的數據。而OPC組對象是管理項集合的對象,對組對象進行添加、刪除項等相關操作。OPC服務器對象包含所有的組對象,對外暴露了一些簡單的接口。這些接口可以客戶端連接然后再對組對象進行操作。OPC服務器可以和任何遵循OPC協議的客戶端進行通信。
OPC數據存取規范著重于對現場設備的在線數據進行存取。每個OPC客戶端可以連接到一個或多個不同廠商提供的OPC服務器。多個OPC服務器也可以和一個OPC客戶端進行通信。
在OPC規范中,OPC服務器與OPC客戶端的數據存取有三種方式:同步、異步、訂閱[2][3]。此三種方式都可進行客戶端讀取數據。而客戶端向服務器寫數據只有兩種方式:同步寫和異步寫。
同步數據存取是指,客戶端首先向OPC服務器提出請求,OPC服務器將客戶端要求的數據作為方法的參數返回給OPC客戶端,OPC客戶端在數據被返回前必須處于等待狀態。這種方式比較簡單,適用于數據量少的情況。若數據量增多,效率會大幅下降。如圖2所示為同步式數據訪問。

圖2 同步式數據訪問
異步訪問方式則不需要等待,客戶端向服務器提出請求后,OPC服務器幾乎立即將方法返回,客戶端隨后進行其他處理。當OPC服務器完成數據存取時,在客戶端產生一個回調,在回調信息中指明數據。異步式數據存取比同步數據存取效率高。最大程度節省了CPU和網絡資源。如圖3所示為異步式數據存取。

圖3 異步式數據存取
訂閱式數據采集與以上兩種方式不同。如圖4所示為訂閱式數據采集。這種方式下,OPC客戶端并不需要向服務器提出請求。而是服務器周期性地掃描緩沖區的數據。如果數據發生變化或者變化超過一定范圍,就通知客戶端并發送數據。訂閱式數據采集實質上是異步數據存取方式的一種。相比于同步數據存取和異步數據存取,訂閱式數據采集方式可以有效降低客戶端訪問服務器的次數,并且最大程度避免數據量大時網絡阻塞的情況。但是這種方式也有缺點,即訂閱式數據采集只能獲得數據而不能向服務器寫數據。若要向服務器寫數據則必須采用同步數據存取或異步數據存取。不過,現在的工業控制系統中,需要監測的數據遠比需要調節的參數要多。因此訂閱式數據采集仍有良好的優勢。

圖4 訂閱式數據采集
在OPC的集中數據存取方式中,單純的同步讀寫和異步讀寫都是非常容易做到的,在文獻中都做了明確的說明。而OPC訂閱式數據采集由于涉及到COM連接點的知識,這種方式的實現則較為復雜。OPC訂閱式數據采集在不同的OPC規范版本中有輕微改動。OPC1.0規范中使用COM的通報連接機制,在OPC2.0規范中又增加了對連接點的支持[1][4]。采用訂閱式數據采集,需通過回調由服務器通知客戶端。這樣,客戶端程序設計接收器對象。OPC2.0規范支持從IadviseSink接口以及IOPCDataCallback接口派生的接收器。OPC2.0規范中增加的IOPCDataCallback比前一個版本功能更加強大且使用更方便。在這里只對從IOPCDataCallback接口派生的接收器進行論述。
接收器的設計涉及到COM編程的相關知識,在這里可以參考文獻[5]。
接收器設計的關鍵代碼如下:

上述接口申明均可在OPC基金會規范中找到。OPCCallback 中要實現 OnDataChange、On-ReadComplete、OnWriteComplete 以 及 OnCancel-Complete函數。
OPC客戶端利用訂閱方式讀取數據的步驟如下。由于訂閱方式讀寫數據實質上是異步讀寫的一種特殊形式,所以在下面的步驟中加入了異步讀寫的過程。在文獻[2][4]中已經詳細說明了如何創建OPC服務器對象并添加組等一系列基本操作。這里不再贅述,假設客戶端已經得到了指向OPC服務器組對象Iunknown接口的指針。
(1)通過調用QueryInterface獲取Iconnection-PointerContainer接口指針。
(2)調用 IconnectionPointerContainer接口的FindConnectionPoint函數獲取IconnectionPoint接口指針。
(3)調用IconnectionPoint接口的Advise方法將接收器連接到OPC服務器組對象,并將客戶端的IOPCCallback接口指針傳遞給服務器。調用組對象的IOPCGroupStateMgt接口的SetSate方法設置刷新速率。
(4)調用IOPCAsyncIO2接口的Read函數進行異步讀數據。
(5)OPC服務器按照設定好的刷新速率從數據源讀取數據。若數據發生變化,則利用On-DataChange函數將數據發送給客戶端。
(6)客戶端調用IOPCAsyncIO2接口的Write函數進行異步寫數據。
(7)異步讀寫及訂閱式讀取急速,調用Unadvised斷開連接。然后逐一釋放各接口。
OPC在工業自動控制領域已經得到了廣泛的應用。在PLC、工業網絡、SCADA等系統中隨處可見。它利用了成熟的計算機技術解決了控制系統中“信息孤島”的問題,讓各個廠家的設備之間可以進行穩定快速開放的數據交換。對于OPC技術的使用,應根據控制系統的詳細要求選用OPC技術具體實現的方式,以達到最好的資源利用和控制效果。
[1]OPC FOUNDATION.Data Access Custom Interface Specification Version 2.05[M].2001.
[2]鄭 立.OPC應用程序入門[M].2002
[3]喬加新.OPC客戶端與OPC服務器的交互方式的研究[J].信息技術,2005,(8).
[4]蔡祥云等.OPC規范及其開發應用[J].昆明理工大學學報,2001,27(3).
[5]潘愛民.COM原理與應用[M].北京:清華大學出版社,1999.