没有合适的资源?快使用搜索试试~ 我知道了~
首页opc server概述
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/1802261/bg1.jpg)
如何开发 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]
在
这
些
接
口
中 ,
I
O
P
C
Server 是 OPC Server 的主接口,通过它实现 OPC Server 在操作系统中的安装和注册。此接
口是必须要实现的,其所有方法也必须实现。其它的接口都是可选的我们就不做介绍了,
下面主要来介绍如何实现 IOPCServer 接口。
![](https://csdnimg.cn/release/download_crawler_static/1802261/bg2.jpg)
在 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; i<pSvrObject->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 的错误代码返回相应的错误字符串。
代码略
![](https://csdnimg.cn/release/download_crawler_static/1802261/bg3.jpg)
3、 IOPCServer::GetGroupByName
HRESULT GetGroupByName( [in, string] LPCWSTR szName,
[in] REFIID riid,
[out, iid_is(riid)] LPUNKNOWN * ppUnk );
通过指定的组名(由同一客户端建立的)找到该组的接口指针。
此方法实现比较简单,只要根据提供的名子循环从组列表中找到该组的接口指针,并
返回给客户端
4、 IOPCServer::GetStatus
HRESULT GetStatus( [out] OPCSERVERSTATUS ** ppServerStatus );
返回当前 Server 的状态信息。
此方法比较简单,但要注意的是在使用 OPCSERVERSTAUS 前要进行内存分配。
5、 IOPCServer::RemoveGroup
HRESULT RemoveGroup( [in] OPCHANDLE hServerGroup,
[in] BOOL bForce );
从服务器中删除指定组
在组列表中找到指定的组,并将其删除。
6、 IOPCServer::CreateGroupEnumerator
HRESULT CreateGroupEnumerator( [in] OPCENUMSCOPE dwScope,
[in] REFIID riid,
[out, iid_is(riid)] LPUNKNOWN* ppUnk );
为 Server 上所提供的组建立不同的列举器。
上面是直接使用 COM 技术进行开发的,这要求你必须熟悉 COM 技术。如果你对
COM 不是很了解那也没关系,可以选择 OPC Server 的开发工具,你只需要简单的调用开
发工具的函数就可以实现 OPC Server 中的所有接口。
我们虽然实现了 IOPCServer 接口中的所有方法,但它只是 OPC Client 与我们通信的一
个桥梁,最主要的还是我们要自己维护好 OPC Group 和 OPC Item 列表。这样我们才可以
跟 OPC Client 进行真正的数据通信。
与硬件设备进行通信
接口已经实现好了,这回我们该从硬件设备中读取数据提供给 OPC Client 了。
同硬件设备通信有多种方法,如果你是设备的制造商就可以直对硬件进行数据操作了;你
也可以通过设备驱动程序和硬件厂商提供的 API 或是通过 TCP、串口等方法进行操作,这就
要看硬件设备提供的与软件通信的接口是什么样的了。
不管你用什么方法只要把数据从硬件设备中读取上来并与 OPC 项进行关联,就可以实
现 OPC Server 了。
下面我们为清华同方的 RH2000 系统来做一个 OPC Server(如图 2)。
剩余12页未读,继续阅读
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
zhangbin_115
- 粉丝: 1
- 资源: 3
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- 电力电子系统建模与控制入门
- SQL数据库基础入门:发展历程与关键概念
- DC/DC变换器动态建模与控制方法解析
- 市***专有云IaaS服务:云主机与数据库解决方案
- 紫鸟数据魔方:跨境电商选品神器,助力爆款打造
- 电力电子技术:DC-DC变换器动态模型与控制
- 视觉与实用并重:跨境电商产品开发的六重价值策略
- VB.NET三层架构下的数据库应用程序开发
- 跨境电商产品开发:关键词策略与用户痛点挖掘
- VC-MFC数据库编程技巧与实现
- 亚马逊新品开发策略:选品与市场研究
- 数据库基础知识:从数据到Visual FoxPro应用
- 计算机专业实习经验与项目总结
- Sparkle家族轻量级加密与哈希:提升IoT设备数据安全性
- SQL数据库期末考试精选题与答案解析
- H3C规模数据融合:技术探讨与应用案例解析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)