通讯编程003——带你了解VC开发OPC Client

本文简单介绍VC开发OPC Client的基本过程,阅读之前需要掌握OPC的基本知识。更多通讯资源请登录网信智汇(wangxinzhihui.com)。

根据OPC规范,一个OPC 服务器由三个对象组成:服务器(Server),组(Group),项(Item)。三者之间的关系如下:

    围绕这个模型,OPC Client开发步骤如下:

  1. COM/DCOM 环境初始化
  2. 创建OPCServer对象
  3. 创建OPCGroup对象
  4. 创建OPCItem对象
  5. 获取IO接口
  6. 读写数据
  7. 释放资源
  8. 清除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)。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值