轉(zhuǎn)帖|使用教程|編輯:莫成敏|2019-09-04 16:31:39.703|閱讀 1906 次
概述:本文主要介紹OPC的標(biāo)準接口,如何實現(xiàn)IOPCServer接口呢,有6個方法,現(xiàn)在先跟著小編來了解一下OPC的用途,然后就是接口中的6個方法啦。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
OPC Server是一套利用微軟的COM/DCOM技術(shù)實現(xiàn)工業(yè)自動化資料獲取的架構(gòu)。OPC Server提供OPC接口,它將與之相連的物理設(shè)備(PLC)的信息值通過接口返回到客戶端應(yīng)用程序。也就是說,客戶端通過這些接口,可以獲得與OPC Server連接的物理設(shè)備的信息。
說到OPC Server,相信大家都很熟悉了吧。OPC相當(dāng)于是硬件制造商與軟件開發(fā)商之間的一條橋梁,透過硬件廠商提供的 OPC Server 接口,軟件開發(fā)者不必考慮各項不同硬件間的差異,便可自硬件端取得所需的信息,所以軟件開發(fā)者僅需專注于程序本身的控制流程的運作。簡直不能太好用!
本文主要介紹OPC的標(biāo)準接口,如何實現(xiàn)IOPCServer接口呢,有6個方法,現(xiàn)在先跟著小編來了解一下OPC的用途,然后就是接口中的6個方法啦。
OPC主要適用于過程控制和制造自動化等應(yīng)用領(lǐng)域。 OPC是以O(shè)LE/COM機制作為應(yīng)用程序的通訊標(biāo)準。OLE/COM是一種客戶/服務(wù)器模式,具有語言無關(guān)性、代碼重用性、易于集成性等優(yōu)點。OPC規(guī)范了接口函數(shù),不管現(xiàn)場設(shè)備以何種形式存在,客戶都以統(tǒng)一的方式去訪問,從而保證軟件對客戶的透明性,使得用戶完全從低層的開發(fā)中脫離出來
一個設(shè)備的OPC Server主要有兩部組成,一是OPC標(biāo)準接口的實現(xiàn);二是與硬件設(shè)備的通信模塊。我們在這里主要討論OPC 標(biāo)準接口。IOPCServer 是OPC Server的主接口,通過它實現(xiàn)OPC Server在操作系統(tǒng)中的安裝和注冊。下面主要來介紹如何實現(xiàn)IOPCServer接口,在IOPCServer接口中共有六個方法:AddGroup、GetErrorString、GetGroupByName、GetStatus、RemoveGroup、CreateGroupEnumerator
第一、IOPCServer::AddGroup。此方法是在OPC Server上建立一個組,函數(shù)定義為:
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 ;
使用實例:首先要對組名(szName)進行檢查,看是否有效或是否已經(jīng)有這個組。
RequestedName = szName;
if (RequestedName == ""){
RequestedName = pSvrObject->DefaultGroupName();
}else{
RequestedName = pSvrObject->DefaultGroupName();
}
for (i = 0; i<NumbrGroups(); i++){
pGroup = pSvrObject->GetGroup(i);
if (RequestedName == pGroup->Name)
return (OPC_E_DUPLICATENAME);
}
這需要在內(nèi)存中存儲OPC Group(組) 的列表(還要有OPC項的列表)。
如果szName(組名)正確并且沒有建立過該組,就開始根據(jù)傳過來的參數(shù)進行組的建立,建立好后將該組加到自己的組列表中以備后用。
if ((dwRequestedUpdateRate == 0) || (dwRequestedUpdateRate < pApp->ServerTickRate))
ActualRate = pApp->ServerTickRate;
else {
ActualRate = dwRequestedUpdateRate;
MinRate = pApp->ServerTickRate;
ActualRate += (MinRate / 2);
ActualRate /= MinRate;
ActualRate *= MinRate;
}
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 {
_ftime( &timebuffer) ;
pGroup->TimeBias = timebuffer.timezone;
// pGroup->TimeBias = 300L;
}
r1 = pGroup->QueryInterface(riid, (LPVOID *)ppUnk);
if (FAILED(r1)){
// If error - delete group and return
delete (pGroup);
return r1;
}
pSvrObject->AddNewGroup(pGroup);
最后將新建組的接口指針返回給客戶端。
*phServerGroup = pGroup->ServerGroupHandle;
第二、IOPCServer::GetErrorString。為Server的錯誤代碼返回相應(yīng)的錯誤字符串,函數(shù)聲明:
HRESULT GetErrorString([in] HRESULT dwError, [in] LCID dwLocale, [ out, string ] LPWSTR *ppString);
第三、IOPCServer::GetGroupByName。通過指定的組名(由同一客戶端建立的)找到該組的接口指針。此方法實現(xiàn)比較簡單,只要根據(jù)提供的名子循環(huán)從組列表中找到該組的接口指針,并返回給客戶端。函數(shù)聲明:
HRESULT GetGroupByName( [in, string] LPCWSTR szName, [in] REFIID riid, [out, iid_is(riid)] LPUNKNOWN *ppUnk );
第四、IOPCServer::GetStatus。返回當(dāng)前Server的狀態(tài)信息。此方法比較簡單,但要注意的是在使用OPCSERVERSTAUS前要進行內(nèi)存分配。函數(shù)聲明:
HRESULT GetStatus( [out] OPCSERVERSTATUS **ppServerStatus );
第五、IOPCServer::RemoveGroup。從服務(wù)器中刪除指定組,在組列表中找到指定的組,并將其刪除。函數(shù)聲明:
HRESULT RemoveGroup( [in] OPCHANDLE hServerGroup, [in] BOOL bForce ;)
使用實例:
for (i = 0; i<NumbrGroups(); i++){
pGroup = pSvrObject->GetGroup(i);
if (groupHandleID == pGroup->ServerGroupHandle){
pSvrObject->RemoveGroup(i);
// if no outstanding references delete it
if (pGroup->RefCount == 0) {
pSvrObject->LockGroupList();
delete (pGroup);
pSvrObject->UnlockGroupList();
}elseif (bForce){
DeletedGroupList.Add((CObject *)pGroup);
} else {
pGroup->MarkedForDeletion = TRUE;
pGroup->pSvrObject = NULL;
return (OPC_S_INUSE);
}
return (S_OK);
}
}
第六、IOPCServer::CreateGroupEnumerator。為Server上所提供的組建立不同的列舉器。函數(shù)聲明:
HRESULT CreateGroupEnumerator( [in] OPCENUMSCOPE dwScope,[in] REFIID riid, [out, iid_is(riid)] LPUNKNOWN *ppUnk ;} ``
文章內(nèi)容到這里就結(jié)束了,不知道大家覺得這篇文章對您是否有幫助呢?喜歡OPC Server的朋友可以了解其他相關(guān)內(nèi)容哦~
半島外圍網(wǎng)上直營相關(guān)的文章:
OPC Server教程:OPC Server電腦上的DCOM配置
OPC Client和OPC Server容易出現(xiàn)通訊故障,原因是什么?
OPC是什么意思?OPC Server 和OPC Client又有什么區(qū)別呢?
想要購買OPC Server正版授權(quán),或了解更多產(chǎn)品信息請點擊
掃描關(guān)注慧聚IT微信公眾號,及時獲取最新動態(tài)及最新資訊
本文內(nèi)容轉(zhuǎn)載自CSDN
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自: