- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
如何开发OPC Server
如何开发OPC Server
首先我们先来看一下什么是OPC
???????OPC (OLE for Process Control——用于过程控制的OLE)是基于Microsoft公司的DNA(Distributed Internet Application)构架和COM(Component Object Model)技术的一个工业标准接口,是根据易于扩展性而设计的。
?
再来了解一下OPC的用途
OPC主要适用于过程控制和制造自动化等应用领域。?OPC是以OLE/COM机制作为应用程序的通讯标准。OLE/COM是一种客户/服务器模式,具有语言无关性、代码重用性、易于集成性等优点。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)
{
??????????????RequestedName = szName;
??????????????if (RequestedName == )
?????????????????????RequestedName = pSvrObject-DefaultGroupName();
???????}
???????else
??????????????RequestedName = pSvrObject-DefaultGroupName();
??????
???????for (i=0; ipSvrObject-NumbrGroups(); i++)
???????{
??????????????pGroup = pSvrObject-GetGroup(i);
??????????????if (RequestedName == pGroup-Name)
?????????????????????return (OPC_E_DUPLICATENAME);
???????}
???????这需要在内存中维护OPC Group(组)的列表(还要有OPC?项的列表)。
???????如果szName(组名)正确并且没有建立过该组,就开始根据传过来的参数进行组的建立,建立好后将该组加到自己的组列表中以备后用。
??????????????最后将新建组的接口指针返回给客户端。
?????
?
2、IOPCServer::GetErrorString
HRESULT GetErrorString( [in] HRESULT dwError,
[in] LCID dwLocale,
[out, string] LPWSTR *ppString );
???????为Server的错误代码返回相应的错误字符串。
?????? 代码略
3、?IOPCServer::GetGroupByName
HRESULT GetGroupByName( [in, string] LPCWSTR szName,
[in] REFIID riid,
[out, iid_is(riid)] LPUNKNOWN * ppUnk );
通过指
文档评论(0)