昨天又有人问我 OPC Client 编写,实际是他们不了解OPC 客户端的工作原理,要想写客户端程序,必须知道OPC对象, OPC逻辑对象模型包括3类对象:OPC server对象、OPC group对象、OPC item对象,每类对象都包括一系列接口。

OPC Server对象

主要功能为:1、创建和管理OPC Group对象;

2、管理服务器内部的状态信息;

OPC Group对象

主要功能为:1、管理OPC Group对象的内部状态信息;

2、创建和管理Items对象。

3、OPC服务器内部的实时数据存取服务(同步与异步方式)。

OPC组中有以下几个主要属性:Name :组的名字 ;Active:组的激活状态标志 ;Update Rate OPC:服务器向客户程序提交数据变化的刷新速率;Percent Dead band:数据死区,即能引起数据变化的最小数值百分比。

OPC ITEM 是非COM对象,在OPC标准中用来描述实时数据,是客户端不可见的对象。代表了与服务器中的数据的连接,它并不是数据源,而仅仅是与数据源的连接。每个项都有以下主要属性: Active项的激活状态、Value项的数值、类型为VARIANT、Quality项的品质,代表数值的可信度,类型为SHORT、TimeStamp时间戳,代表数据的存取时间。

你不管用什么开发语言只要了解上面几个对象,就会写程序了

下面举个VC的例子

HRESULT  r1;
 CLSID  clsid;
 LONG  TimeBias = 0;
 FLOAT  PercentDeadband = 0.0;
 DWORD  RevisedUpdateRate;
 LPWSTR  ErrorStr;
 char  str[100];
 CString  szErrorText;

m_pItemResult = NULL;

客户端程序必须对DCOM进行初始化设置,以保证OPC服务器端回调函数不会被堵塞。 
 r1 = CoInitialize(NULL);
 if (r1 != S_OK)
 { if (r1 == S_FALSE)
  { MessageBox("COM Library already initialized",
              "Error CoInitialize()", MB_OK+MB_ICONEXCLAMATION);
  }
  else
  { szErrorText.Format("Initialisation of COM Library failed. Error Code= %4x", r1);
   MessageBox(szErrorText,"Error CoInitialize()", MB_OK+MB_ICONERROR);
   SendMessage(WM_CLOSE);
   return;
  }
 }
 
 通过OPC服务器的ProgID查询注册表中相关CLSID。每个COM服务器都有一个字符串型的ProgID,通过ProgID可以得到全球惟一的CLSID,使用CLSIDFromProgID( )函数实现ProgID到CLSID的转换。 r1 = CLSIDFromProgID(L"OPC.SimaticNET", &clsid);
 if (r1 != S_OK)
 { MessageBox("Retrival of CLSID failed",
       "Error CLSIDFromProgID()", MB_OK+MB_ICONERROR);
  CoUninitialize();
  SendMessage(WM_CLOSE);
  return;
 }

连接OPC服务器,查询对象的IID_IOPCServer接口。在连接OPC服务器前,OPC客户端需要事先指定计算机名和OPC数据访问服务器名,建立连接后,创建OPC组并添加OPC数据项。

r1 = CoCreateInstance (clsid, NULL, CLSCTX_LOCAL_SERVER ,IID_IOPCServer, (void**)&m_pIOPCServer);
 if (r1 != S_OK)
 { MessageBox("Creation of IOPCServer-Object failed",
             "Error CoCreateInstance()", MB_OK+MB_ICONERROR);
  m_pIOPCServer = NULL;
  CoUninitialize();
  SendMessage(WM_CLOSE);
  return;
 }

创建OPC组,查询IOPCItemMgt接口。IOPCServer接口的AddGroup()方法可以创建一个有指定名称和属性的OPC组。

r1=m_pIOPCServer->AddGroup(L"grp1",   // [in] group name
      TRUE,     // [in] active
      500,     // [in] request this Update Rate from Server
      1,      // [in] Client handle
      &TimeBias,    // [in] no time interval to system UTC time
      &PercentDeadband,   // [in] no deadband, so all data changes are reported 
      LOCALE_ID,    // [in] Server uses English language for text values
      &m_GrpSrvHandle,  // [out] Server handle to identify this group in later calls
      &RevisedUpdateRate,  // [out] the answer form the Server to the requested update rate
         IID_IOPCItemMgt,  // [in] requested interface type of the group object
      (LPUNKNOWN*)&m_pIOPCItemMgt); // [out] pointer to the requested interface
 
 if (r1 == OPC_S_UNSUPPORTEDRATE)
 { 
  szErrorText.Format ("Revised Update Rate %d is different from Requested Update Rate 500",RevisedUpdateRate );
  AfxMessageBox(szErrorText);
 }
 else
  if (FAILED(r1)){
   MessageBox("Can't add Group to Server!", "Error AddGroup()", MB_OK+MB_ICONERROR);
   m_pIOPCServer->Release();
   m_pIOPCServer = NULL;
   CoUninitialize();
   SendMessage(WM_CLOSE);
   return;
  }
添加OPC数据项。使用IOPCItemMgt接口的AddItem()方法可以添加具有特殊属性的指定数量的数据项。

// define an item table with one item as in-paramter for AddItem
 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 = 0;    
             // defined by the item itself

r1 = m_pIOPCItemMgt->AddItems(1,    // [in] add one item
       m_Items,    // [in] see above
       &m_pItemResult,   // [out] array with additional information about the item
       &m_pErrors);   // [out] tells which of the items was successfully added.
             // For any item which failed it provides a reason

程序退出时

OPC连接断开,释放接口指针。当程序退出或停止服务器时,依次删除Item(RemoveItems)、Group(RemoveGroups),释放资源。

void CAsynOPCDlg::OnStop( ) 停止服务器。
h1=m_IOPCItemMgt->RemoveItems(1,phServer,&pErrors);删除Items。
h1=m_IOPCServer->RemoveGroup(m_GrpSrvHandle,TRUE);删除Group。
m_IOPCServer->Release( );释放服务器。
m_IOPCServer=NULL;
CoUninitialize( );关闭COM库。
转载: http://blog.cechina.cn/zhangfenglu/252638/message.aspx#

关于OPC Client 编写相关推荐

  1. php取FBOX数据,云平台制作(1)-OPC Client取数模块的制作

    近来由于工程需要,基于OPC DA 2.0搭建通用的取数模块,与远程webscoket服务端连接,并传输数据.在网上找了些资料,修改相应网友公开的源代码,基本达到要求,特供大家参考. 1.实体类 us ...

  2. (OPC Client .NET 开发类库)网上很多网友都有提过,.NET开发OPC Client不外乎下面三种方法...

    1. 背景 OPC Data Access 规范是基于COM/DCOM定义的,因此大多数的OPC DA Server和client都是基于C++开发的,因为C++对COM/DCOM有最好的支持.现在, ...

  3. websocket server client 编写

    websocket server client 编写 根据RFC文档编写 网络七层简单介绍 websocket 的好处 传输层 websocket应用层协议 根据RFC文档编写 从网络七层开始,写出一 ...

  4. opc client for php,使用vb/vba作为OPC client

    使用vba/vb做client可以使opc的访问变得简单,以下是基于excel的简单opc client代码: Option Explicit Public WithEvents MyOPCSvr A ...

  5. OPC UA客户端工具Softing OPC Client使用_推荐使用

    OPC UA客户端工具Softing OPC Client使用_推荐使用 Softing OPC Client工具介绍 Softing OPC Client工具是德国Softing公司出品的标准OPC ...

  6. OPC是什么意思?OPC Server 和OPC Client又有什么区别呢?

    自从OPC标准出现之后,很多人都在使用,但是对于一些刚接触的人来说还是比较懵的.本篇文章主要介绍OPC Server 和OPC Client的区别.现在就跟着小编来了解一下文章内容吧~ 说到OPC S ...

  7. opc服务器不稳定的原因,OPC Client和OPC Server容易出现通讯故障,原因是什么?

    OPC Server是一套利用微软的COM/DCOM技术实现工业自动化资料获取的架构.OPC Server提供OPC接口,它将与之相连的物理设备(PLC)的信息值通过接口返回到客户端应用程序.也就是说 ...

  8. Prosys OPC Client连接OPC DA

    Prosys OPC Client连接OPC DA Prosys OPC 客户端将帮助排除 OPC 连接故障并测试 OPC 服务器. 您可以读写数据.浏览服务器以及导出和导入地址空间. OPC 客户端 ...

  9. 分别在MS-DOS和MySQL Command Line Client编写sql语句

    一.MS-DOS编写sql语句 1.打开cmd,启动mysql  net start mysql(关闭 是net stop mysql) 2.到达mysql的安装目录(比如我的安装目录是F盘),登录m ...

最新文章

  1. 取名字_公司起名起名免费建筑公司取名字大全
  2. 深圳.NET俱乐部7月活动小结及照片
  3. BZOJ2738 矩阵乘法 【整体二分 + BIT】
  4. MPEG1 Audio介绍
  5. ftp连接 java.net.ConnectException: Connection refused
  6. Java并发——Synchronized关键字和锁升级,详细分析偏向锁和轻量级锁的升级
  7. C++之std::bind()用法
  8. neoterm如何安装python_NeoTerm官方版v2.1.0下载_NeoTerm(21世纪的终端)下载-刷机之家
  9. Spring AOP(五)之Around增强处理
  10. AC日记——【模板】二分图匹配 洛谷 P3386
  11. easyExcel导出数据并设置单元格下拉数据
  12. 趋势线的拐点突破交易
  13. Protobuf解包组包
  14. 集成百度ORC 识别报 Fatal signal 11 (SIGSEGV) (RenderThread) 错误(已解决)
  15. Graylog Syslog 输入无法在端口 514 上启动问题处理
  16. 虚拟机内存交换学习个人摘录总结
  17. 文献解读|利用Biolog EcoPlates 和PICRUSt2分析后期虾池细菌群落功能多样性
  18. 高一英语计算机课文,人教版高中英语课文(完整版)
  19. mysql 国密_Centos7 编译安装 Openssl 1.1.1 支持国密标准-1002682
  20. Unity-动作系统-案例学习(1)人物移动和转向

热门文章

  1. python - RSA加密
  2. 智能安全加密芯片---ACL16
  3. 预测分子的化学性质和化学反应
  4. DPDK(六):DPDK整体介绍
  5. Caliburn.Micro将枚举 绑定到ComboBox
  6. 分布式计算模式:Stream
  7. 关于mac下搭建php、apache、mysql环境
  8. LiteOS学习(一)任务
  9. 用1:3电流镜恒定GM的输入输出轨到轨运放设计(自用一)
  10. 培养气质的98个好习惯