轉帖|使用教程|編輯:莫成敏|2019-09-04 16:31:39.703|閱讀 1892 次
概述:本文主要介紹OPC的標準接口,如何實現IOPCServer接口呢,有6個方法,現在先跟著小編來了解一下OPC的用途,然后就是接口中的6個方法啦。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
OPC Server是一套利用微軟的COM/DCOM技術實現工業自動化資料獲取的架構。OPC Server提供OPC接口,它將與之相連的物理設備(PLC)的信息值通過接口返回到客戶端應用程序。也就是說,客戶端通過這些接口,可以獲得與OPC Server連接的物理設備的信息。
說到OPC Server,相信大家都很熟悉了吧。OPC相當于是硬件制造商與軟件開發商之間的一條橋梁,透過硬件廠商提供的 OPC Server 接口,軟件開發者不必考慮各項不同硬件間的差異,便可自硬件端取得所需的信息,所以軟件開發者僅需專注于程序本身的控制流程的運作。簡直不能太好用!
本文主要介紹OPC的標準接口,如何實現IOPCServer接口呢,有6個方法,現在先跟著小編來了解一下OPC的用途,然后就是接口中的6個方法啦。
OPC主要適用于過程控制和制造自動化等應用領域。 OPC是以OLE/COM機制作為應用程序的通訊標準。OLE/COM是一種客戶/服務器模式,具有語言無關性、代碼重用性、易于集成性等優點。OPC規范了接口函數,不管現場設備以何種形式存在,客戶都以統一的方式去訪問,從而保證軟件對客戶的透明性,使得用戶完全從低層的開發中脫離出來
一個設備的OPC Server主要有兩部組成,一是OPC標準接口的實現;二是與硬件設備的通信模塊。我們在這里主要討論OPC 標準接口。IOPCServer 是OPC Server的主接口,通過它實現OPC Server在操作系統中的安裝和注冊。下面主要來介紹如何實現IOPCServer接口,在IOPCServer接口中共有六個方法:AddGroup、GetErrorString、GetGroupByName、GetStatus、RemoveGroup、CreateGroupEnumerator
第一、IOPCServer::AddGroup。此方法是在OPC Server上建立一個組,函數定義為:
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)進行檢查,看是否有效或是否已經有這個組。
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); }
這需要在內存中存儲OPC Group(組) 的列表(還要有OPC項的列表)。
如果szName(組名)正確并且沒有建立過該組,就開始根據傳過來的參數進行組的建立,建立好后將該組加到自己的組列表中以備后用。
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的錯誤代碼返回相應的錯誤字符串,函數聲明:
HRESULT GetErrorString([in] HRESULT dwError, [in] LCID dwLocale, [ out, string ] LPWSTR *ppString);
第三、IOPCServer::GetGroupByName。通過指定的組名(由同一客戶端建立的)找到該組的接口指針。此方法實現比較簡單,只要根據提供的名子循環從組列表中找到該組的接口指針,并返回給客戶端。函數聲明:
HRESULT GetGroupByName( [in, string] LPCWSTR szName, [in] REFIID riid, [out, iid_is(riid)] LPUNKNOWN *ppUnk );
第四、IOPCServer::GetStatus。返回當前Server的狀態信息。此方法比較簡單,但要注意的是在使用OPCSERVERSTAUS前要進行內存分配。函數聲明:
HRESULT GetStatus( [out] OPCSERVERSTATUS **ppServerStatus );
第五、IOPCServer::RemoveGroup。從服務器中刪除指定組,在組列表中找到指定的組,并將其刪除。函數聲明:
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上所提供的組建立不同的列舉器。函數聲明:
HRESULT CreateGroupEnumerator( [in] OPCENUMSCOPE dwScope,[in] REFIID riid, [out, iid_is(riid)] LPUNKNOWN *ppUnk ;} ``
文章內容到這里就結束了,不知道大家覺得這篇文章對您是否有幫助呢?喜歡OPC Server的朋友可以了解其他相關內容哦~
金喜正規買球相關的文章:
OPC Server教程:OPC Server電腦上的DCOM配置
OPC Client和OPC Server容易出現通訊故障,原因是什么?
OPC是什么意思?OPC Server 和OPC Client又有什么區別呢?
想要購買OPC Server正版授權,或了解更多產品信息請點擊
掃描關注慧聚IT微信公眾號,及時獲取最新動態及最新資訊
本文內容轉載自CSDN
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自: