0 引言
OPC 全稱OLE for Process CONtrol,它是由OPC 基金會制定的自動化領域過程控制標準。
實際上,OPC 代表一系列的標準,包括OPC 數據訪問(OPC Data AccESS),OPC 報警與事件(Alarms & Events ),歷史數據訪問(OPC Historical Data Access),OPC XML-DA(1.0)等。目前,OPC 標準在現代工業控制領域,特別是在數據采集和軟實時控制方面已有很好的應用。
1 OPC 標準介紹
在 OPC 標準制定之前,工業軟件制造商需要為不同的硬件開發各自獨立的驅動接口。對于開發典型監控程序軟件的技術人員來說,約有20%-30%的時間是用于編寫通訊驅動程序。當供應商提供一個新的硬件時,應用軟件研發人員就不得不重新編寫一個新的程序。歡迎轉載,本文來自電子發燒友網(http://www.nxhydt.com/)
而OPC 標準的出現為此解決該問題提供了一個方案,它制定了一系列的數據存取,事件,報警等規范,使得當有新的硬件出現時,供應商只需提供實現的OPC 標準接口,而上層應用軟件則不需重新改寫。這樣,在系統與設備之間,車間現場與信息管理之間,甚至更遠的距離上,都可以通過OPC 標準實現無縫通訊,而不必擔心設備升級帶來的不便和額外費用。
OPC 為不同的應用制定了不同的標準,OPC DA 是針對現場數據進行存取的接口規范,該標準基于OLE / COM / DCOM / COM+技術,采用Client / Server 模式。數據通過特定的采集卡或串口等,從現場設備中獲得,然后OPC DA 服務器將這些從數據源采集到的數據,以OPC 標準接口形式提供給外部應用程序,例如工控軟件,實時數據庫等。OPC 服務器可以通過本地或遠程服務服務器兩種方式,為依照OPC 標準實現的客戶端提供服務。
2 OPC DA 服務器的設計
本文通過使用 VC++編程實現的一個OPC DA 服務器框架,來介紹OPC DA 服務器設計中需要解決的主要問題。在OPC 服務器的設計中,引入適配器模式,通過適配層將數據訪問同具體的數據源操作相分離,以便針對不同的數據來源時,進行快速的二次開發。實現 OPC DA 服務器,需要依照OPC 基金會提供的OPC DA 標準,將從數據源中采集數據,以標準規定的接口形式提供給外部。其中,OPC 規范為OPC 服務器規定了兩套接口方式:定制接口(Custom interface)和自動化接口(AutomATIon Interface)。其中,前者是OPC 服務器必須實現的接口,后者則是為方便VB 等腳本語言而提供,可以選擇性實現。
2.1 OPC DA 服務器中的對象
根據 OPC 標準,在OPC DA 服務器中,主要包含三個層次的對象:服務器對象(Server),組對象(Group)和數據項(Item)。其中,服務器對象與組對象是一對多的關系,一個Server 對象可以包含0 到多個Group 對象,而一個組對象中可以包含0 到多個數據項。OPC DA 標準對Server 和Group 對象需要實現的接口,進行了詳細的規定說明。
在 OPC DA 標準中,客戶端對服務器的數據存取是以Group 為單位的,每次將需要存取的數據項item 加入一個Group,然后對該Group 進行整體讀寫操作。Group 對象通過標準定義的IOPCDataMgt 接口,對Item 進行添加,刪除等相關的管理;而Server 對象則通過IOPCServer 接口對Group 對象進行添加,刪除等管理。
2.2 OPC DA 服務器的結構
開發一個 OPC DA 服務器需要注意以下問題:服務器的運行方式,各個接口與對象的相互關系,內部數據的組織形式,對外部數據源的訪問等。在本實例中,OPC 數據存取服務器的框架結構如下圖所示
圖 1 OPC 服務器的結構
接口與對象:在各層次對象與接口的關系處理中,可以采用兩種方法:多繼承的方式,將Server/Group 對象繼承自每個標準規定的接口;或者采用聚合的方式,Server/Group 對象包含接口對象。本例采用的是第二種方式,該方式可以將使接口的編寫相對獨立,以方便測試,并且有利于自動化接口的可選擇實現。
服務器使用 VC++編程,包含以下幾個主要的類:
COPCServer:Server 對象的類,管理IOPCCommon,IOPCServer,IConnectionContainer等接口;
COPCGroup:Group 對象的類,管理IOPCItemMgt,IOPCGroupStateMgt,IOPCSyncIO,IOPCAsyncIO,IConnectionContainer 等接口;
其他接口類:每個接口還對應一個實現類(如:CIOPCItemMgtImp 是IOPCItemMgt 的具體實現),該類完成OPC 標準規定的對應接口的功能函數,類的實例化對象將以聚合的方式接受Server 或Group 對象的管理;歡迎轉載,本文來自電子發燒友網(http://www.nxhydt.com/)
數據緩存區的構造:在 OPC 服務器中,Cache 是重要的部分,存儲結構將直接影響數據訪問的速度,它負責將從設備中讀取的數據先存放在數據緩存區,供同步或異步讀取。緩存區內存可以采用連續存儲,鏈式存儲和哈希存儲。其中,考慮到存取速度和方便管理,該服務器選擇采用連續存儲的方式。該方式可以隨機存取數據,但存取數據的數量不宜過大,如果需要存取較大數量的數據項,則推薦采用哈希存儲方式。對于每個數據項,都包含有三個基本屬性:數值(Value),時間戳(Time Stamp)和數據品質(Quality)。從數據源中訪問到的數據項將按照線性方式存儲到連續的內存區域中;每次對緩存區的訪問都需要進行加鎖,以防止出現同時進行讀操作和寫操作。
2.3 輪詢方式對數據源進行訪問:
由于服務器是單獨不斷從數據源讀取數據,因此可以采用單獨的線程,按時間輪詢的方式,每隔一段時間對數據源進行訪問,這個時間也就成為服務器支持的最短數據訪問時間。服務器的主要工作流程:
(1) 每隔一段時間進行輪詢操作;
(2) 如果掃描時間到,訪問數據源;否則,至(3);如果有訂閱請求,回調訂閱函數;
(3) 如果有刷新請求,回調刷新函數;如果有異步讀數據請求,讀取數據并回調異步讀函數;如果有異步寫請求,將數據寫入外部設備;
(4) 返回(1);
服務器中該循環的主要功能,主要用來進行異步數據存取,訂閱及刷新。而對于同步訪問等操作,由于需要服務器立即存取數據然后返回結果,因此其實現并不在該主循環中,而是針對其接口單獨編寫一個類,用來實現同步存取接口函數的功能。
2.4 OPC DA 的數據訪問方式
OPC DA 對數據的訪問主要分為以下幾種:同步讀,異步讀,訂閱和數據刷新;對數據源的操作又可以分為直接從設備讀取和從Cache 中讀取。這兩者的組合構成了對數據源的訪問規則,OPC 標準對訪問規則進行了詳細的描述。在這幾種數據訪問中,同步讀接口可以實現少量,快速的數據讀取,異步讀則是提交一個請求,然后返回,等服務器完成數據讀取后回調函數。與同步讀相比,異步讀更能提高OPC Client 的使用效率,防止OPC 服務器尚未訪問到數據時,造成客戶端的等待。訂閱異步讀大致相同,每當訪問數據源后自動將數據提交給客戶端。
圖 2 OPC 服務器中采用的可連接對象結構模型
在 OPC DA2.0 和OPC DA3.0 中的異步通訊機制中,使用到了連接點容器/連接點接口[1],取代了原來OPC DA1.0 中的直接注冊/回調的模式。能夠更靈活的支持多個連接點和連接。在可連接對象模式中,每個可連接對象可以包含多個連接點,每個連接點支持一種回調接口;每個連接點上可以連接多個客戶端;回調接口由客戶端實現,可連接對象通過回調函數于客戶端進行交互。
在 OPC DA 服務器中,可連接對象包括Server 對象和Group 對象兩種,Server 對象只支持一個IOPCShutdown 回調接口,而異步數據交換等重要的功能位于Group 對象中。在OPC 組對象中,包含一個連接點對象,該對象支持IOPCDataCallback 回調接口,連接點可以連接多個客戶端,當異步訪問完成時,服務器同過可連接對象通過調用標準規定的回調函數,通知每個已經注冊的客戶端。
2.5 基于適配器模式的數據采集
OPC DA 服務器的最重要功能,就是從外部設備讀取數據。由于數據源的多樣性,可以是磁盤映射的數據文件,串口或者是專門的數據采集卡。為了設計一個通用的架構,便于以后升級或訪問其他不同類型的數據源。一個可行的解決方法就是,添加一個適配層,設計相應的數據訪問接口,對有不同數據格式的采集,寫入等操作,都從該接口繼承,從而針對不同的數據采集方式完成相應的功能。這樣,使服務器在整體不需改變的情況下,能夠適應多種數據源的情況。其大致的結構如下圖所示
圖 3 使用適配器模式的IOPCItem 接口
IOPCItem 接口:該接口定義了對外部數據進行訪問的虛函數,包括讀取(ReadValue),和寫入(WriteValue)函數;在進行二次開發時,需針對不同的數據源需要具體實現。當一個組對象掃描該組成員項,進行數據訪問時,它將直接調用IOPCItem 接口。該接口是一個虛基類,其具體實現與外部數據源有關;對于將要訪問的外部設備,其存取數據的格式和驅動可能不同;IOPCItem 接口對此并不作具體規定,只是定義了虛函數,用來讀取和寫入數據;其具體的編碼實現需要由OPC DA 服務器將要訪問的外部設備決定。這樣,將數據訪問同具體的數據源分開,減少了耦合,使同一服務器架構可以滿足多種業務需求。
3 OPC DA 服務器與客戶端數據訪問的交互過程
OPC 客戶端對在進行數據訪問時,是以組為單位的,每個組中可以加入客戶端需要訪問的數據項,具體的訪問交互過程如下:
(1) OPC DA 客戶端查找并訪問一個OPC DA 服務器,此時在OPC DA 服務器端,創建一個Server 對象,并返回一個接口指針;
(2) 客戶端由返回的指針找到接口IOPCServer,通過IOPCServer::AddGroup()函數添加一個Group;服務器端則生成一個Group 對象,返回一個該Group 對象的接口指針;
(3) 客戶端利用該指針查找IOPCItemMgt 接口,調用函數AddItem()在服務器添加一個或多個item 數據項item 對象,然后便可對該組對象中的數據項進行存取等操作;
(4) 同步訪問:查找Group 對象的IOPCSyncIO 接口,直接調用Read(),Write()函數;異步訪問:a)注冊,查找Group 對象的IConnnectionContianer 接口,找到一個支持OPCDataCallback 接口的連接點對象,客戶端生成IOPCDataCallback 對象并在連接點IConnectionPoint 上注冊;b)查找IAsyncIO 接口,客戶端調用該接口的Read,Write,Refresh等函數,然后直接返回;c)完成數據存取后,服務器回調已經注冊的IOPCDataCallback 接口的相關函數,如OnDataChange 等,此時客戶端可以通過回調函數獲到返回的結果;歡迎轉載,本文來自電子發燒友網(http://www.nxhydt.com/)
(5) 清理現場,釋放接口指針并返回;
4 結束語
OPC 標準在硬件和軟件廠商之間建立了規范的聯系,其工控領域得到了廣泛的應用,成為一個事實上的軟件總線。可適配的OPC DA 服務器則是將其上層進行了封裝,對下層數據源存取進行了接口抽象,將數據采集同具體的數據源分離,從而降低了數據訪問的耦合性。采用可適配模式的OPC DA 服務器,可以針對不同的數據采集模式,依照具體采集卡情況實現適配接口,從而縮短軟件整體開發的周期,提高實際應用的速度。
評論
查看更多