本文简单介绍VC开发OPC Client的基本过程,阅读之前需要掌握OPC的基本知识。更多通讯资源请登录网信智汇(wangxinzhihui.com)。
根据OPC规范,一个OPC 服务器由三个对象组成:服务器(Server),组(Group),项(Item)。三者之间的关系如下:
围绕这个模型,OPC Client开发步骤如下:
- COM/DCOM 环境初始化
- 创建OPCServer对象
- 创建OPCGroup对象
- 创建OPCItem对象
- 获取IO接口
- 读写数据
- 释放资源
- 清除COM/DCOM 环境
下面按照以上开发步骤展开阐述。
1. 添加OPC相关文件:
opccomn_i.c ,opccomn.h, opcda.h, opcda_i.c, opcerror.h
2. COM/DCOM 环境初始化
CoInitialize(NULL)
3. 创建OPCServer对象
//根据clsid获取ProgId
CLSIDFromProgID( Server.AllocSysString(), &clsid );
//创建OPC服务器对象
LPUNKNOWN pUnkn = NULL;
hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IOPCServer, (void**)&m_IOPCServer);
4. 创建OPCGroup对象
//添加组到OPCServer对象
FLOAT PercentDeadband = 0.0;
DWORD RevisedUpdateRate;
hr = m_IOPCServer->AddGroup(
L"opcgroup", //组名
TRUE, //活动状态
500, //向服务器发送请求的刷新率
clientHandle, //客户端的操作句柄
NULL, //与标准时间的校正值
&PercentDeadband, //死区值
0, //服务器使用的语言
&m_GrpSrvHandle, //返回的组句柄
&RevisedUpdateRate, //服务器的数据刷新率
IID_IOPCItemMgt, //添加组的接口类型
(LPUNKNOWN*)&m_IOPCItemMgt); //服务器返回的接口对象指针
5. 创建OPCItem对象
//构造Item
Item* pcItem ;
OPCITEMDEF *m_Items = new OPCITEMDEF[count];
for(int i = 0; i < count; i++)
{
pcItem = new Item;
pcItem->quality = QUAL_BAD;
pcItem->name = _T("itemname");
m_Items[i].szItemID = pcItem->name.AllocSysString();
m_Items[i].dwBlobSize = 0;
m_Items[i].pBlob = NULL;
m_Items[i].bActive = TRUE;
m_Items[i].hClient = (OPCHANDLE)pcItem;
m_Items[i].szAccessPath = pcItem->cAccessPath.AllocSysString();;
m_Items[i].vtRequestedDataType = VT_EMPTY;
}
//添加Items到OPCGroup对象
OPCITEMRESULT *pOPCResults = NULL;
HRESULT *pOPCErrors = NULL;
hr = m_IOPCItemMgt->AddItems(COUNT, m_Items, &pOPCResults,
&pOPCErrors);
//保存item对应的服务句柄
pdwServerHandles = new DWORD[count];
for(i = 0; i < count; i++)
{
if(pOPCErrors[i]= S_OK)
{
pdwServerHandles[i] = pOPCResults[i].hServer;
}
}
6. 获取IO接口
获取同步IO接口
m_IOPCItemMgt->QueryInterface(IID_IOPCSyncIO, (void**)&m_IOPCSyncIO);
7. 读数据
m_IOPCSyncIO->Read(
dwSource, // OPC_DS_CACHE, Source (device or cache)
count, // Item count
(OPCHANDLE*) pdwServerHandles,
pValues,
&pErrors);
8. 释放资源
m_IOPCServer->Release();
m_IOPCServer=NULL;
9. 清除COM/DCOM 环境
CoUninitialize();
更多通讯资源请登录网信智汇(wangxinzhihui.com)。