• 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/ -lopen62541

    INCLUDEPATH += $$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

    需要程序源码的可以加我微信x241602私聊。
  • 相关阅读:
    RADAR毫米波雷达传感器
    固态LiDAR,半固态混合LiDAR,机械LiDAR
    Lidar激光雷达市场
    echarts 环形图中自定义文字
    uni-app base64 无法显示问题
    实战二(上):针对非业务的通用框架开发,如何做需求分析和设计?
    实战一(下):如何实现一个遵从设计原则的积分兑换系统?
    实战一(上):针对业务系统的开发,如何做需求分析和设计?
    学而不记,不学无异 -- English learning
    springmvc 传入返回参数更改
  • 原文地址:https://www.cnblogs.com/huipengbo/p/14631541.html
Copyright © 2020-2023  润新知