QT实现OPC_UA客户端程序以及与OPC_UA服务器通信
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文件如下
QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = OPCUA_example
TEMPLATE = app
QMAKE_CFLAGS += -std=c99
LIBS += -lpthread libwsock32 libws2_32 SOURCES += main.cpp
widget.cpp HEADERS += widget.h
open62541.h unix|win32: LIBS += -L$$PWD/dll/ -lopen62541INCLUDEPATH += $$PWD/dll
DEPENDPATH += $$PWD/dll
3.工程目录简单如下

4.mian代码
#include "widget.h"
#include <QApplication>
#include <QDesktopWidget>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
// w.move ((QApplication::desktop()->width() - w.width())/2,(QApplication::desktop()->height() - w.height())/2);
return a.exec();
}
5.连接服务器代码
//创建OPC_ua客户端
client = UA_Client_new(UA_ClientConfig_default);
//连接OPC_UA服务器,匿名链接
UA_StatusCode retval = UA_Client_connect(client,"opc.tcp://127.0.0.1:49320");
//连接不成功的话
if(retval != UA_STATUSCODE_GOOD)
{
UA_Client_delete(client);
QMessageBox::information(this,"Error","连接失败,请确认服务器是否开启!");
}
else
{
QMessageBox::information(this,"TIps","连接成功!");
}
6.从服务器读数据代码
//读取opc标记数据
retval = UA_Client_readValueAttribute(client, showId[i], &showValue[i]);
//根据读取的数据更新UI
if(retval == UA_STATUSCODE_GOOD) {
if(*(UA_Boolean *)showValue[i].data)
{
showbtn[i]->setStyleSheet("QPushButton{background:red}");
}
else
{
showbtn[i]->setStyleSheet("QPushButton{background:gray}");
}
}
7.给服务器写数据代码
//如果是0
if(flag[num] == 0)
{
//设置标记的变量值也为1
UA_Variant_setScalar(&ctrlValue[num],&trueflag,&UA_TYPES[UA_TYPES_BOOLEAN]);
}
else
{
//否则设置标记的数据值为0
UA_Variant_setScalar(&ctrlValue[num],&falseflag,&UA_TYPES[UA_TYPES_BOOLEAN]);
}
//向OPC_UA服务器写入变量值
int retval = UA_Client_writeValueAttribute(client, ctrlId[num], &ctrlValue[num]);
if(retval == UA_STATUSCODE_GOOD) {
if(*(UA_Boolean *)ctrlValue[num].data)
{
ctrlbtn[num]->setStyleSheet("QPushButton{background:red}");
flag[num] = 1;
}
else
{
ctrlbtn[num]->setStyleSheet("QPushButton{background:gray}");
flag[num] = 0;
}
}
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服务器通信的更多相关文章
- 〖Linux〗Qt+gsoap开发客户端程序,服务端地址设定的字符串转换处理
之所以写出来,是由于经常因为这个问题屡屡丢面子.. 一般情况下,QString转换成(char*),我们一般直接使用: char *str = qstr->text().toLatin1().d ...
- 基于 SailingEase WinForm Framework 开发客户端程序(3:实现菜单/工具栏按钮的解耦及状态控制)
本系列文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以 SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...
- php编写tcp服务器和客户端程序
这是我从别的地方看到的. 1.修改php.ini,打开extension=php_sockets.dll 2.客户端程序 SocketClient.php <?php set_time_limi ...
- qt 单文档程序关闭时在delete ui处出现segmentation fault
做了个显示图片的单文档程序. qt 单文档程序关闭时在delete ui处出现segmentation fault. 调试发现调用两次mainwindow析构函数. http://blog.csdn. ...
- 在公司内网上创建自己的 OSM.Planet 街道级别地图服务器及其客户端程序
转自我的BLOG http://blog.csdn.net/goldenhawking/article/details/6402775 最近经过陛下点拨,涉猎了“OpenStreetMap”,做了不 ...
- 使用 Socket 通信实现 FTP 客户端程序(来自IBM)
FTP 客户端如 FlashFXP,File Zilla 被广泛应用,原理上都是用底层的 Socket 来实现.FTP 客户端与服务器端进行数据交换必须建立两个套接字,一个作为命令通道,一个作为数据通 ...
- winform客户端程序第一次调用webservice方法很慢的解决方法
.net2.0的winform客户端最常用的与服务端通信方式是通过webservice,最近在用dottrace对客户端做性能测试的时候发现,客户端程序启动以后,第一次调用某一个webservice的 ...
- [iPhone高级] 基于XMPP的IOS聊天客户端程序(IOS端一)
介绍完了服务器,这篇我们就要介绍重点了,写我们自己的IOS客户端程序 先看一下我们完成的效果图 首先下载xmppframework这个框架,下载 点ZIP下载 接下来,用Xcode新建一个工程 将以下 ...
- Qt之重启应用程序
简介 今天分享的内容有些意思-如何重启一个应用程序.其实,有时候这是一个很重要的功能点,而且很人性化.易用性很好. 例如:切换用户.当某个用户登录成功之后,需要切换到其它账号,那么这时,你就知道它的重 ...
随机推荐
- ASCII Art
ASCII Art https://npms.io/search?q=ASCII art ASCII Art Text to ASCII Art Generator (TAAG) http://pat ...
- LGTM & code review
LGTM & code review LGTM is an acronym meaning looks good to me, frequently used when reviewing d ...
- js IdleDetector 检测用户是否处于活动状态API
btn.addEventListener("click", async () => { try { const state = await Notification.requ ...
- The Filesystem Hierarchy Standard of Linux
The Filesystem Hierarchy Standard of Linux linux directory https://zhuanlan.zhihu.com/p/23862856 htt ...
- 【PY从0到1】 一文掌握Pandas量化进阶
# 一文掌握Pandas量化进阶 # 这节课学习Pandas更深的内容. # 导入库: import numpy as np import pandas as pd # 制作DataFrame np. ...
- Python基础之:数字字符串和列表
目录 简介 数字 字符串 字符串对象str 列表 简介 Python的主要应用是进行科学计算,科学计算的基础就是数字,字符串和列表.本文将会详细的给大家介绍一下这三个数据类型的使用情况. 数字 数字是 ...
- winform捕捉全局异常
/// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void Main() { try { //设置应 ...
- SpringBoot自定义注解
1.注解的概念 注解是一种能被添加到java代码中的元数据,类.方法.变量.参数和包都可以用注解来修饰.注解对于它所修饰的代码并没有直接的影响. 2.注解的使用范围 1)为编译器提供信息:注解能被编译 ...
- SpringBoot Admin应用监控搭建
简介 Spring Boot Admin 用于监控基于 Spring Boot 的应用,它是在 Spring Boot Actuator 的基础上提供简洁的可视化 WEB UI. 参考手册地址:htt ...
- CentOS Install NMP
目录 Installation steps of the Nginx install run 默认安装路径 指定安装目录 Installation steps of the MySQL 下载源码包 解 ...