使用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