OPC DA 服務器的設計與實現
接口與對象:在各層次對象與接口的關系處理中,可以采用兩種方法:多繼承的方式,將Server/Group 對象繼承自每個標準規定的接口;或者采用聚合的方式,Server/Group 對象包含接口對象。本例采用的是第二種方式,該方式可以將使接口的編寫相對獨立,以方便測試,并且有利于自動化接口的可選擇實現。
服務器使用 VC++編程,包含以下幾個主要的類:
COPCServer:Server 對象的類,管理IOPCCommon,IOPCServer,IConnectionContainer等接口;
COPCGroup:Group 對象的類,管理IOPCItemMgt,IOPCGroupStateMgt,IOPCSyncIO,IOPCAsyncIO,IConnectionContainer 等接口;
其他接口類:每個接口還對應一個實現類(如:CIOPCItemMgtImp 是IOPCItemMgt 的具體實現),該類完成OPC 標準規定的對應接口的功能函數,類的實例化對象將以聚合的方式接受Server 或Group 對象的管理;
數據緩存區的構造:在 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 服務器將要訪問的外部設備決定。這樣,將數據訪問同具體的數據源分開,減少了耦合,使同一服務器架構可以滿足多種業務需求。
評論