OPC读写Kepware(C++opc同步读写)

”rw“ 是kepserver6.5的OPF文件,需要kepserver6.5及以上版本才能打开OPF文件,打开后如下图。

将各种接口封装成类…
OpcClient.h

#include "opcda.h"
#include "OpcError.h"
#include "iostream"
#include  "opccomn.h"
#define LOCALE_ID 0x409
using namespace std;class OpcClient
{
public:OpcClient();~OpcClient();IOPCServer      *m_IOPCServer;IOPCItemMgt       *m_IOPCItemMgt;IOPCSyncIO       *m_IOPCSyncIO;OPCITEMDEF        m_Items[1];OPCITEMRESULT    *m_ItemResult;OPCHANDLE     m_GrpSrvHandle;HRESULT          *m_pErrors;bool         OpcClientBusy;int connectToServer(LPWSTR ProgID, LPWSTR GrpID);int addItemtoGrp(LPWSTR szItemID, VARTYPE vt_ItemType);int readShort(LPWSTR OPCServerProgID, LPWSTR groupID,LPWSTR szItemID, VARTYPE vt_ItemType);int writeShort(LPWSTR OPCServerProgID, LPWSTR groupID, LPWSTR szItemID, int value);float readFloat(LPWSTR OPCServerProgID, LPWSTR groupID, LPWSTR szItemID, VARTYPE vt_ItemType);int writeFloat(LPWSTR OPCServerProgID, LPWSTR groupID, LPWSTR szItemID, float value);bool readBool(LPWSTR OPCServerProgID, LPWSTR groupID, LPWSTR szItemID, VARTYPE vt_ItemType);int writeBool(LPWSTR OPCServerProgID, LPWSTR groupID, LPWSTR szItemID, bool value);int setBool(LPWSTR OPCServerProgID, LPWSTR groupID, LPWSTR szItemID, VARTYPE vt_ItemType);int resetBool(LPWSTR OPCServerProgID, LPWSTR groupID, LPWSTR szItemID, VARTYPE vt_ItemType);int invertBool(LPWSTR OPCServerProgID, LPWSTR groupID, LPWSTR szItemID, VARTYPE vt_ItemType);int Stop();private:};

OpcClient.cpp

#include "stdafx.h"
#include "OpcClient.h"
int OpcClient::connectToServer(LPWSTR ProgID, LPWSTR GrpID)
{OpcClientBusy = true;HRESULT          r1;CLSID            clsid;LONG          TimeBias = 0;FLOAT         PercentDeadband = 0.0;DWORD            RevisedUpdateRate;//初始化COM库m_ItemResult = NULL;r1 = CoInitialize(NULL);//通过ProgID,查找注册表中的机关CLSIDr1 = CLSIDFromProgID(ProgID, &clsid);if (FAILED(r1)){CoUninitialize();return 1;}//创建 OPC服务对象,并查询对象的IID_IOPCServer接口r1 = CoCreateInstance(clsid, NULL,CLSCTX_LOCAL_SERVER, IID_IOPCServer,(void**)&m_IOPCServer);if (r1 != S_OK){m_IOPCServer = NULL;CoUninitialize();return 2;}//添加一个Group,并查询IOPCItemMgt接口r1 = m_IOPCServer->AddGroup(GrpID,TRUE,500,1,&TimeBias,&PercentDeadband,LOCALE_ID,&m_GrpSrvHandle,&RevisedUpdateRate,IID_IOPCItemMgt,(LPUNKNOWN*)&m_IOPCItemMgt);if (r1 == OPC_S_UNSUPPORTEDRATE){return 3;}else if (FAILED(r1)){m_IOPCServer->Release();m_IOPCServer = NULL;CoUninitialize();return 4;}return 0;
}
int OpcClient::addItemtoGrp(LPWSTR szItemID, VARTYPE vt_ItemType)
{if (OpcClientBusy == false){return 1;}HRESULT r1;//为ADDItem定义item表的参数m_Items[0].szAccessPath = L"";m_Items[0].szItemID = szItemID;m_Items[0].bActive = TRUE;m_Items[0].hClient = 1;m_Items[0].dwBlobSize = 0;m_Items[0].pBlob = NULL;m_Items[0].vtRequestedDataType = vt_ItemType;r1 = m_IOPCItemMgt->AddItems(1,m_Items,&m_ItemResult,&m_pErrors);if (r1 == S_OK){//cout << "ADDItems()成功!" << endl;}if ((r1 != S_OK) && (r1 != S_FALSE)){//cout << "ADDItems失败!!" << endl;m_IOPCItemMgt->Release();m_IOPCItemMgt = NULL;m_GrpSrvHandle = NULL;m_IOPCServer->Release();m_IOPCServer = NULL;CoUninitialize();return 1;}//检测Itemr的可读可写性if (m_ItemResult[0].dwAccessRights != (OPC_READABLE + OPC_WRITEABLE)){return 2;}else{//}//查询group对象的同步接口r1 = m_IOPCItemMgt->QueryInterface(IID_IOPCSyncIO, (void**)&m_IOPCSyncIO);if (r1<0){CoTaskMemFree(m_ItemResult);m_IOPCItemMgt->Release();m_IOPCItemMgt = NULL;m_GrpSrvHandle = NULL;m_IOPCServer->Release();m_IOPCServer = NULL;CoUninitialize();return 3;}return 0;
}
int OpcClient::readShort(LPWSTR OPCServerProgID, LPWSTR groupID, LPWSTR szItemID, VARTYPE vt_ItemType)
{OpcClient::connectToServer(OPCServerProgID, groupID);OpcClient::addItemtoGrp(szItemID, vt_ItemType);OPCHANDLE      *phServer;OPCITEMSTATE  *pItemValue;HRESULT         *pErrors;HRESULT            r1 = E_FAIL;if (m_pErrors[0] != S_OK){return 32767;}//内存分配phServer = new OPCHANDLE[1];phServer[0] = m_ItemResult[0].hServer;r1 = m_IOPCSyncIO->Read(OPC_DS_DEVICE, 1, phServer, &pItemValue, &pErrors);//释放内存delete[]phServer;if (r1 == S_OK){//}else{Stop();return 32767;}Stop();return pItemValue[0].vDataValue.intVal;
}
int OpcClient::writeShort(LPWSTR OPCServerProgID, LPWSTR groupID, LPWSTR szItemID, int value)
{OpcClient::connectToServer(OPCServerProgID, groupID);OpcClient::addItemtoGrp(szItemID, VT_I2);OPCHANDLE *phServer;HRESULT *pErrors;VARIANT values[1];HRESULT r1;LPWSTR ErrorStr;if (m_pErrors[0] != S_OK){Stop();return 1;}phServer = new OPCHANDLE[1];phServer[0] = m_ItemResult[0].hServer;values[0].vt = VT_I2;values[0].intVal = value;r1 = m_IOPCSyncIO->Write(1, phServer, values, &pErrors);delete[]phServer;Stop();return 0;
}
float OpcClient::readFloat(LPWSTR OPCServerProgID, LPWSTR groupID, LPWSTR szItemID, VARTYPE vt_ItemType)
{OpcClient::connectToServer(OPCServerProgID, groupID);OpcClient::addItemtoGrp(szItemID, vt_ItemType);OPCHANDLE      *phServer;OPCITEMSTATE  *pItemValue;HRESULT         *pErrors;HRESULT            r1 = E_FAIL;if (m_pErrors[0] != S_OK){return 32767;}//内存分配phServer = new OPCHANDLE[1];phServer[0] = m_ItemResult[0].hServer;r1 = m_IOPCSyncIO->Read(OPC_DS_DEVICE, 1, phServer, &pItemValue, &pErrors);//释放内存delete[]phServer;if (r1 == S_OK){//}Stop();return pItemValue[0].vDataValue.fltVal;
}
int OpcClient::writeFloat(LPWSTR OPCServerProgID, LPWSTR groupID, LPWSTR szItemID, float value)
{OpcClient::connectToServer(OPCServerProgID, groupID);OpcClient::addItemtoGrp(szItemID, VT_R4);OPCHANDLE *phServer;HRESULT *pErrors;VARIANT values[1];HRESULT r1;LPWSTR ErrorStr;if (m_pErrors[0] != S_OK){return;}phServer = new OPCHANDLE[1];phServer[0] = m_ItemResult[0].hServer;//UpdateData(TRUE); values[0].vt = VT_R4;values[0].fltVal = value;r1 = m_IOPCSyncIO->Write(1, phServer, values, &pErrors);delete[]phServer;Stop();return 0;
}
bool OpcClient::readBool(LPWSTR OPCServerProgID, LPWSTR groupID, LPWSTR szItemID, VARTYPE vt_ItemType)
{OpcClient::connectToServer(OPCServerProgID, groupID);OpcClient::addItemtoGrp(szItemID, vt_ItemType);OPCHANDLE      *phServer;OPCITEMSTATE  *pItemValue;HRESULT         *pErrors;HRESULT            r1 = E_FAIL;if (m_pErrors[0] != S_OK){return 32767;}phServer = new OPCHANDLE[1];phServer[0] = m_ItemResult[0].hServer;r1 = m_IOPCSyncIO->Read(OPC_DS_DEVICE, 1, phServer, &pItemValue, &pErrors);//释放内存delete[]phServer;if (r1 == S_OK){//}Stop();if (pItemValue[0].vDataValue.boolVal==-1){return true;}else{return false;}
}
int OpcClient::writeBool(LPWSTR OPCServerProgID, LPWSTR groupID, LPWSTR szItemID, bool value)
{OpcClient::connectToServer(OPCServerProgID, groupID);OpcClient::addItemtoGrp(szItemID, VT_R4);OPCHANDLE *phServer;HRESULT *pErrors;VARIANT values[1];HRESULT r1;LPWSTR ErrorStr;if (m_pErrors[0] != S_OK){return;}phServer = new OPCHANDLE[1];phServer[0] = m_ItemResult[0].hServer;values[0].vt = VT_R4;values[0].boolVal = value;r1 = m_IOPCSyncIO->Write(1, phServer, values, &pErrors);delete[]phServer;Stop();return 0;
}int OpcClient::setBool(LPWSTR OPCServerProgID, LPWSTR groupID, LPWSTR szItemID, VARTYPE vt_ItemType)
{writeBool(OPCServerProgID, groupID, szItemID, true);if (readBool(OPCServerProgID, groupID, szItemID, VT_BOOL)){return 0;}else{return 1;}
}
int OpcClient::resetBool(LPWSTR OPCServerProgID, LPWSTR groupID, LPWSTR szItemID, VARTYPE vt_ItemType)
{writeBool(OPCServerProgID, groupID, szItemID, false);if (readBool(OPCServerProgID, groupID, szItemID, VT_BOOL)){return 0;}else{return 1;}
}
int OpcClient::invertBool(LPWSTR OPCServerProgID, LPWSTR groupID, LPWSTR szItemID, VARTYPE vt_ItemType)
{if (readBool(OPCServerProgID, groupID, szItemID, VT_BOOL) == false){writeBool(OPCServerProgID, groupID, szItemID, true);return 0;}if (readBool(OPCServerProgID, groupID, szItemID, VT_BOOL) == true){writeBool(OPCServerProgID, groupID, szItemID, false);return 0;}
}int OpcClient::Stop()
{if (OpcClientBusy == false){return 1;}HRESULT r1;OPCHANDLE *phServer;HRESULT *pErrors;phServer = new OPCHANDLE[1];phServer[0] = m_ItemResult[0].hServer;r1 = m_IOPCItemMgt->RemoveItems(0,phServer,&pErrors);delete[]phServer;CoTaskMemFree(pErrors);CoTaskMemFree(m_ItemResult);m_ItemResult = NULL;m_IOPCSyncIO->Release();m_IOPCSyncIO = NULL;m_IOPCItemMgt->Release();m_IOPCItemMgt = NULL;r1 = m_IOPCServer->RemoveGroup(m_GrpSrvHandle, true);m_GrpSrvHandle = NULL;m_IOPCServer->Release();m_IOPCServer = NULL;CoUninitialize();OpcClientBusy = false;return 0;
}OpcClient::OpcClient()
{OpcClientBusy = false;//初始化为false
}OpcClient::~OpcClient()
{//
}

mian函数

// OpcClient.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"
#include "OpcClient.h"
using namespace std;OpcClient ObjKepOpc;
int _tmain(int argc, _TCHAR *argv[])
{const LPWSTR OPCServerProgID = L"Kepware.KEPServerEX.V6";//服务器ProIDconst LPWSTR groupID = L"King.Win7";//GroupID,通道.设备const LPWSTR ritem_1 = L"King.Win7.Tag_1";//item格式,通道.设备.itemconst LPWSTR ritem_2 = L"King.Win7.Tag_2";//item格式,通道.设备.itemconst LPWSTR witem_1 = L"King.Win7.Tag_1_write";//item格式,通道.设备.itemconst LPWSTR witem_2 = L"King.Win7.Tag_2_write";//item格式,通道.设备.itemObjKepOpc.connectToServer(OPCServerProgID, groupID);while(1){//读float r1 = ObjKepOpc.readFloat(OPCServerProgID, groupID,ritem_1, VT_R4);float r2 = ObjKepOpc.readFloat(OPCServerProgID, groupID,ritem_2, VT_R4);cout<< r1 <<endl;cout<< r2 <<endl;//写ObjKepOpc.writeFloat(OPCServerProgID, groupID,witem_1,r1);ObjKepOpc.writeFloat(OPCServerProgID, groupID,witem_2,r2);}return 0;
}

完整项目:
https://download.csdn.net/download/weixin_37928884/86881385

OPC读写Kepware(C++)相关推荐

  1. kepware rest服务器_工业过程数据OPC通讯服务器 kepware kepserver ex 4.5含授权

    工业过程数据OPC通讯服务器 kepware kepserver ex 4.5含授权 软件简介: KEPServerEX V5是kepware通信技术的下一代产品,历经了十多年的发展,在结构和功能上都 ...

  2. 万物互联----聊聊OPC服务器KepWare

    在这篇文章中我主要和大家聊一聊实现万物互联的服务器软件KepWare所支持的强大功能,以及工业数采的一种比较常用的实现方案"软网关"的基本原理,另外我也会重点讲解一下KepWare ...

  3. OPC通讯开发简介——基于WTOPCSVR的OPC服务器端和基于WTCLIENT的OPC客户端开发

    OPC通讯开发简介--基于WTOPCSVR的OPC服务器端和基于WTCLIENT的OPC客户端开发 说明 一.OPC技术背景及介绍 二.OPC通讯的流程(OPC经典架构) 三.OPC标准官方文件部分变 ...

  4. Modbus和OPC协议

    Modbus Modbus是有Modicon(施耐德电器公司的一个品牌)在1979年发明的一种工业控制总线协议,是全球第一个真正用于工业现场的总线协议. Modbus协议包括Modbus-RTU,AS ...

  5. opc-da协议机器数据采集-python

    基于python的opc-da协议数据采集 一.前言 二.环境 三.openopc安装 四.安装pip包 五.使用教程 六.总结 一.前言 公司项目涉及到德国产的卡尔迈耶系列的机器数据采集,因此研究了 ...

  6. DGIOT国内首家轻量级物联网开源平台——dgiot-dtu实现PLC数据采集上云实时查看

    [小 迪 导读]:在工业控制系统中,经常会用到PLC设备.对于PLC数据上云和存储,用户担心数据的泄露和安全性希望可以部署私有云达到自己的需求. dgiot方案 其他方案 使用dgiot-dtu软件作 ...

  7. 兴达易控CHNet-S7300MD西门子200/300/400PLCmpi转以太网处理器

    品牌:Endaic 型号:CHNet-S7300MD 产品简介 CHNetS7-S7300MD用于西门子S7-200/SMART S7-200/S7-300/S7-400/西门子数控840D.840D ...

  8. CHNet-S7200PDPB西门子S7200PLCppi转以太网处理器

    品牌:Endaic兴达易控        型 号:CHNet-S7200PD&PB 产品简介 CHNet-S7200用于西门子S7-200/SMART S7-200PLC的以太网数据采集,非常 ...

  9. 兴达易控CHNet-S7200PDPB西门子S7200PLCppi转以太网处理器

    品牌:Endaic兴达易控 型号:CHNet-S7200PD&PB 产品简介 CHNet-S7200用于西门子S7-200/SMART S7-200PLC的以太网数据采集,非常方便构建生产管理 ...

最新文章

  1. Google 超分辨率技术 RAISR:模糊图片瞬间变清晰,运算速度快十倍
  2. Mysql 时间类型整理
  3. linux shell编程文本处理命令grep
  4. Unity 中从3D到Universal RP配置方法
  5. 板级电源究竟该怎么选型芯片?(实战篇)
  6. word 插入图片偏右问题
  7. DeepFaceLab:视频中有多人,仅替换特定人脸的方法!
  8. Python-Level2-day11:TCP客户端/服务端传输(循环模型之短连接与长连接形态);TCP粘包问题;与UDP对比;数据传输过程原理;
  9. 常用测速网站及工具(IPv4/IPv6)
  10. hive打patch流程说明
  11. js判断是否微信登陆
  12. BBR:Congestion-Based Congestion Control解读
  13. ant pro-table点击表格行高亮显示
  14. 跨域问题No ‘Access-Control-Allow-Origin‘ header is present on the requested resource.
  15. [转]Typora中使用Latex符号——基本操作
  16. mysql默认存储引擎_MySQL5.5 所支持的存储引擎
  17. Ubuntu18.04 实现串口通信
  18. Bailian4005 拼点游戏【贪心】
  19. Mapper的XML文件(一)
  20. 为什么神经网络层数越多越好?训练次数与层数的区别与联系

热门文章

  1. 蓝桥杯python组——平行四边形面积
  2. 《学习如何学习》Week1 3.4 名人采访3: 如何写作?
  3. LAN: Lightweight Attention-based Network for RAW-to-RGB Smartphone Image Processing LAN:用于 RAW 到 RGB
  4. php field as key,php – $_POST as $key =gt; $value使用复选框
  5. 论文:Aurora Guard_ Real-Time Face Anti-Spoofing via Light Reflection
  6. Jmeter分布式配置总结
  7. 西南财经大学跨考计算机,我的跨考会计经历-给2011年朋友的一点建议
  8. 细胞实验关键:活死细菌/细胞染色试剂盒解决方案
  9. Android代码报错:setContentView(R.layout.activity_main)
  10. 从零开始学Excel VBA