QOpcUaNode

        QOpcUaNode允许与OPC UA节点进行交互。

1.详细描述:

        节点是OPC UA地址空间的基本构建块。它具有浏览名称、值、关联属性等属性,并且可以引用地址空间中的其他节点。节点被组织在名称空间中,并且具有ID,例如可以是数字、字符串、名称空间特定格式(不透明)或全局唯一标识符。节点由名称空间ID和节点ID标识。该标识符通常以字符串的形式给出:例如,位于名称空间0中并具有数字标识符42的节点的标识符,则字符串为ns=0;i=42。具有字符串标识符的节点可以通过“ns=0;s=myStringIdentifier”寻址。

        此类型的对象归用户所有,在不再需要时必须删除。只要创建它们的QOpcUaClient存在,它们就有效。

2.读写属性

        当调用readAttributes()或readAttributeRange()时,将从服务器读取节点属性。结果缓存在本地,并且可以在接收到attributeRead信号后使用attribute()进行检索。

        如果用户具有必要的权限,则可以使用writeAttribute()、writeAttributes()和writeAttributeRange()写入属性。使用attributeWritten信号报告写入操作成功。

        attributeError()包含与属性上的最后一次读取或写入操作相关联的状态代码。这是OPC UA服务返回的低级别状态代码。通过使用QOpcUa::ErrorCategory()将此状态代码转换为QOpcUa::ErrorCategory,可以简化此状态代码.

3.订阅和监视项目

        订阅是OPC UA中的一个概念,它允许接收数据更改的通知或在发生事件的情况下接收通知,而不是连续轮询节点以获取更改。监视的项定义了如何监视节点的属性以进行更改。它们被添加到订阅中,并且它们生成的任何通知都会通过订阅转发给用户。用户可以配置更新的间隔以及监视项目和订阅的许多其他选项。

        QOpcUaNode提供了一个抽象,用于与订阅和监视项目交互。enableMonitoring()为一个或多个属性启用数据更改通知。dataChangeOccurred信号包含新值,并且本地缓存会更新。disableMonitoring()将禁用数据更改通知。monitoringStatusChanged信号通知监视状态的更改,例如在手动启用和禁用或服务器上的状态更改之后。

        事件监视使用相同的API进行设置和生命周期管理。EventNotifier属性必须使用EventFilter进行监控,该EventFilter选择所需的事件字段并根据用户定义的标准筛选报告的事件。事件在eventOccurred()信号中报告为QVariantList,其中包含所选事件字段的值。

        订阅和监视项的设置可以在运行时使用modifyMonitoring()进行修改。

4.浏览地址空间

        OPC UA地址空间由通过引用连接的节点组成。browseChildren在前向上遵循这些引用,并在browseFinished信号中返回连接到QOpcUaNode实例后面节点的所有节点的属性。browse()类似于browseChildren(),但提供了更多选项来配置浏览调用。

5.方法调用

        OPC UA指定了用户可以调用的服务器上的方法。QOpcUaNode通过callMethod支持这一点,该方法获取参数并在methodCallFinished信号中返回调用结果。

6.解析浏览路径

        为了支持根据类型描述进行编程,OPC UA支持解析从某个节点开始的浏览名称路径,以获得目标节点的节点id。resolveBrowsePath()方法遵循从调用它的节点开始的路径,并在resolveBrowserPathFinished()信号中返回结果。

7.实例

        有关将客户端连接到服务器并获取QOpcUaNode对象的信息,请参阅QOpcUaClient。

        成功创建节点后,将从服务器中读取根节点的BrowseName:

QOpcUaNode *rootNode; // Created before, see QOpcUaClient documentation.
// Connect to the attributeRead signal. Compatible slots of QObjects can be used instead of a lambda.
QObject::connect(rootNode, &QOpcUaNode::attributeRead, [rootNode, client](QOpcUa::NodeAttributes attr) {
    qDebug() << "Signal for attributes:" << attr;
    if (rootNode->attributeError(QOpcUa::NodeAttribute::BrowseName) != QOpcUa::UaStatusCode::Good) {
        qDebug() << "Failed to read attribute:" << rootNode->attributeError(QOpcUa::NodeAttribute::BrowseName);
        client->disconnectFromEndpoint();
    }
    qDebug() << "Browse name:" << rootNode->attribute(QOpcUa::NodeAttribute::BrowseName).value<QOpcUaQualifiedName>().name();
});
rootNode->readAttributes(QOpcUa::NodeAttribute::BrowseName); // Start a read operation for the node's BrowseName attribute.

  • 27
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于Qt的访问OPC服务并具有重连机制的示例代码: ```cpp #include <QOpcUaClient> #include <QOpcUaNode> #include <QOpcUaMonitoringParameters> #include <QTimer> #include <QDebug> class OpcUaClient : public QObject { Q_OBJECT public: explicit OpcUaClient(QObject *parent = nullptr) : QObject(parent) , m_client(new QOpcUaClient(this)) , m_reconnectTimer(new QTimer(this)) , m_isConnected(false) { m_client->setEndpointUrl(QUrl("opc.tcp://localhost:4840")); connect(m_client, &QOpcUaClient::stateChanged, this, &OpcUaClient::onStateChanged); connect(m_reconnectTimer, &QTimer::timeout, this, &OpcUaClient::reconnect); } void connectToServer() { m_client->connectToEndpoint(); } void disconnectFromServer() { m_client->disconnectFromEndpoint(); } void readNode(const QString &nodeId) { if (m_isConnected) { QOpcUaNode *node = m_client->nodeByIdentifier(nodeId); if (node) { connect(node, &QOpcUaNode::valueChanged, this, &OpcUaClient::onNodeValueChanged); node->readAttributes(QOpcUa::NodeAttribute::Value); } else { qWarning() << "Node not found for id" << nodeId; } } else { qWarning() << "Not connected to OPC UA server"; } } signals: void nodeValueChanged(const QString &nodeId, const QVariant &value); private slots: void onStateChanged(QOpcUaClient::ClientState state) { switch (state) { case QOpcUaClient::ClientState::Disconnected: m_isConnected = false; m_reconnectTimer->start(5000); // try to reconnect every 5 seconds break; case QOpcUaClient::ClientState::Connected: m_isConnected = true; m_reconnectTimer->stop(); break; default: break; } } void onNodeValueChanged(QOpcUa::NodeAttribute attr, const QVariant &value) { Q_UNUSED(attr); QOpcUaNode *node = qobject_cast<QOpcUaNode *>(sender()); if (node) { emit nodeValueChanged(node->nodeId(), value); } } void reconnect() { m_client->connectToEndpoint(); } private: QOpcUaClient *m_client; QTimer *m_reconnectTimer; bool m_isConnected; }; ``` 这个示例代码使用了Qt提供的`QOpcUaClient`类来访问OPC服务。它有一个`onStateChanged()`槽函数,当连接状态发生变化时会被调用。在连接断开时,它会启动一个定时器来定期尝试重新连接。在连接成功时,它会停止定时器。 此外,这个示例代码还有一个`readNode()`函数来读取指定节点的值,并在值发生变化时发出`nodeValueChanged()`信号。在这个函数中,我们需要检查连接状态,如果没有连接则发出警告信息。如果连接已经建立,我们可以使用`m_client->nodeByIdentifier()`函数来获取指定节点的`QOpcUaNode`对象,并连接它的`valueChanged()`信号以便在值发生变化时处理它。然后我们调用`readAttributes()`函数来读取节点的属性,其中包括`Value`属性,以获取节点的当前值。 可以根据需要对这个示例代码进行修改和扩展,以满足特定的要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值