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之重启应用程序
简介 今天分享的内容有些意思-如何重启一个应用程序.其实,有时候这是一个很重要的功能点,而且很人性化.易用性很好. 例如:切换用户.当某个用户登录成功之后,需要切换到其它账号,那么这时,你就知道它的重 ...
随机推荐
- VIM 官方教程
VIM 官方教程 zh-hans vim official documents https://www.vim.org/docs.php https://vimhelp.org/ translatio ...
- uniapp 自定义弹窗组件
先上效果: 组件源码:slot-modal.vue <template> <view class="modal-container" v-if="sho ...
- Vue学习笔记-jsonl转换显示工具JsonView安装及使用
一 使用环境: windows 7 64位操作系统 二 jsonl转换显示工具JsonView安装及使用 1.下载: https://github.com/gildas-lormeau/JSONV ...
- PHP中间件
定义 首先什么是php的中间件? 根据zend-framework中的定义: 所谓中间件是指提供在请求和响应之间的,能够截获请求,并在其基础上进行逻辑处理,与此同时能够完成请求的响应或传递到下一个中间 ...
- SpringBoot配置本地文件映射路径
1.前言 在springboot的项目中,如果需要通过项目方式访问本地磁盘的文件,不仅可以使用nginx代理的方式,还可以使用springboot配置的方式进行访问. 实例原因说明:由于上传的图片是要 ...
- C++构造函数的选择
构造函数用来初始化类对象.构造函数有好几种,在编程时如何选择不同的构造函数呢?做个总结 一.默认构造函数 默认构造函数是在程序员没有声明任何构造函数的时,编译器为了初始化类对象自己进行的默认构造函数. ...
- 看完我的笔记不懂也会懂----less
目录 Less学习 语法篇 注释 变量 映射(Maps) @规则嵌套和冒泡 less中的嵌套规则 less中的混合 less的运算 extend延伸/继承 less忽略编译(转义) 导入(Import ...
- 440. 字典序的第K小数字 + 字典树 + 前缀 + 字典序
440. 字典序的第K小数字 LeetCode_440 题目描述 方法一:暴力法(必超时) package com.walegarrett.interview; /** * @Author WaleG ...
- Mybatis(一):手写一套持久层框架
作者 : 潘潘 未来半年,有幸与导师们一起学习交流,趁这个机会,把所学所感记录下来. 「封面图」 自毕业以后,自己先创业后上班,浮沉了近8年,内心着实焦躁,虽一直是走科班路线,但在技术道路上却始终没静 ...
- 选择 FreeBSD 而不是 Linux 的技术性原因1
Ports FreeBSD Ports 是一个惊人的工程壮举.NetBSD 的 pkgsrc (package source) 和 OpenBSD 的 ports collection 都源于 Fre ...