《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技术 > 业界动态 > 基于COM的OPC技术研究及其接口实现

基于COM的OPC技术研究及其接口实现

2008-10-09
作者:李 勤 党选举

  摘? 要: 介紹了微軟" title="微軟">微軟的COM(DCOM)結(jié)構(gòu)及在此基礎(chǔ)上建立的OPC技術(shù)規(guī)范,具體分析了OPC的結(jié)構(gòu),并對OPC接口實現(xiàn)進行了詳盡的論述。

  關(guān)鍵詞: COM? DCOM? OPC? OPC接口? OPC服務(wù)器

?

  從計算機技術(shù)介入工業(yè)應(yīng)用領(lǐng)域開始,伴生的“信息孤島”問題就一直困繞著業(yè)界。“信息孤島”相當(dāng)嚴重地限制了信息交換繼而約束了應(yīng)用領(lǐng)域的拓展。作為開放控制網(wǎng)絡(luò)的現(xiàn)場總線,雖然能實現(xiàn)現(xiàn)場設(shè)備之間、現(xiàn)場設(shè)備與控制室之間的通信,但是如此多的總線采用不同的協(xié)議,而沒有形成一個統(tǒng)一的系統(tǒng)平臺。正是在這種背景下,產(chǎn)生了OPC技術(shù)。

1 COM(DCOM)和OPC技術(shù)

  隨著計算機硬件和軟件的飛速發(fā)展,計算機應(yīng)用的功能愈為強大、實現(xiàn)愈為靈活的同時,軟件業(yè)也因軟件的大而復(fù)雜、應(yīng)用是單一集成或不易被集成、操作系統(tǒng)的模塊化不充分、不統(tǒng)一的開發(fā)方式而面臨著嚴峻的挑戰(zhàn)。

  長期以來,設(shè)計者曾用面向?qū)ο?/a>" title="面向?qū)ο?>面向?qū)ο?/a>程序設(shè)計方法來解決傳統(tǒng)軟件開發(fā)的問題。但隨著軟件科學(xué)的不斷發(fā)展,對應(yīng)用軟件的跨語言、跨平臺和互操作性提出了更高的要求。在這種情況下,面向?qū)ο蠓椒ㄒ呀?jīng)難以滿足現(xiàn)代的分布式軟件的應(yīng)用。為了解決這個問題提出了組態(tài)軟件的思想。它將單獨、龐大而復(fù)雜的應(yīng)用程序" title="應(yīng)用程序">應(yīng)用程序分成多個模塊,每個模塊都是一個自給自足的組件(Component),應(yīng)用軟件與組件好比是機器與零件的關(guān)系。如何將許多獨立的組件粘合起來組成一個能滿足要求的應(yīng)用系統(tǒng),即需要組件之間的接口。COM就是這么一種組件標(biāo)準(zhǔn),不但如此,它還引入了面向?qū)ο蟮乃枷搿?/P>

  一個COM組件可以包含多個COM對象,COM對象被很好地封裝起來,客戶無需知道對象內(nèi)部實現(xiàn)細節(jié),只需通過COM接口訪問COM對象。COM組件分為三種類型:進程內(nèi)組件、本地組件和遠程組件即DCOM組件。DCOM是COM的無縫擴展,DCOM組件與客戶程序可位于不同計算機上,這些計算機在局域網(wǎng)內(nèi)、廣域網(wǎng)上,也可通過Internet進行連接。它可以作為分布式應(yīng)用系統(tǒng)的基本架構(gòu),客戶程序與DCOM組件對象之間形成客戶/服務(wù)器關(guān)系??蛻舫绦蛑回撠?zé)接受用戶的輸入并把服務(wù)器的響應(yīng)結(jié)果反饋給用戶。這種分布式結(jié)構(gòu)不僅可以減輕客戶程序的負擔(dān),還可以提高系統(tǒng)的整體性能。對客戶程序而言,組件程序所處的位置是透明的,不必編寫任何處理遠程調(diào)用的代碼。因為DCOM處理了底層網(wǎng)絡(luò)協(xié)議的所有細節(jié)。

  OPC(OLE for Process Control)規(guī)范是在微軟倡導(dǎo)下,由OPC基金會建立的硬件和軟件接口標(biāo)準(zhǔn)。它基于微軟現(xiàn)有的OLE、組件對象模型COM(Component Object Model)、分布式組件對象模型DCOM(Distributed COM)技術(shù)。目前已得到越來越多的工控領(lǐng)域硬件和軟件制造商的承認和支持,并已成為事實上的國際標(biāo)準(zhǔn)。OPC把硬件供應(yīng)商和軟件開發(fā)商分離開來,在設(shè)備和數(shù)據(jù)庫等數(shù)據(jù)源與客戶之間架起一座橋梁。硬件廠商提供帶OPC接口的服務(wù)器,客戶通過帶OPC接口的程序存取不同硬件廠商的設(shè)備。總的來說,采用OPC規(guī)范設(shè)計系統(tǒng)有以下好處:

  (1)OPC規(guī)范以COM/DCOM為技術(shù)基礎(chǔ),而COM/DCOM支持TCP/IP等網(wǎng)絡(luò)協(xié)議,因此可以將各個子系統(tǒng)從物理上分開,分布于網(wǎng)絡(luò)的不同節(jié)點上。

  (2)OPC按照面向?qū)ο蟮脑瓌t,將一個應(yīng)用程序(OPC服務(wù)器)作為一個對象封裝起來,只將接口方法暴露在外面,客戶以統(tǒng)一的方式去調(diào)用這個方法,從而保證軟件對客戶的透明性,使得用戶完全從低層的開發(fā)中脫離出來。

  (3)OPC實現(xiàn)了遠程調(diào)用,使得應(yīng)用程序的分布與系統(tǒng)硬件的分布無關(guān),便于系統(tǒng)硬件配置,使系統(tǒng)的應(yīng)用范圍更廣。

  (4)采用OPC規(guī)范,便于系統(tǒng)的組態(tài)化,將系統(tǒng)復(fù)雜性大大減小,可以大大縮短軟件開發(fā)周期,提高軟件運行的可靠性和穩(wěn)定性,便于系統(tǒng)的升級與維護。

  (5)OPC規(guī)范了接口函數(shù),不管現(xiàn)場設(shè)備以何種形式存在,客戶都以統(tǒng)一的方式去訪問,從而實現(xiàn)系統(tǒng)的開放性,易于實現(xiàn)與其它系統(tǒng)的接口。

  OPC現(xiàn)有的幾個比較成熟的規(guī)范,主要包括數(shù)據(jù)存取規(guī)范(The OPC Data Access Specification 3.0)、報警和事件存取規(guī)范(The OPC Alarm and Event Access Specification)、歷史和數(shù)據(jù)事件存取規(guī)范(The OPC Historical Data Access Specification)。

  OPC把OLE/COM等新技術(shù)帶給了OPC基金會,從而為工控領(lǐng)域的數(shù)據(jù)交換提供了技術(shù)保證。

2 OPC結(jié)構(gòu)及其接口分析

2.1 OPC的一般結(jié)構(gòu)

  OPC規(guī)范是一種硬件和軟件的接口標(biāo)準(zhǔn),它有兩種接口:自定義接口(Custom Interface)和自動接口(Automation Interface)。一般來說,使用VB開發(fā)的客戶程序會使用自動接口,容易得到最佳性能。OPC規(guī)范只對這些COM接口加以說明,沒有具體實現(xiàn)它,而是由OPC服務(wù)器實現(xiàn)。

  OPC結(jié)構(gòu)是一種COM結(jié)構(gòu)的客戶/服務(wù)器模式,如圖1所示。在這種模式中,OPC服務(wù)器組件提供一個接口給OPC的對象并且對這些接口進行管理。

?

?

  一個OPC客戶程序通過具體的定制和自動接口與OPC服務(wù)器進行通信,一個OPC客戶可以連接多個由不同開發(fā)商提供的服務(wù)器,一個OPC服務(wù)器可被多個客戶使用。開發(fā)商提供具體的碼來確定服務(wù)器存取哪些設(shè)備、數(shù)據(jù)、數(shù)據(jù)名以及服務(wù)器如何從設(shè)備中存取數(shù)據(jù)的細節(jié)等。

2.2? OPC數(shù)據(jù)存取定制接口規(guī)范" title="接口規(guī)范">接口規(guī)范分析

  一個OPC數(shù)據(jù)存取服務(wù)器由三種層次的接口組成,即:服務(wù)器(Server)、組(Group)、項(Item)。三種層次的接口關(guān)系如圖2所示。

?

?

  (1)OPCServer對象

  一個服務(wù)器包括一個服務(wù)器對象,它維護服務(wù)器的信息作為多個組的容器。OPC服務(wù)器鞏固和優(yōu)化各種客戶所請求的數(shù)據(jù)存取,以便于提高與設(shè)備的有效通信。其中IOPCServer是OPC服務(wù)器最主要的接口,必須提供這個接口,所有被定義的函數(shù)都要實現(xiàn)。

  (2)OPCGroup 對象

  一個組維護它自身的信息和包容,邏輯上組織多個項。組分為兩種:公共組和私有組。公共組能被多個客戶使用,而私有組只被一個客戶使用。

  組的創(chuàng)建:私有組客戶通過IOPCServer:AddGroup來創(chuàng)建,而公共組既可由服務(wù)器創(chuàng)建,也可由客戶來創(chuàng)建。當(dāng)它被客戶創(chuàng)建時,它首先作為私有組出現(xiàn),然后才由IOPCPublicGroupStateMgt:MoveToPublic轉(zhuǎn)為公共組。一旦一個組成為公共組,組內(nèi)的項不能被改變;如果要改變必須重新為這項重建一個公共組,然后把這項歸于此組內(nèi)。

  組的釋放:在與組相連的所有接口被釋放前,客戶不應(yīng)該調(diào)用IOPCServer:RemoveGroup來刪掉私有組。在所有客戶接口被釋放前,不能調(diào)用IOPCServerPublicGroups:RemovePublicGroup來刪除公共組。

  (3)Item對象

  Item對象提供OPC服務(wù)器與數(shù)據(jù)源的連接,即每一個Item對象與一個信號變量連接。它為OPC客戶提供信號變量的數(shù)值、屬性、時間戳以及數(shù)據(jù)類型等。從服務(wù)器的有效性和復(fù)雜性等方面考慮,Item對象不是COM對象,因此不提供與客戶的接口,對它的訪問需要通過Group對象。

  項是讀寫數(shù)據(jù)的最小邏輯單位,每一個項由ItemID(Item Definition)來標(biāo)識。它的句法依賴于服務(wù)器,對于不同的系統(tǒng)它構(gòu)成的含義不相同。如在一個DCS中有可能是“TIC101.PV”,而在一個支持低水平(Level)存取的PLC服務(wù)器可能支持:

  “COM1.STATION:42.REG:40001;0,4095,-100.0,+1235.0”。

2.3 OPC服務(wù)器/客戶方式的實現(xiàn)

  客戶與OPC組件之間采用連接點進行雙向通信。為了使用連接點,客戶必須創(chuàng)建一個支持IUnknown 和 IOPCDataCallback接口的對象。建立一個單獨的連接至少需要四個來回:

  (1)客戶程序調(diào)用可連接對象的IUnknown::QueryInterface 方法來請求指向IConnectionPointContainer接口的指針。

  (2)客戶程序調(diào)用IConnectionPointContainer::FindConnectionPoint方法來請求一個指向IOPCDataCallback連接點的指針。

  (3)客戶程序調(diào)用IConnectionPoint::Advise方法來為對象提供一個指向其sink對象的Iunknown接口的指針。

  (4)可連接對象調(diào)用客戶的sink對象的IUnknown::

  QueryInterface 方法來請求指向IOPCDataCallback接口的指針。

  然后,可連接對象就可以調(diào)用由客戶程序的sink實現(xiàn)的IOPCDataCallback接口的方法了。

3 OPC服務(wù)器的實現(xiàn)方式

  對于每一個OPC服務(wù)器開發(fā)人員而言,下面幾項是必備的素質(zhì):

  ·熟悉微軟的COM、DCOM(COM+)技術(shù);

  ·熟知所要開發(fā)的OPC服務(wù)器接口規(guī)范,例如:數(shù)據(jù)存取接口規(guī)范,包括數(shù)據(jù)存取定制接口規(guī)范、數(shù)據(jù)存取自動接口規(guī)范;

  ·了解計算機過程控制的一些基本理論及應(yīng)用所涉及的各個參數(shù);

  ·熟練地運用開發(fā)COM接口程序的計算機語言。

  微軟的COM(DCOM)技術(shù)深奧復(fù)雜,不易掌握,不利于程序員快速高效地開發(fā)出OPC服務(wù)器。OPC基金會已提供了各種標(biāo)準(zhǔn)的COM接口,可對其復(fù)用,以減輕程序員的負擔(dān)。

  一般采用兩種方式來實現(xiàn)OPC服務(wù)器的開發(fā):

  ·依據(jù)OPC規(guī)范從底層實現(xiàn)OPC標(biāo)準(zhǔn)接口,程序員要花大量的時間去熟悉COM(DCOM)以及OPC的各個接口函數(shù);

????·利用OPC快速開發(fā)工具" title="開發(fā)工具">開發(fā)工具。事實它是一個API函數(shù)庫,每個API函數(shù)調(diào)用OPC標(biāo)準(zhǔn)接口的方法,屏蔽底層操作。以使程序員把精力放在功能的實現(xiàn)上,而不用花大量的時間研究COM(DCOM)技術(shù)和OPC的各個接口之間的關(guān)系。

  筆者曾開發(fā)了兩個動態(tài)鏈接的API函數(shù)庫,一個專用于服務(wù)器應(yīng)用程序的開發(fā),另一個用于客戶方應(yīng)用程序的開發(fā)。下面是OPC數(shù)據(jù)服務(wù)器的快速開發(fā)工具的一組API函數(shù)集合,描述了用戶數(shù)據(jù)采集程序與OPC服務(wù)器之間的編程接口,簡單歸納如下:

  (1)開發(fā)工具初始化API

  BOOL InitWTOPCSvr(GUID CLSID_Svr, UINT ServerRate, LPCSTR Name);

在使用開發(fā)工具前,必須使用初使化函數(shù)對開發(fā)工具進行初始化,提供OPC服務(wù)器刷新率、OPC服務(wù)器的程序信息(如CLSID)、服務(wù)器的名字等。

  (2)注冊與刪除API

  BOOL RegisterOPCSvr(GUID CLSID_Svr,LPCSTR Name, LPCSTR Descr, LPCSTR ExePath);

  BOOL UnRegisterOPCSvr(CLSID_Svr, LPCSTR Name);

????向注冊表提供OPC服務(wù)器的注冊信息,支持OPC服務(wù)器的瀏覽及遠程訪問。

  其中Descr是對服務(wù)器的描述,一般指服務(wù)器的版本信息;ExePath是行文件的完整路徑。如果函數(shù)成功則返回TRUE,否則返回FALSE。

????(3)啟動/停止OPC

????開發(fā)工具API及獲取開發(fā)工具的運行狀態(tài)API。

  BOOL StartServerDLL();

  int NumbrClientConnections ();

????void RequestDisconnect ();

  UninitOPCsvr();

  在用戶程序退出前,應(yīng)獲取OPC服務(wù)器的運行狀態(tài),檢查是否有OPC客戶與服務(wù)器連接,決定是否退出程序。用戶可以調(diào)用 NumbrClientConnections () 函數(shù),觀察有多少個OPC客戶程序與OPC服務(wù)器連接。調(diào)用RemoveTag()函數(shù)刪除Item.;在程序終止時,調(diào)用UninitOPCsvr()函數(shù)來初始化DCOM。

  (4)OPC服務(wù)器變量寫值A(chǔ)PI

  HRESULT WriteCallback( WRITEPROC lpCallback);

  為了完成OPC客戶程序?qū)ΜF(xiàn)場設(shè)備中參數(shù)的修改,用戶程序需要提供相應(yīng)的函數(shù)指針,供OPC工具調(diào)用。用戶可以利用回調(diào)函數(shù)完成設(shè)備參數(shù)的修改工作。

  (5)OPC服務(wù)器變量讀值A(chǔ)PI

  BOOL ReadTag (HANDLE TagHandle, VARIANT *pValue, FILETIME *pTimestamp);

  為了完成OPC客戶程序?qū)ΜF(xiàn)場設(shè)備中參數(shù)的讀取,用戶程序需要提供相應(yīng)的函數(shù)指針,供OPC工具調(diào)用。用戶可以利用回調(diào)函數(shù)完成設(shè)備參數(shù)的讀取。如果服務(wù)器不支持timeStamp,則dll使用當(dāng)前的PC值。

  (6)添加/刪除數(shù)據(jù)變量API

  HANDLE AddTag(Cstring name,VARIANT value,BOOL reakOnly);

  BOOL RemoveTag(HANDLE hTag);

????數(shù)據(jù)變量是用戶提供給OPC客戶的數(shù)據(jù)訪問點,用戶程序需要維護數(shù)據(jù)點的變化,根據(jù)現(xiàn)場數(shù)據(jù)的變化及時更新。同時利用變量的命名規(guī)則定義OPC服務(wù)器的瀏覽地址空間,如使用“·”表示樹狀結(jié)構(gòu)的分枝,變量名稱為FI302.VFD.AI.MODE.TARGET。

  (7)數(shù)據(jù)變量的更新API

????BOOL UpdateTag(HANDLE handle,VARIANT& var,WORD quality,F(xiàn)ILETIME timeStamp);

  BOOL UpdateTagByNameA (LPCSTR Name, VARIANT Value, WORD Quality);

  用戶通過更新函數(shù)可以及時更新和維護開發(fā)工具中已經(jīng)添加的數(shù)據(jù)變量的值、時間戳、質(zhì)量。

  (8)修改變量的屬性值A(chǔ)PI

  BOOL SetTagProp(ANDLE TagHandle,DWORD PropertyID, LPCSTR Description, VARIANT Value);

  任何OPC Item都可通過這個函數(shù)加以修改。

  (9)OPC服務(wù)器斷開API

  BOOL DisconnectCallback (DISCONNECTPROC lpCallback);

  用戶可以利用回調(diào)函數(shù)完成與服務(wù)器的斷開。

  對于服務(wù)器應(yīng)用程序,有幾點值得注意:

  ·每一個OPC服務(wù)器都由一個唯一的CLSID所標(biāo)識,OPC客戶利用它與服務(wù)器進行連接;

  ·初始化COM/DCOM;

  ·注冊服務(wù)器應(yīng)用程序。

  對于客戶方應(yīng)用程序,有幾點值得注意:

  ·初始化COM/DCOM;

  ·OPC數(shù)據(jù)存取服務(wù)器名,可用CoCreateInstance創(chuàng)建非遠程服務(wù)器對象, 用CoCreateInstanceEx來創(chuàng)建遠程服務(wù)器對象;

  ·服務(wù)器主機名,由CoCreateInstanceEx獲得;

  ·供應(yīng)商對OPC項(Item)的具體規(guī)定。

4 OPC發(fā)展現(xiàn)狀與趨勢

  目前,OPC基金會正在開發(fā)OPC DX standard for Ethernet,如圖3所示。它將為以太網(wǎng)上服務(wù)器到服務(wù)器(Server-to-Server)的通信和可互操作的數(shù)據(jù)交換提供支持。它是已存在的OPC數(shù)據(jù)存取規(guī)范的擴展,它擴展了運行時的數(shù)據(jù)共享交換,與正在使用的實時應(yīng)用協(xié)議相獨立。它能在任意時間和地點傳輸數(shù)據(jù),而不管它基于那種通信技術(shù)。所有基于工業(yè)以太網(wǎng)開發(fā)出來的現(xiàn)場設(shè)備、網(wǎng)絡(luò)設(shè)備和PC產(chǎn)品都可進行無縫的通信。對于自動化設(shè)備可有多個網(wǎng)絡(luò)策略的終端用戶,也可通過多個網(wǎng)絡(luò)與OPC DX設(shè)備通信。某些OPC軟件既可與設(shè)備進行通信,也可與其它軟件通信。

?

?

  另外,不管是舊系統(tǒng)還是新系統(tǒng)都可通過OPC DX進行通信。

  不久的將來,OPC接口將會擴展到XML(Extensible Markup Language)領(lǐng)域。

  OPC技術(shù)隨著適合它的新技術(shù)的問世會不斷地改進和完善。目前,用于以太網(wǎng)的OPC DX規(guī)范已經(jīng)完成,而在中國OPC剛剛開始。為了加快與國際化接軌,不能只停留在介紹層面上,而應(yīng)去了解它的內(nèi)部,開發(fā)自己的OPC服務(wù)器。

?

參考文獻

1 OPC基金會 (www.opcfoundation.org)

2 [美] Guy Eddon,Henry Eddon著.希望圖書創(chuàng)作室譯.Inside COM+ Base Services.北京:北京希望電子出版社,2000.4

3 [美] Dale Rogerson著, 楊秀章譯. Inside COM.北京:?清華大學(xué)出版社,1993.3

4 余 英,梁 剛.Visual C++實踐與提高COM和COM+篇.北京:中國鐵道出版社,2000.2

5 鐘霖田.OPC-全開放控制系統(tǒng)的核心構(gòu)件.自動化博覽,?2002;(2)

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。

相關(guān)內(nèi)容