找回密码
 立即注册
首页 业界区 业界 Qt+OPC开发笔记(三):OPC客户端订阅特点消息的Demo ...

Qt+OPC开发笔记(三):OPC客户端订阅特点消息的Demo

炀餮氢 2025-9-24 15:50:21
前言

  本篇介绍opc客户端订阅消息,实现一个opc事件的订阅,当订阅的数据在服务器发生变化是,客户端能立即得到更新。
 Demo

  
1.gif

 OPC客户端

  OPC 客户端是一种利用OPC(OLE for Process Control)协议与 OPC 服务器进行通信的软件应用程序。
功能特点


  • 数据访问:提供一套简单易用的 API,使开发人员能轻松地创建、读取、更新和删除OPC服务器上的数据项,可从传感器、PLC、DCS 系统、过程分析仪等各种数据源获取实时数据。
  • 事件订阅(当前使用):支持实时数据变化订阅,当服务器端的数据发生变化时,客户端能够立即获取到更新,以便及时响应和处理数据变化。
  • 连接管理:负责建立和管理与 OPC 服务器的连接,包括连接的建立、监控连接状态以及在发生异常时进行重连或断开。
  • 数据展示与处理:允许用户创建和管理数据视图,通常以表格或图形的方式展示实时数据流,还能对采集到的数据进行分析、存储、归档等处理,为决策提供支持。
数据访问方式

  OPC 协议支持多种数据访问方式,以满足不同的应用场景需求:

  • 同步访问:客户端发送请求后会一直等待,直到服务器返回响应。这种方式适用于对实时性要求较高的场景,但如果服务器响应时间较长,可能会导致客户端程序阻塞。
  • 异步访问:客户端发送请求后不会等待服务器响应,而是继续执行后续操作。当服务器处理完请求后,会通过回调函数通知客户端。这种方式可以提高客户端程序的效率,避免阻塞。
  • 订阅访问(当前使用):客户端可以订阅特定的数据项,当这些数据项的值发生变化时,服务器会主动将更新后的数据推送给客户端。这种方式适用于需要实时监控数据变化的场景。
订阅服务器某个消息

步骤一:连接服务器

  
2.png

步骤二:创建订阅

  
3.png

  
4.png

步骤三:创建监听项

  
5.png

步骤四:处理回调函数

  这里是通过subId与监控id对应来确定是哪一个变量变化。
  
6.png

步骤五:Qt兼容使用定时器定时调用

  
7.png

 Demo关键源码

创建订阅和监控项

[code]bool OpcClientManager::createSubscriptionResponse(){    /*       OPC UA中的订阅是异步的。也就是说,客户端向服务器发送多个PublishRequest。       服务器返回带有通知的PublishResponses。但只有在生成通知时。客户端不会等待响应,而是继续正常操作。       请注意订阅和受监视项目之间的区别。订阅用于报告通知。       MonitoredItems用于生成通知。每个MonitoredItem只附加到一个订阅。订阅可以包含许多受监视的项目。       客户端在后台自动处理PublishResponses(带回调),并在传输中保留足够的PublishRequests。       ublishResponses可以在同步服务调用期间或在“UA_Client_run_iterate”中接收    */    // 步骤一:创建一个默认的订阅请求对象(有订阅再开放)    _subscriptionRequest = UA_CreateSubscriptionRequest_default();    _subscriptionRequest.requestedPublishingInterval = 1000; // 设置发布间隔为1000毫秒,即每秒发布一次数据    _subscriptionRequest.requestedLifetimeCount = 300;       // 设置生命周期计数为300,即服务器在300个发布周期后会终止该订阅    _subscriptionRequest.requestedMaxKeepAliveCount = 10;    // 设置最大保持活动计数为10,即服务器在10个发布周期内没有数据变化时,仍会发送空的通知以保持连接活跃    _subscriptionRequest.maxNotificationsPerPublish = 0;     // 设置每个发布周期的最大通知数为0,表示不限制通知数量    _subscriptionRequest.publishingEnabled = true;           // 启用发布功能,允许服务器主动推送数据    _subscriptionRequest.priority = 0;                       // 设置订阅的优先级为0,数值越高优先级越高    // 步骤二:设置订阅回复,设置状态改变通知回调和删除订阅回调    _subscriptionResponse = UA_Client_Subscriptions_create(_pUAClient,                                                           _subscriptionRequest,                                                           NULL,                                                           OpcClientManager::statusChangeNotificationCallback,                                                           OpcClientManager::deleteSubscriptionCallback);    if(_subscriptionResponse.responseHeader.serviceResult != UA_STATUSCODE_GOOD)    {        LOG

相关推荐

您需要登录后才可以回帖 登录 | 立即注册