新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > OPC DA 服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)

OPC DA 服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)

作者: 時(shí)間:2010-10-25 來源:網(wǎng)絡(luò) 收藏

  接口與對(duì)象:在各層次對(duì)象與接口的關(guān)系處理中,可以采用兩種方法:多繼承的方式,將Server/Group 對(duì)象繼承自每個(gè)標(biāo)準(zhǔn)規(guī)定的接口;或者采用聚合的方式,Server/Group 對(duì)象包含接口對(duì)象。本例采用的是第二種方式,該方式可以將使接口的編寫相對(duì)獨(dú)立,以方便測(cè)試,并且有利于自動(dòng)化接口的可選擇。

  使用 VC++編程,包含以下幾個(gè)主要的類:

  CServer:Server 對(duì)象的類,管理ICommon,IServer,IConnectionContainer等接口;

  COPCGroup:Group 對(duì)象的類,管理IOPCItemMgt,IOPCGroupStateMgt,IOPCSyncIO,IOPCAsyncIO,IConnectionContainer 等接口;

  其他接口類:每個(gè)接口還對(duì)應(yīng)一個(gè)類(如:CIOPCItemMgtImp 是IOPCItemMgt 的具體),該類完成OPC 標(biāo)準(zhǔn)規(guī)定的對(duì)應(yīng)接口的功能函數(shù),類的實(shí)例化對(duì)象將以聚合的方式接受Server 或Group 對(duì)象的管理;

  數(shù)據(jù)緩存區(qū)的構(gòu)造:在 OPC 中,Cache 是重要的部分,存儲(chǔ)結(jié)構(gòu)將直接影響數(shù)據(jù)訪問的速度,它負(fù)責(zé)將從設(shè)備中讀取的數(shù)據(jù)先存放在數(shù)據(jù)緩存區(qū),供同步或異步讀取。緩存區(qū)內(nèi)存可以采用連續(xù)存儲(chǔ),鏈?zhǔn)酱鎯?chǔ)和哈希存儲(chǔ)。其中,考慮到存取速度和方便管理,該選擇采用連續(xù)存儲(chǔ)的方式。該方式可以隨機(jī)存取數(shù)據(jù),但存取數(shù)據(jù)的數(shù)量不宜過大,如果需要存取較大數(shù)量的數(shù)據(jù)項(xiàng),則推薦采用哈希存儲(chǔ)方式。對(duì)于每個(gè)數(shù)據(jù)項(xiàng),都包含有三個(gè)基本屬性:數(shù)值(Value),時(shí)間戳(Time Stamp)和數(shù)據(jù)品質(zhì)(Quality)。從數(shù)據(jù)源中訪問到的數(shù)據(jù)項(xiàng)將按照線性方式存儲(chǔ)到連續(xù)的內(nèi)存區(qū)域中;每次對(duì)緩存區(qū)的訪問都需要進(jìn)行加鎖,以防止出現(xiàn)同時(shí)進(jìn)行讀操作和寫操作。

  2.3 輪詢方式對(duì)數(shù)據(jù)源進(jìn)行訪問:

  由于服務(wù)器是單獨(dú)不斷從數(shù)據(jù)源讀取數(shù)據(jù),因此可以采用單獨(dú)的線程,按時(shí)間輪詢的方式,每隔一段時(shí)間對(duì)數(shù)據(jù)源進(jìn)行訪問,這個(gè)時(shí)間也就成為服務(wù)器支持的最短數(shù)據(jù)訪問時(shí)間。服務(wù)器的主要工作流程:

  (1) 每隔一段時(shí)間進(jìn)行輪詢操作;

  (2) 如果掃描時(shí)間到,訪問數(shù)據(jù)源;否則,至(3);如果有訂閱請(qǐng)求,回調(diào)訂閱函數(shù);

  (3) 如果有刷新請(qǐng)求,回調(diào)刷新函數(shù);如果有異步讀數(shù)據(jù)請(qǐng)求,讀取數(shù)據(jù)并回調(diào)異步讀函數(shù);如果有異步寫請(qǐng)求,將數(shù)據(jù)寫入外部設(shè)備;

  (4) 返回(1);

  服務(wù)器中該循環(huán)的主要功能,主要用來進(jìn)行異步數(shù)據(jù)存取,訂閱及刷新。而對(duì)于同步訪問等操作,由于需要服務(wù)器立即存取數(shù)據(jù)然后返回結(jié)果,因此其實(shí)現(xiàn)并不在該主循環(huán)中,而是針對(duì)其接口單獨(dú)編寫一個(gè)類,用來實(shí)現(xiàn)同步存取接口函數(shù)的功能。

  2.4 OPC 的數(shù)據(jù)訪問方式

  OPC 對(duì)數(shù)據(jù)的訪問主要分為以下幾種:同步讀,異步讀,訂閱和數(shù)據(jù)刷新;對(duì)數(shù)據(jù)源的操作又可以分為直接從設(shè)備讀取和從Cache 中讀取。這兩者的組合構(gòu)成了對(duì)數(shù)據(jù)源的訪問規(guī)則,OPC 標(biāo)準(zhǔn)對(duì)訪問規(guī)則進(jìn)行了詳細(xì)的描述。在這幾種數(shù)據(jù)訪問中,同步讀接口可以實(shí)現(xiàn)少量,快速的數(shù)據(jù)讀取,異步讀則是提交一個(gè)請(qǐng)求,然后返回,等服務(wù)器完成數(shù)據(jù)讀取后回調(diào)函數(shù)。與同步讀相比,異步讀更能提高OPC Client 的使用效率,防止OPC 服務(wù)器尚未訪問到數(shù)據(jù)時(shí),造成客戶端的等待。訂閱異步讀大致相同,每當(dāng)訪問數(shù)據(jù)源后自動(dòng)將數(shù)據(jù)提交給客戶端。

  

OPC 服務(wù)器中采用的可連接對(duì)象結(jié)構(gòu)模型 www.elecfans.com

  圖 2 OPC 服務(wù)器中采用的可連接對(duì)象結(jié)構(gòu)模型

  在 OPC 2.0 和OPC DA3.0 中的異步通訊機(jī)制中,使用到了連接點(diǎn)容器/連接點(diǎn)接口[1],取代了原來OPC DA1.0 中的直接注冊(cè)/回調(diào)的模式。能夠更靈活的支持多個(gè)連接點(diǎn)和連接。在可連接對(duì)象模式中,每個(gè)可連接對(duì)象可以包含多個(gè)連接點(diǎn),每個(gè)連接點(diǎn)支持一種回調(diào)接口;每個(gè)連接點(diǎn)上可以連接多個(gè)客戶端;回調(diào)接口由客戶端實(shí)現(xiàn),可連接對(duì)象通過回調(diào)函數(shù)于客戶端進(jìn)行交互。

  在 OPC DA 服務(wù)器中,可連接對(duì)象包括Server 對(duì)象和Group 對(duì)象兩種,Server 對(duì)象只支持一個(gè)IOPCShutdown 回調(diào)接口,而異步數(shù)據(jù)交換等重要的功能位于Group 對(duì)象中。在OPC 組對(duì)象中,包含一個(gè)連接點(diǎn)對(duì)象,該對(duì)象支持IOPCDataCallback 回調(diào)接口,連接點(diǎn)可以連接多個(gè)客戶端,當(dāng)異步訪問完成時(shí),服務(wù)器同過可連接對(duì)象通過調(diào)用標(biāo)準(zhǔn)規(guī)定的回調(diào)函數(shù),通知每個(gè)已經(jīng)注冊(cè)的客戶端。

  2.5 基于適配器模式的數(shù)據(jù)采集

  OPC DA 服務(wù)器的最重要功能,就是從外部設(shè)備讀取數(shù)據(jù)。由于數(shù)據(jù)源的多樣性,可以是磁盤映射的數(shù)據(jù)文件,串口或者是專門的數(shù)據(jù)采集卡。為了一個(gè)通用的架構(gòu),便于以后升級(jí)或訪問其他不同類型的數(shù)據(jù)源。一個(gè)可行的解決方法就是,添加一個(gè)適配層,相應(yīng)的數(shù)據(jù)訪問接口,對(duì)有不同數(shù)據(jù)格式的采集,寫入等操作,都從該接口繼承,從而針對(duì)不同的數(shù)據(jù)采集方式完成相應(yīng)的功能。這樣,使服務(wù)器在整體不需改變的情況下,能夠適應(yīng)多種數(shù)據(jù)源的情況。其大致的結(jié)構(gòu)如下圖所示

  

使用適配器模式的IOPCItem 接口 www.elecfans.com

  圖 3 使用適配器模式的IOPCItem 接口

  IOPCItem 接口:該接口定義了對(duì)外部數(shù)據(jù)進(jìn)行訪問的虛函數(shù),包括讀取(ReadValue),和寫入(WriteValue)函數(shù);在進(jìn)行二次開發(fā)時(shí),需針對(duì)不同的數(shù)據(jù)源需要具體實(shí)現(xiàn)。當(dāng)一個(gè)組對(duì)象掃描該組成員項(xiàng),進(jìn)行數(shù)據(jù)訪問時(shí),它將直接調(diào)用IOPCItem 接口。該接口是一個(gè)虛基類,其具體實(shí)現(xiàn)與外部數(shù)據(jù)源有關(guān);對(duì)于將要訪問的外部設(shè)備,其存取數(shù)據(jù)的格式和驅(qū)動(dòng)可能不同;IOPCItem 接口對(duì)此并不作具體規(guī)定,只是定義了虛函數(shù),用來讀取和寫入數(shù)據(jù);其具體的編碼實(shí)現(xiàn)需要由OPC DA 服務(wù)器將要訪問的外部設(shè)備決定。這樣,將數(shù)據(jù)訪問同具體的數(shù)據(jù)源分開,減少了耦合,使同一服務(wù)器架構(gòu)可以滿足多種業(yè)務(wù)需求。



評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉