2013-09-02 17:01:44| 分类: window其它 | 标签:opc客户端 opc开发 |举报 |字号 订阅
OPC开发过程:
1.注册OPC接口组件
2.通过COM接口创建OPCServerList的接口指针
CoCreateInstance只能遍历本机,CoCreateInstanceEx可遍历远程机器OPC
CLSID_OPCServerList={0x13486D51, 0x4821, 0x11D2, { 0xA4, 0x94, 0x3C, 0xB3, 0x06, 0xC1, 0x00, 0x00 } };
IOPCServerList *pIOPCServerList = NULL;
CoCreateInstance(CLSID_OPCServerList, NULL, CLSCTX_SERVER, IID_IOPCServerList, (void **)&pIOPCServerList);
3.枚举OPC服务列表
通过IOPCServerList接口EnumClassesOfCategories方法,示例:
unsigned long c;
IEnumGUID *pIEnumGUID;
CLSID catid = CATID_OPCDAServer20;
pIOPCServerList->EnumClassesOfCategories(1, &catid, 1, &catid, &pIEnumGUID);
while(S_OK == pIEnumGUID->Next(1, &clsid, &c))
{
char buf1[256]={0}, buf2[256]={0};
LPOLESTR progID, pOPCName;
pIOPCServerList->GetClassDetails(clsid, &progID, &pOPCName);
WideCharToMultiByte(CP_ACP, 0, progID, -1, buf1, 256, NULL, NULL);
WideCharToMultiByte(CP_ACP, 0, pOPCName, -1, buf2, 256, NULL, NULL);
printf("OPC服务器: %s, %s\n", buf1, buf2);
}
3.连接OPC服务器
通过progID获取OPC服务器CLSID,利用CLSIDFromProgID()函数。
CoCreateInstanceEx启动远程OPC服务器,COSERVERINFO结构中的远程主机名称填IP和计算机全名称都可以,代码示例:
COSERVERINFO tCoServerInfo;
MULTI_QI m_arrMultiQI; // array of interfaces we will query for each server
m_arrMultiQI.pIID = &IID_IOPCServer;
IOPCServer *m_pIServer;
CoCreateInstanceEx (
clsid, // CLSID
NULL, // No aggregation
CLSCTX_REMOTE_SERVER, // connect to remote servers
&tCoServerInfo, // remote machine name
sizeof (m_arrMultiQI) / sizeof (MULTI_QI), // number of IIDS to query
&m_arrMultiQI);
m_pIServer = (IOPCServer *)m_arrMultiQI.pItf;
4.断开OPC服务器连接
调用COM组件的Release接口,示例代码:
m_pIServer->Release();
5.遍历指定OPC服务上的Group
连接上指定OPC服务器后,可取得服务器状态,调用GetStatus(),结果存放在OPCSERVERSTATUS结构中。
遍历GROUP:
a.通过IOPCServer接口的CreateGroupEnumerator()创建IEnumUnknown以Group对象方式遍历Group,通过IEnumUnknown获取Group存取对像接口IOPCGroupStateMgt,
调用GetState返回此Group信息,示例代码:
IEnumUnknown *pEnum = NULL;
hr = m_pIServer->CreateGroupEnumerator (
eScope, IID_IEnumUnknown, (IUnknown**)&pEnum);
IUnknown *pIUnknown;
ULONG uFetched;
IOPCGroupStateMgt *pIGroupStateMgt = NULL;
// Loop over enumerated groups (call enemerator's next member to
// reference next group and return its IUnknown interface):
while ((hr = pEnum->Next (1, &pIUnknown, &uFetched)) == S_OK)
{
// Get group state management interface of current group:
hr = pIUnknown->QueryInterface (IID_IOPCGroupStateMgt, (void**)&pIGroupStateMgt);
// Declare some variable needed to get the group name
// from the server:
OPCHANDLE hClient;
OPCHANDLE hServer;
WCHAR *pszName;
// Get group state (we are only interested in the group name):
hr = pIGroupStateMgt->GetState (
&m_dwUpdateRate,
&m_bActive,
&pszName,
&m_lBias,
&m_fDeadband,
&m_dwLanguageID,
&hClient,
&hServer);
}
b.通过IOPCServer接口的CreateGroupEnumerator()创建IEnumString以Group名方式遍历Group,示例代码:
IEnumString *pEnum = NULL;
hr = m_pIServer->CreateGroupEnumerator (
eScope, IID_IEnumString, (IUnknown**)&pEnum);
LPOLESTR pGroupName;
ULONG uFetched;
// Loop over enumerated groups (call enemerator's next member to
// reference next group and return its name string):
while ((hr = pEnum->Next (1, &pGroupName, &uFetched)) == S_OK)
{
}
6.遍历服务器Item项
通过OPCServer获取IOPCBrowseServerAddressSpace接口,调用BrowseOPCItemIDs方法,示例代码:
IOPCBrowseServerAddressSpace *pIOPCBrowseServerAddressSpace=NULL;
pIOPCServer->QueryInterface(IID_IOPCBrowseServerAddressSpace, (void **)&pIOPCBrowseServerAddressSpace);
LPENUMSTRING pPENUMSTRING;
hr = pIOPCBrowseServerAddressSpace->BrowseOPCItemIDs(OPC_BRANCH, L"", VT_EMPTY, 0, &pPENUMSTRING);
IOPCItemProperties *pIOPCItemProperties=NULL;
pIOPCServer->QueryInterface(IID_IOPCItemProperties, (void **)&pIOPCItemProperties);
ULONG count=0;
LPOLESTR pItemName, pItemID;
while(pPENUMSTRING->Next(1, &pItemName, &count) == S_OK)
{
char bufName[256]={0};
WideCharToMultiByte(CP_ACP, 0, pItemName, -1, bufName, 256, NULL, NULL);
printf("ITEM_NAME: %s\n", bufName);
pIOPCBrowseServerAddressSpace->GetItemID(pItemName, &pItemID);
WideCharToMultiByte(CP_ACP, 0, pItemID, -1, bufName, 256, NULL, NULL);
printf("ITEM_ID: %s\n", bufName);
DWORD dwCount;
DWORD *dwPropertyIDs;
LPWSTR *ppDescriptions;
VARTYPE *ppvtDataTypes;
VARIANT *ppvData;
HRESULT *ppErrors;
pIOPCItemProperties->QueryAvailableProperties(pItemID, &dwCount, &dwPropertyIDs, &ppDescriptions, &ppvtDataTypes);
pIOPCItemProperties->GetItemProperties(pItemID, dwCount, dwPropertyIDs, &ppvData, &ppErrors);
}
7.数据项ITEM读取
通过组Group取得ITEM项存取接口(IOPCSyncIO,IID_IOPCAsyncIO等),调用Write和Read方法。
8.总结
逻辑过程:
连接OPC服务器->得到服务器数据项->建立自定义组->将需要的服务器数据项加入到组中->取得项的存取接口->读写数据
OPC客户端开发过程整理相关推荐
- opc客户端_组态王作为OPC服务器的使用介绍,欢迎读者阅读
组态王在原有的OPC客户端的基础上添加了OPC服务器的功能,实现了组态王对OPC的服务器和客户端的统一.通过组态王OPC服务器功能,用户可以更方便的实现其他支持OPC客户的应用程序与组态王之间的数据通 ...
- 用Delphi开发OPC客户端工具的方法研究
用Delphi开发OPC客户端工具的方法研究[1]<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:o ...
- PC软件开发技术之二:用C#开发基于自动化接口的OPC客户端
OPC全称是Object Linking and Embedding(OLE) for Process Control,它的出现为基于Windows的应用程序和现场过程控制应用建立了桥梁.OPC作为一 ...
- opc客户端_OPC UA 预备知识 OPC 核心概念
OPC UA 是OPC协议的升级版,在学习OPC UA协议之前,先掌握OPC的核心概念,对理解OPC UA有很大好处. OPC是OLE for Process Control的缩写,即应用于过程控制的 ...
- C#开发OPC客户端
背景:做一个系统要对接OPC,所以要学习一下OPC客户端的开发. 解决:OPC实际上是为了给工业控制系统应用程序之间提供一种接口规范.作为使用最多的对接技术,OPC具有它的优势,硬件供应商只需提供符合 ...
- opc客户端读取数据品质是bad_听说看了这篇文章就彻底搞懂了什么是OPC(上)
从2000年初以来,我们就一直在使用OPC软件互操作性标准,而那些正准备踏入和想要踏入工业自动化领域的人们却对这些含义感到困惑. 所以在本中,我将系统地为你梳理OPC知识. OPC首字母缩写词代表什么 ...
- opcclient源码OPC客户端DA源码(c#开发)
opcclient源码OPC客户端DA源码(c#开发) 内容: C#开发,源码,可二次开发. 本项目为VS2010开发,可转换为VS其他版本的编辑器打开项目. 已应用到多个行业的几百个应用现场,长时间 ...
- OPC通讯开发简介——基于WTOPCSVR的OPC服务器端和基于WTCLIENT的OPC客户端开发
OPC通讯开发简介--基于WTOPCSVR的OPC服务器端和基于WTCLIENT的OPC客户端开发 说明 一.OPC技术背景及介绍 二.OPC通讯的流程(OPC经典架构) 三.OPC标准官方文件部分变 ...
- WINCC监控,Excel的OPC客户端(wincc测试)wincc的opc通讯
WINCC监控,Excel的OPC客户端(wincc测试)wincc的opc通讯 ID:6988638466181800
最新文章
- Servlet3.0 Test
- 基于Android平台的多分辨率解决方案[图]
- 每天学点linux之-rmdir,cp,mv
- 寄存器地址和内存地址_3. 从0开始学ARMARM模式、寄存器、流水线
- 在线解压rar_解压指南!新手必看
- 在Java下连接SQLite数据库
- java 按钮垂直居中_WPF按钮中的文本内容未垂直居中
- python whl文件下载网址
- 小程序发布文章-微信小程序视频教程28
- 2021年PMP考试模拟题2(含答案)
- Maven打包war报错
- NISP管理中心|NISP二级证书介绍
- 运维必备——Zabbix监控系统
- CAD中插入外部参照字体会变繁体_知道这些技巧-轻松攻克CAD所有困难
- Bochs的初步使用
- 《华为机试》刷题之HJ84 统计大写字母个数
- 非常优秀的网站设计案例,设计师必备
- 并查集——奇偶性(Parity)
- 关于笔记本无线驱动的问题
- python爬虫(爬取图片)
热门文章
- 保持健康,身体是本钱!
- 方便快捷的LCR自动测试系统到底怎么用?
- 情迁QQ机器人已具备图片发送能力
- Day 20: Sorting
- Netfilter简介
- 软件测试黑盒代码,打开测试黑盒,从代码角度编写测试用例!
- 大领导在酒桌上当着小领导面数落我什么意思?四个招数不得不服
- Ubuntu给AndroidStudio软件添加桌面快捷方式图标
- lc0422lc0423
- 安川机器人之MotoPlus编程