摘? 要: 介紹了微軟" 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)



