Server 如何开发OPC 由风间月撰写 (server是什么意思)

宣布于:2004-03-1110:32:00楼主首先咱们先来看一下什么是OPCOPC(OLEforProcessControl——用于环节控制的OLE)是基于Microsoft公司的DNA(DistributedInternetApplication)构架和COM(ComponentObjectModel)技术的一个工业规范接口,是依据易于裁减性而设计的。再来了解一下OPC的用途OPC重要实用于环节控制和制造智能化等运行畛域。OPC是以OLE/COM机制造为运行程序的通讯规范。OLE/COM是一种客户/主机形式,具备言语有关性、代码重用性、易于集成性等好处。OPC规范了接口函数,不论现场设施以何种方式存在,客户都以一致的方式去访问,从而保障软件对客户的透明性,使得用户齐全从低层的开发中脱离进去而后咱们再来看看OPCServer的组成一个设施的OPCServer重要有两部组成,一是OPC规范接口的成功;二是与配件设施的通讯模块。成功OPC规范接口[图1]在这些接口中,IOPCServer是OPCServer的主接口,经过它成功OPCServer在操作系统中的装置和注册。此接口是必定要成功的,其一切方法也必定成功。其它的接口都是可选的咱们就不做引见了,上方重要来引见如何成功IOPCServer接口。在IOPCServer接口中共有六个法:1、IOPCServer::AddGroupHRESULTAddGroup([in,string]LPCWSTRszName,[in]BOOLbActive,[in]DWORDdwRequestedUpdateRate,[in]OPCHANDLEhClientGroup,[unique,in]LONG*pTimeBias,[in]FLOAT*pPercentDeadband,[in]DWORDdwLCID,[out]OPCHANDLE*phServerGroup,[out]DWORD*pRevisedUpdateRate,[in]REFIIDriid,[out,iid_is(riid)]LPUNKNOWN*ppUnk);此方法是在OPCServer上建设一个组。下在咱们来成功这个方法:….….首先要对组名(szName)启动审核,看能否有效或能否曾经有这个组。if(szName!=NULL){RequestedName=szName;if(RequestedName=="")RequestedName=pSvrObject->DefaultGroupName();}elseRequestedName=pSvrObject->DefaultGroupName();for(i=0;i NumbrGroups();i++){pGroup=pSvrObject->GetGroup(i);if(RequestedName==pGroup->Name)return(OPC_E_DUPLICATENAME);}这要求在内存中保养OPCGroup(组)的列表(还要有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;elsepGroup->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)){//Iferror-deletegroupandreturndelete(pGroup);returnr1;}pSvrObject->AddNewGroup(pGroup);最后将新建组的接口指针前往给客户端。*phServerGroup=pGroup->ServerGroupHandle;2、IOPCServer::GetErrorStringHRESULTGetErrorString([in]HRESULTdwError,[in]LCIDdwLocale,[out,string]LPWSTR*ppString);为Server的失误代码前往相应的失误字符串。charbuf[128];BOOLbFound=FALSE;for(inti=0;i<nOpcErrors;){OpcError*e=&OpcErrors[i++];if((bFound=(hr==e->hrErr))!=FALSE){strcpy(buf,e->ErrText);break;}}if(!bFound){DWORDdwStatus=FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ARGUMENT_ARRAY,//Argumentsisnotava_listNULL,//LPCVOIDpointertomessagesourcehr,//DWORDrequestedmessageidentifierLANG_NEUTRAL,//DWORDlanguageidentifierformessagebuf,//LPTSTRpointertomessagebuffer127,//DWORDmaximumsizeofmessagebufferNULL);//va_list*Argumentsaddressofarrayofmessageinsertsif(!dwStatus){_snprintf(buf,127," ",hr,hr);}}*ppString=pApp->WSTRFromCString(buf,TRUE);3、IOPCServer::GetGroupByNameHRESULTGetGroupByName([in,string]LPCWSTRszName,[in]REFIIDriid,[out,iid_is(riid)]LPUNKNOWN*ppUnk); 收藏 约请回答 回复楼主 投诉

本文原创来源:电气TV网,欢迎收藏本网址,收藏不迷路哦!

相关阅读

添加新评论