如何開發OPC Server 風間月

2021-03-31 08:56:29 字數 4800 閱讀 2439

首先我們先來看一下什麼是opc

再來了解一下opc的用途

opc主要適用於過程控制和製造自動化等應用領域。 opc是以ole/***機制作為應用程式的通訊標準。ole/***是一種客戶/伺服器模式,具有語言無關性、**重用性、易於整合性等優點。opc規範了介面函式,不管現場裝置以何種形式存在,客戶都以統一的方式去訪問,從而保證軟體對客戶的透明性,使得使用者完全從低層的開發中脫離出來

然後我們再來看看opc server的組成

乙個裝置的opc server主要有兩部組成,一是opc標準介面的實現;二是與硬體裝置的通訊模組。

實現opc 標準介面

[圖1]

在這些介面中,iopcserver 是opc server的主介面,通過它實現opc server在作業系統中的安裝和註冊。此介面是必須要實現的,其所有方法也必須實現。其它的介面都是可選的我們就不做介紹了,下面主要來介紹如何實現iopcserver介面。

在iopcserver介面中共有六個法:

1、 iopcserver::addgroup

hresult addgroup( [in, string] lpcwstr szname,

[in] bool bactive,

[in] dword dwrequestedupdaterate,

[in] opchandle hclientgroup,

[unique, in] long *ptimebias,

[in] float * ppercentdeadband,

[in] dword dwlcid,

[out] opchandle * phservergroup,

[out] dword *previsedupdaterate,

[in] refiid riid,

[out, iid_is(riid)] lpunknown * ppunk );

此方法是在opc server上建立乙個組。下在我們來實現這個方法:

….….

首先要對組名(szname)進行檢查,看是否有效或是否已經有這個組。

if (szname != null)

else

requestedname = psvrobject->defaultgroupname();

for (i=0; i

numbrgroups(); i++)

這需要在記憶體中維護opc group(組)的列表(還要有opc 項的列表)。

如果szname(組名)正確並且沒有建立過該組,就開始根據傳過來的引數進行組的建立,建立好後將該組加到自己的組列表中以備後用。

else

if (previsedupdaterate)

*previsedupdaterate = actualrate;

pgroup = new (copcgroup);

if(pgroup == null)

return (e_outofmemory);

pgroup->name = requestedname;

pgroup->psvrobject = psvrobject;

pgroup->markedfordeletion = false;

pgroup->clientgrouphandle = hclientgroup;

pgroup->updaterate = actualrate;

pgroup->isactive = bactive;

if (ppercentdeadband)

pgroup->deadband = *ppercentdeadband;

else

pgroup->deadband = 0.0;

pgroup->lcid = dwlcid;

if (ptimebias)

pgroup->timebias = *ptimebias;

else

r1 = pgroup->queryinte***ce(riid, (lpvoid*) ppunk);

if(failed(r1))

psvrobject->addnewgroup(pgroup);

最後將新建組的介面指標返回給客戶端。

*phservergroup = pgroup->servergrouphandle;

2、iopcserver::geterrorstring

hresult geterrorstring( [in] hresult dwerror,

[in] lcid dwlocale,

[out, string] lpwstr *ppstring );

為server的錯誤**返回相應的錯誤字串。

char buf[128];

bool bfound = false;

for( int i = 0; i < nopcerrors; ) }

if( !bfound )

}

3、 iopcserver::getgroupbyname

hresult getgroupbyname( [in, string] lpcwstr szname,

[in] refiid riid,

[out, iid_is(riid)] lpunknown * ppunk );

通過指定的組名(由同一客戶端建立的)找到該組的介面指標。

此方法實現比較簡單,只要根據提供的名子迴圈從組列表中找到該組的介面指標,並返回給客戶端

*ppunk = 0;

requestedname = szgroupname;

for (i=0; i

numbrgroups(); i++)

}

4、 iopcserver::getstatus

hresult getstatus( [out] opcserverstatus ** ppserverstatus );

返回當前server的狀態資訊。

此方法比較簡單,但要注意的是在使用opcserverstaus前要進行記憶體分配。

if (pserverstatus == null)

return (e_outofmemory);

cofiletimenow( &pserverstatus->ftcurrenttime);

pserverstatus->ftlastupdatetime = psvrobject->mlastupdate;

//rwd allow user to manipulate returned opcserverstatus, lined up layout for clarity...

//endrwd

pserverstatus->dwgroupcount = 0;

pserverstatus->dwbandwidth = 0;

pserverstatus->wmajorversion = 0;

pserverstatus->wminorversion = 0;

pserverstatus->wbuildnumber = 0;

pserverstatus->wreserved = 42;

返回伺服器狀態

*ppserverstatus = pserverstatus;

5、 iopcserver::removegroup

hresult removegroup( [in] opchandle hservergroup,

[in] bool bforce );

從伺服器中刪除指定組

在組列表中找到指定的組,並將其刪除。

for (i=0; i

numbrgroups(); i++)

else if (bforce)

else

return (s_ok);

}

}

6、 iopcserver::creategroupenumerator

hresult creategroupenumerator( [in] opcenumscope dwscope,

[in] refiid riid,

[out, iid_is(riid)] lpunknown* ppunk );

為server上所提供的組建立不同的列舉器。

if ( riid == iid_ienumunknown)

if ( riid == iid_ienumstring)

上面是直接使用***技術進行開發的,這要求你必須熟悉***技術。如果你對***不是很了解那也沒關係,可以選擇opc server的開發工具,你只需要簡單的呼叫開發工具的函式就可以實現opc server中的所有介面。

我們雖然實現了iopcserver介面中的所有方法,但它只是opc client與我們通訊的乙個橋梁,最主要的還是我們要自己維護好opc group和opc item列表。這樣我們才可以跟opc client進行真正的資料通訊。

與硬體裝置進行通訊

介面已經實現好了,這回我們該從硬體裝置中讀取資料提供給opc client了。

同硬體裝置通訊有多種方法,如果你是裝置的製造商就可以直對硬體進行資料操作了;你也可以通過裝置驅動程式和硬體廠商提供的api或是通過tcp、串列埠等方法進行操作,這就要看硬體裝置提供的與軟體通訊的介面是什麼樣的了。

不管你用什麼方法只要把資料從硬體裝置中讀取上來並與opc 項進行關聯,就可以實現opc server了。

由於時間和作者水平的限制,難免有錯誤和不妥之處,敬請大家批評和指正。我的郵件是yanghongtao@thtf.***.**。最後感謝清華同限份****的周洪波博士和盧盛融經理給我開發和學習opc的機會,使我了解opc並寫下這篇文章。

2004-2-11 楊洪濤

OPC Server開發的幾大境界

opc server 的開發相對 opc client 更加困難 opc server 的開發主要應用 技術 主要應用書籍為潘愛民寫的 入門和應用 大量的技術有很大的可重用性 在開發完乙個程式後 基本上所有的東東都可以被重用 並且重新發布。開發方式有三種 1。簡單的 就是應用已經有的如dde to ...

OPC Server開發的幾大境界

opc server的開發相對opc client 更加困難,opc server 的開發主要應用com技術,主要應用書籍為潘愛民寫的 com入門和應用 大量的技術有很大的可重用性,在開發完乙個程式後,基本上所有的東東都可以被重用,並且重新發布。開發方式有三種 1。簡單的 就是應用已經有的如dde ...

面向業務開發應用 如何避免步驟間操作衝突

在 面向業務開發應用 中,我們有乙個出差審批的例項 見圖一 在這個業務流程中,我們希望在領導審批前,申請人可以隨時修改休假申請,而領導一旦在審批過程中,申請人不能進行修改,同樣申請人在修改申請時,審批人也不能進行審批,那麼我們怎麼處理呢?使用普知傑協同應用系統進行配置就非常簡單,只要我們設定乙個前提...