KepServerEx6 与 QOpcUa 配合使用

使用kepServerEx6 创建一个服务器

右键连接性选择新建通道

通道类型选择Simulator;名称 改为 plc

新建设备名称为test ;标记我这里起名 label ;

使用client 查看;写入成功,服务器创建成功

下面是使用c++ qt 编写

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(ui->but_connect,&QPushButton::clicked,this,&MainWindow::requestEndpoints);
    connect(ui->but_read,&QPushButton::clicked,this,&MainWindow::readNode);
    connect(ui->but_read_2,&QPushButton::clicked,this,&MainWindow::writeNode);

    m_pOpcUaProvider = new QOpcUaProvider(this);//用于创建opcua 的实例
    //用于获取所有可用的后端插件名称的列表。
    if(m_pOpcUaProvider->availableBackends().isEmpty())
    {
        qDebug()<<"available is empty";
        return ;
    }

    qDebug()<<"availableBackends :"<<m_pOpcUaProvider->availableBackends();

    //                              根据指定的后端名称和属性创建一个 QOpcUaClient 实例。
    m_pOpcUaClient = m_pOpcUaProvider->createClient(m_pOpcUaProvider->availableBackends().at(0));

    if(m_pOpcUaClient == nullptr)
    {
        qDebug()<<"m_pOpcUaClient nullptr !!!";
        return ;
    }

    connect(m_pOpcUaClient,&QOpcUaClient::stateChanged,this,[this](QOpcUaClient::ClientState state){
        qDebug()<<"QOpcUaClient::stateChanged : "<<state;

        m_pclientState = state;
    });

    // 当端点请求完成时发出,endpoints 参数包含端点描述列表,statusCode 参数表示服务状态,requestUrl 参数表示请求的 URL。
    connect(m_pOpcUaClient, &QOpcUaClient::endpointsRequestFinished, this, [this](QVector<QOpcUaEndpointDescription> endpoints, QOpcUa::UaStatusCode statusCode, QUrl requestUrl){
        qDebug()<<endpoints.at(0).endpointUrl();
        qDebug()<<statusCode;
        qDebug()<<"endpoints returned:"<<endpoints.count();
        qDebug()<<endpoints.size();

        if (endpoints.size()) {
            QOpcUaEndpointDescription endpoint = endpoints.first();
            qDebug()<<"endpoint:"<<endpoint.endpointUrl();
            m_pOpcUaClient->connectToEndpoint(endpoint);//连接到指定的 OPC UA 端点。
        } else {
            qDebug()<<"matched endpoint not found!";
        }
    });

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::requestEndpoints()
{

    qDebug()<<"m_endpointUrl:"<<m_endPointUrl;
    if(m_pclientState == QOpcUaClient::ClientState::Disconnected)
    {
        if(m_pOpcUaClient != nullptr)
        {
           m_pOpcUaClient->requestEndpoints(QUrl(m_endPointUrl));// 请求指定 URL 的端点信息。
        }
    }

}

void MainWindow::readNode()
{
    QString str = "ns=2;s=plc.test.label";

    //根据节点 ID 获取 OPC UA 节点对象。
    QOpcUaNode* node = m_pOpcUaClient->node(str);

    //当节点的属性被读取时发出。
    connect(node,&QOpcUaNode::attributeRead,this,[node](QOpcUa::NodeAttributes attributes){
        QVariant var = node->valueAttribute();//获取节点的值属性值。
        qDebug()<<"var:"<<node->nodeId()<<" "<<var;//node->nodeId  -> 获取节点的节点 ID。

    });

    node->readAttributes(QOpcUa::NodeAttribute::Value);//读取节点的指定属性
}

void MainWindow::writeNode()
{
    QString str = "ns=2;s=plc.test.label";

    QOpcUaNode* photoGetNode = m_pOpcUaClient->node(str);//根据节点 ID 获取 OPC UA 节点对象。

    if(photoGetNode != nullptr)
    {
        photoGetNode->writeValueAttribute(QVariant("a"));//写入节点的值属性。
    }
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include <QOpcUaClient>
#include <QOpcUaProvider>

#include <QHash>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();


    void requestEndpoints();

    void readNode();

    void writeNode();


private:
    Ui::MainWindow *ui;

    QOpcUaClient* m_pOpcUaClient = nullptr; //client 实例

    QOpcUaProvider* m_pOpcUaProvider = nullptr;//用于创建opcua 的实例

    QString m_endPointUrl = "opc.tcp://127.0.0.1:49320";//端口

    QHash<QString ,QString > m_nodeIdHash ;//参数

    QOpcUaClient::ClientState m_pclientState = QOpcUaClient::ClientState::Disconnected;


};
#endif // MAINWINDOW_H

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值