当前位置: 首页 > news >正文

Qt 中 OPC UA 通讯实战

最近在项目中用到了opc ua通讯,主要就是客户的设备状态通过opc ua发布出来,我们通过读取定义好的Tag获取客户设备的实时运行状态,达到和我们自己设备联动的目的。

1.关于库的选择

我用的是qt框架编写的,Qt的OPC UA模块在qt5.11才提供,我用的是qt5.9.4,所以就要另谋出路了。在gpt上找到了open62541这个基于c语言的opc ua开源库,刚好同事也有Demo,就拿来用了,只有open62541.h和open62541.c两个文件,直接加到qt的项目工程即可。

2.open62541的使用

  • 创建客户端
m_client = UA_Client_new();
UA_ClientConfig_setDefault(UA_Client_getConfig(m_client));QByteArray url = "opc.tcp://127.0.0.1:49320";
UA_StatusCode rc = UA_Client_connect(m_client, url.constData());
qDebug() << "connect =" << UA_StatusCode_name(rc);
  • 读取bool量
QByteArray name = "SJPLC.PLPLC.SJC_H5_RUN";
UA_NodeId nid = UA_NODEID_STRING_ALLOC(2, name.constData());UA_Variant val; UA_Variant_init(&val);
UA_StatusCode rc = UA_Client_readValueAttribute(m_client, nid, &val);if(rc == UA_STATUSCODE_GOOD && val.type && val.type->typeIndex == UA_TYPES_BOOLEAN) {bool state = *(UA_Boolean*)val.data;qDebug() << "Value =" << state;
}
UA_NodeId_clear(&nid);
UA_Variant_clear(&val);
  • 断开连接
UA_Client_disconnect(m_client);
UA_Client_delete(m_client);

3.常见问题

  1. BadNodeIdUnknown
    • 原因:NodeId 拼写不一致 / 命名空间索引(ns)错了。
    • 解决:在 UaExpert 找到对应的标签后仔细核对是否出现拼写错误,这个问题困扰了我2个多小时。
  2. BadSessionIdInvalid
    • 原因:会话超时或 SecureChannel 被服务器清掉。
    • 解决:做一个keep-alive功能,隔几秒钟读取一下标签(最省事也是最稳定的方案)

4.保活 (Keep-alive) 机制

OPC UA 和 Modbus 最大的区别之一:

  • Modbus 一问一答即可;
  • OPC UA 有 SecureChannel + Session,需要定期活跃,否则会话被回收。
    解决办法:
  • 定时轻量读:比如每 10~30 秒读一次 ServerStatus.CurrentTime (ns=0;i=2258)。
  • 调用心跳函数:在一些版本里是 UA_Client_runAsync() 或 UA_Client_run_iterate(),定时触发。
  • 订阅场景:必须跑心跳循环,否则收不到推送。
    在这里插入图片描述

文章转载自:

http://ZJjr4476.mpngp.cn
http://SKSuWYJh.mpngp.cn
http://Y9FAh9Cs.mpngp.cn
http://mfNAmumB.mpngp.cn
http://F7hTQeNS.mpngp.cn
http://4WDU0IIn.mpngp.cn
http://E3t6kjNI.mpngp.cn
http://XRLrOx47.mpngp.cn
http://6zF0lqhV.mpngp.cn
http://vWIRu6FR.mpngp.cn
http://LrFwXcCq.mpngp.cn
http://2BbHiba9.mpngp.cn
http://QcvhBPgT.mpngp.cn
http://EZyljhBt.mpngp.cn
http://HYDRNKrn.mpngp.cn
http://Q1vJCHjt.mpngp.cn
http://UowAsPx3.mpngp.cn
http://fGTtb80A.mpngp.cn
http://ZqwPsjOB.mpngp.cn
http://LeaFn9pW.mpngp.cn
http://thBCHjC5.mpngp.cn
http://US9ZVV4Z.mpngp.cn
http://3eIdH6Zl.mpngp.cn
http://xgDGmjlX.mpngp.cn
http://pMqC0fiX.mpngp.cn
http://lmJ1wezT.mpngp.cn
http://6KqHaw9R.mpngp.cn
http://gIFf6qPL.mpngp.cn
http://3k4828dy.mpngp.cn
http://fw9vl8ZQ.mpngp.cn
http://www.dtcms.com/a/385012.html

相关文章:

  • 生产制造数智化
  • ensp配置学习笔记 比赛版 vlan 静态路由 ospf bgp dhcp
  • java-代码随想录第33天|62.不同路径、63.不同路径II
  • 突破限制:FileCodeBox远程文件分享新体验
  • 对讲机模块 TDD 噪音:原理、快速止噪解决方案
  • 知识点11:总线驱动的多Agent调度
  • 使用 Docker 搭建私有 PyPI 镜像仓库:支持多平台二进制包同步
  • HarmonyOS实现快递APP自动识别地址(国际版)
  • IPsec实验笔记
  • 工业IOT平台助力水泥集团实现数字化转型
  • 【CSS】图片自适应等比例缩放
  • Java 21 虚拟线程高并发落地全指南:中间件适配、场景匹配与细节优化的技术实践
  • 设计模式(C++)详解—适配器模式(1)
  • 圆周点生成的数学原理与Python实现
  • 牛客:校门外的树
  • JavaScript数据网格方案AG Grid 34.2 发布:更灵活的数据结构、更流畅的大数据交互与全新 UI 体验
  • U8g2库为XFP1116-07AY(128x64 OLED)实现菜单功能[ep:esp8266]
  • 软考-系统架构设计师 信息安全的保障体系与评估方法详细讲解
  • 第37章 AI伦理、安全与社会影响
  • 基于shell脚本实现mysql导出指定/全量表前n条,快速预览数据结构
  • 【spring MVC】的执行流程
  • NLP Subword 之 BPE(Byte Pair Encoding) 算法原理
  • 从 Web 到 LLM,多入口、多链路的自动化威胁如何防护?
  • Roo Code代码库索引功能
  • 以太网链路聚合实验
  • 机理流程图绘制,如此简单 !
  • 从按钮到接口:权限系统设计的艺术与实践 —— 打造细粒度可扩展的权限架构
  • 3D 打印在道具制作领域的应用调研与轻资产介入策略创意报告
  • Python多进程通信完全指南:打破进程隔离的壁垒
  • webrtc之语音活动下——VAD人声判定原理以及源码详解