1.OPC_UA服务器准备工作

1.关于OPC_UA服务器的搭建可以参考前面一篇文章:https://blog.csdn.net/xipengbozai/article/details/115080901

2.搭建好OPC_UA服务器后就可以可是设置服务器通信变量

(1)打开KEPServerEX 6 Configuration,新建通道,选择Simulator。

(2)起名字,然后一步一步完成。

(3)给通道添加设备,设备名plc,一步一步直到完成。

设备节点通信时候要用

(4)创建标记组

(5)新建标记,取名x1,地址输入x1,数据类型选择布尔型,客户端访问方式为写

(6)重复5的操作新建4个标记

2.使用客户端测试通信

1.使用Quick Client创建两个客户端

2.创建的客户端如下图,可以看到四个标记分别为x1,x2,y1,y2

3.我们从一个客户端改变变量的值,然后从另一个客户端观察如下图,可以看到值改变了,所以同通信成功。

3.QT客户端程序编写

1.下载open62541的OPC库,下载地址:https://download.csdn.net/download/xipengbozai/16042848,读者也可以去GitHub下载,然后自己编译。

2.过工程的pro文件如下

  1. QT += core gui
  2. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
  3. TARGET = OPCUA_example

  4. TEMPLATE = app

  5. QMAKE_CFLAGS += -std=c99

  6. LIBS += -lpthread libwsock32 libws2_32
  7. SOURCES += main.cpp

  8. widget.cpp
  9. HEADERS += widget.h

  10. open62541.h
  11. unix|win32: LIBS += -L$$PWD/dll/ -lopen62541
  12.  
  13.  
  14. INCLUDEPATH += $$PWD/dll

  15. DEPENDPATH += $$PWD/dll

3.工程目录简单如下

4.mian代码

  1. #include "widget.h"
  2. #include <QApplication>
  3. #include <QDesktopWidget>
  4.  
  5.  
  6. int main(int argc, char *argv[])

  7. {

  8. QApplication a(argc, argv);

  9. Widget w;

  10. w.show();

  11. // w.move ((QApplication::desktop()->width() - w.width())/2,(QApplication::desktop()->height() - w.height())/2);

  12. return a.exec();

  13. }

  14.  

5.连接服务器代码

  1. //创建OPC_ua客户端
  2. client = UA_Client_new(UA_ClientConfig_default);
  3. //连接OPC_UA服务器,匿名链接
  4. UA_StatusCode retval = UA_Client_connect(client,"opc.tcp://127.0.0.1:49320");
  5. //连接不成功的话
  6. if(retval != UA_STATUSCODE_GOOD)
  7. {
  8. UA_Client_delete(client);
  9. QMessageBox::information(this,"Error","连接失败,请确认服务器是否开启!");
  10. }
  11. else
  12. {
  13. QMessageBox::information(this,"TIps","连接成功!");
  14. }

6.从服务器读数据代码

  1. //读取opc标记数据
  2. retval = UA_Client_readValueAttribute(client, showId[i], &showValue[i]);
  3. //根据读取的数据更新UI
  4. if(retval == UA_STATUSCODE_GOOD) {
  5. if(*(UA_Boolean *)showValue[i].data)
  6. {
  7. showbtn[i]->setStyleSheet("QPushButton{background:red}");
  8. }
  9. else
  10. {
  11. showbtn[i]->setStyleSheet("QPushButton{background:gray}");
  12. }
  13. }

7.给服务器写数据代码

  1. //如果是0
  2. if(flag[num] == 0)
  3. {
  4. //设置标记的变量值也为1
  5. UA_Variant_setScalar(&ctrlValue[num],&trueflag,&UA_TYPES[UA_TYPES_BOOLEAN]);
  6. }
  7. else
  8. {
  9. //否则设置标记的数据值为0
  10. UA_Variant_setScalar(&ctrlValue[num],&falseflag,&UA_TYPES[UA_TYPES_BOOLEAN]);
  11. }
  12. //向OPC_UA服务器写入变量值
  13. int retval = UA_Client_writeValueAttribute(client, ctrlId[num], &ctrlValue[num]);
  14. if(retval == UA_STATUSCODE_GOOD) {
  15. if(*(UA_Boolean *)ctrlValue[num].data)
  16. {
  17. ctrlbtn[num]->setStyleSheet("QPushButton{background:red}");
  18. flag[num] = 1;
  19. }
  20. else
  21. {
  22. ctrlbtn[num]->setStyleSheet("QPushButton{background:gray}");
  23. flag[num] = 0;
  24. }
  25. }

8.通信效果,x1为1,1灯的颜色变红;x2为0所以2灯为灰色;点击下面按钮2,y2值变为1.

9.至此QT的客户端基本说明完毕,客户端源码下载地址:https://download.csdn.net/download/xipengbozai/16043753?spm=1001.2014.3001.5501。有疑问的可以加我微信X241602

QT实现OPC_UA客户端程序以及与OPC_UA服务器通信的更多相关文章

  1. 〖Linux〗Qt+gsoap开发客户端程序,服务端地址设定的字符串转换处理

    之所以写出来,是由于经常因为这个问题屡屡丢面子.. 一般情况下,QString转换成(char*),我们一般直接使用: char *str = qstr->text().toLatin1().d ...

  2. 基于 SailingEase WinForm Framework 开发客户端程序(3:实现菜单/工具栏按钮的解耦及状态控制)

    本系列文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以  SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...

  3. php编写tcp服务器和客户端程序

    这是我从别的地方看到的. 1.修改php.ini,打开extension=php_sockets.dll 2.客户端程序 SocketClient.php <?php set_time_limi ...

  4. qt 单文档程序关闭时在delete ui处出现segmentation fault

    做了个显示图片的单文档程序. qt 单文档程序关闭时在delete ui处出现segmentation fault. 调试发现调用两次mainwindow析构函数. http://blog.csdn. ...

  5. 在公司内网上创建自己的 OSM.Planet 街道级别地图服务器及其客户端程序

    转自我的BLOG http://blog.csdn.net/goldenhawking/article/details/6402775  最近经过陛下点拨,涉猎了“OpenStreetMap”,做了不 ...

  6. 使用 Socket 通信实现 FTP 客户端程序(来自IBM)

    FTP 客户端如 FlashFXP,File Zilla 被广泛应用,原理上都是用底层的 Socket 来实现.FTP 客户端与服务器端进行数据交换必须建立两个套接字,一个作为命令通道,一个作为数据通 ...

  7. winform客户端程序第一次调用webservice方法很慢的解决方法

    .net2.0的winform客户端最常用的与服务端通信方式是通过webservice,最近在用dottrace对客户端做性能测试的时候发现,客户端程序启动以后,第一次调用某一个webservice的 ...

  8. [iPhone高级] 基于XMPP的IOS聊天客户端程序(IOS端一)

    介绍完了服务器,这篇我们就要介绍重点了,写我们自己的IOS客户端程序 先看一下我们完成的效果图 首先下载xmppframework这个框架,下载 点ZIP下载 接下来,用Xcode新建一个工程 将以下 ...

  9. Qt之重启应用程序

    简介 今天分享的内容有些意思-如何重启一个应用程序.其实,有时候这是一个很重要的功能点,而且很人性化.易用性很好. 例如:切换用户.当某个用户登录成功之后,需要切换到其它账号,那么这时,你就知道它的重 ...

随机推荐

  1. Next.js & SSR & CSR & SG

    Next.js & SSR & CSR & SG getStaticPaths, getStaticProps, getServerSideProps getStaticPro ...

  2. css var & auto width css triangle

    css var & auto width css triangle https://codepen.io/xgqfrms/pen/PooeEbd css var https://codepen ...

  3. 可视化埋点 & XPath

    可视化埋点 & XPath https://www.w3.org/TR/xpath-full-text-30/ 数据的准确性 采集时机 数据发送策略 full XPath demo XML & ...

  4. Objec.assign & bug

    Objec.assign & bug shallow copy https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Referenc ...

  5. 「NGK每日快讯」11.24日NGK公链第22期官方快讯!

  6. JULLIAN MURPHY:拥有良好的心态,运气福气便会自来

    JULLIAN MURPHY是星盟全球投资公司的基金预审经理,负责星盟投资项目预审,有着资深的基金管理经验,并且在区块链应用的兴起中投资了多个应用区块链技术的公司. JULLIAN MURPHY认为往 ...

  7. Egg.js 是什么?

    Egg.js 是什么? 阿里巴巴出 Egg.js 为企业级框架和应用而生,我们希望由 Egg.js 孕育出更多上层框架,帮助开发团队和开发人员降低开发和维护成本. 注:Egg.js 缩写为 Egg 设 ...

  8. JVM Attach实现原理剖析

    本文转载自JVM Attach实现原理剖析 前言 本文旨在从理论上分析JVM 在 Linux 环境下 Attach 操作的前因后果,以及 JVM 为此而设计并实现的解决方案,通过本文,我希望能够讲述清 ...

  9. js实现element中可清空的输入框(2)

    接着上一篇的:js实现element中可清空的输入框(1)继续优化,感兴趣的可以去看看哟,直通车链接:https://www.cnblogs.com/qcq0703/p/14450001.html 实 ...

  10. 第一篇文章 vim的使用

    这么长时间以来,一直没有在博客园上写过博文.那第一篇博文就以vim的使用为开端吧. 不知道有多少人还在用着ctrl+c,ctrl+v这种方式,不过,就我个人而言,还是很倾向于vim的.不管是在服务器上 ...