class QOpcUaNode#

QOpcUaNode 允许与 OPC UA 节点交互。 更多信息

Inheritance diagram of PySide6.QtOpcUa.QOpcUaNode

摘要#

方法#

信号#

静态函数#

注意

本文档可能包含从 C++ 自动转换到 Python 的代码片段。我们始终欢迎对片段翻译的贡献力量。如果您在翻译中发现问题,也可以通过在 https:/bugreports.qt.io/projects/PYSIDE 创建工单的方式告诉我们

详细描述#

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

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

属性读取和写入#

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

如果有必要权限,可以使用 writeAttribute()writeAttributes()writeAttributeRange() 来写入属性。写入操作成功会通过 attributeWritten 信号报告。

attributeError() 包含与属性最后读取或写入操作相关的状态码。这是由OPC UA服务返回的低级别状态码。可以通过使用 errorCategory() 方法转换为 ErrorCategory 以简化此状态码。

订阅和监控项#

订阅是OPC UA中的一个概念,它允许在节点数据或发生事件时接收通知,而不是不断地轮询节点以检查变化。监控项定义了节点如何被监控变化。它们被添加到订阅中,并且生成的任何通知都通过订阅转发给用户。用户可以配置监控项和订阅的更新间隔以及其他许多选项。

QOpcUaNode提供了与订阅和监控项交互的抽象。enableMonitoring()为单个或多个属性启用了数据变更通知。包含新值的dataChangeOccurred信号并更新本地缓存。《a class="reference internal" href="#PySide6.QtOpcUa.QOpcUaNode.disableMonitoring" title="PySide6.QtOpcUa.QOpcUaNode.disableMonitoring">disableMonitoring()禁用数据变更通知。《a class="reference internal" href="#PySide6.QtOpcUa.QOpcUaNode.monitoringStatusChanged" title="PySide6.QtOpcUa.QOpcUaNode.monitoringStatusChanged">monitoringStatusChanged信号在手动启用和禁用或服务器上状态更改后通知监控状态的变化。

事件监控使用相同的API进行设置和生命周期管理。《a class="reference internal" href="QOpcUa.html#PySide6.QtOpcUa.QOpcUa.NodeAttribute" title="PySide6.QtOpcUa.QOpcUa.NodeAttribute">EventNotifier属性必须通过一个EventFilter进行监控,该过滤器选择所需的事件字段并按用户定义的标准过滤报告的事件。事件以eventOccurred()信号的形式报告,该信号是一个包含选定事件字段值的QVariantList。

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

浏览地址空间#

OPC UA地址空间由通过引用连接的节点组成。《a class="reference internal" href="#PySide6.QtOpcUa.QOpcUaNode.browseChildren" title="PySide6.QtOpcUa.QOpcUaNode.browseChildren">browseChildren按前进方向跟踪这些引用,并在《a class="reference internal" href="#PySide6.QtOpcUa.QOpcUaNode.browseFinished" title="PySide6.QtOpcUa.QOpcUaNode.browseFinished">browseFinished信号中返回与通过《a class="reference internal" href="#PySide6.QtOpcUa.QOpcUaNode" title="PySide6.QtOpcUa.QOpcUaNode">QOpcUaNode实例连接的所有节点的属性。《a class="reference internal" href="#PySide6.QtOpcUa.QOpcUaNode.browse" title="PySide6.QtOpcUa.QOpcUaNode.browse">browse与《a class="reference internal" href="#PySide6.QtOpcUa.QOpcUaNode.browseChildren" title="PySide6.QtOpcUa.QOpcUaNode.browseChildren">browseChildren类似,但提供了更多配置浏览调用的选项。

方法调用#

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

解析浏览路径#

为了支持针对类型描述的编程,OPC UA 支持从特定节点开始解析浏览名称路径,以获取目标节点的节点 ID。该 resolveBrowsePath() 方法遵循从被调用的节点开始的路径,并在 resolveBrowsePathFinished() 信号中返回结果。

示例#

有关将客户端连接到服务器并获取 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.
static allBaseAttributes()#
返回类型::

NodeAttribute 的组合

包含 OPC UA 基节点类的所有属性。

attribute(attribute)#
参数::

attributeNodeAttribute

返回类型::

对象

返回在 attribute 中给出的属性的值。

该值仅在 attributeRead 信号已发出后有效。如果没有缓存的属性值,则返回空 QVariant。

attributeError(attribute)#
参数::

attributeNodeAttribute

返回类型::

UaStatusCode

返回 attribute 中给出的属性的错误代码。

错误代码仅在 attributeReadattributeWritten 信号已发出后有效。

如果属性缓存中没有条目,则返回BadNoEntryExists

另请参阅

错误类别

attributeRead(attributes)#
参数::

attributes – 由NodeAttribute组合而成

此信号在readAttributes()readAttributeRange()操作完成后发出。接收者必须检查在attributes中包含的属性的状态代码。

attributeUpdated(attr, value)#
参数::

当由服务器发送的数据变更通知、读取或写入操作更新属性缓存中的值后,会发出此信号。value包含节点属性attr的新值。

attributeWritten(attribute, statusCode)#
参数::

在完成 writeAttribute()writeAttributes()writeAttributeRange() 操作后,此信号被触发。

在触发此信号之前,如果写入成功,则更新属性缓存。writeAttributes() 对于写入调用中的每个属性,都会发出一个信号。 statusCode 包含对 attribute 的写入操作的成功信息。

browse(request)#
参数::

requestQOpcUaBrowseRequest

返回类型::

bool

从此节点启动浏览调用。

如果异步调用已成功分发,则返回 true

browseFinished() 信号中返回符合 request 中指定标准的所有引用。

例如,可以使用反向浏览调用查找属性节点的父节点

QOpcUaBrowseRequest request;
request.setBrowseDirection(QOpcUaBrowseRequest::BrowseDirection::Inverse);
request.setReferenceTypeId(QOpcUa::ReferenceTypeId::HasProperty);
propertyNode->browse(request);
browseChildren([referenceType=QOpcUa.ReferenceTypeId.HierarchicalReferences[, nodeClassMask=QOpcUa.NodeClass.Undefined]])#
参数::
返回类型::

bool

从调用此方法所在的节点开始执行向前浏览调用。浏览操作收集与节点连接的子节点信息,并通过 browseFinished() 信号传递结果。

如果异步调用已成功分发,则返回 true

要仅请求与特定类型的引用连接的子节点,必须将 referenceType 设置为该引用类型。例如,可以通过在 referenceType 中传递 HasProperty 来获取节点的所有属性。根据需要在 nodeClassMask 中设置,可以过滤结果以包含具有特定节点类的节点。

browseFinished(children, statusCode)#
参数::
  • 子节点 – .QOpcUaReferenceDescription列表

  • statusCodeUaStatusCode

在执行了browseChildren()browse()操作后发出此信号。

children包含了匹配browseChildren()准则的所有节点的信息。statusCode包含了浏览操作的服务结果。如果statusCode不是Good,则传递的children向量将为空。

callMethod(methodNodeId[, args=list()])#
参数::
  • methodNodeId – str

  • args – std.pair QVariant,QOpcUa.Types列表

返回类型::

bool

调用OPC UA方法 methodNodeId,通过args提供参数。结果在methodCallFinished信号中返回。

如果异步调用已成功分发,则返回 true

client()#
返回类型::

QOpcUaClient

返回创建此节点的客户端指针。

dataChangeOccurred(attr, value)#
参数::

在接收数据变化通知后发出此信号。value包含了节点属性attr的新值。

disableMonitoring(attr)#
参数::

attr – QOpcUa.NodeAttribute组合

返回类型::

bool

此方法禁用了在attr中给出的属性监控。

如果异步调用已成功分发,则返回 true

通话结束后,会发射 disableMonitoringFinished 信号,并且 monitoringStatus 返回一个默认构造的值,状态码为 BadMonitoredItemIdInvalid 对于 attr

disableMonitoringFinished(attr, statusCode)#
参数::

在该信号发射后,异步调用 disableMonitoring() 完成。`statusCode` 包含由操作生成的状态码。在此信号发射之后,`monitoringStatus` 返回一个默认构造的值,对于 `attr` 的状态码为 BadMonitoredItemIdInvalid。

enableMonitoring(attr, settings)#
参数::
返回类型::

bool

此方法为在 attr 中提供的每个属性创建一个监控项。在创建监控项和订阅期间使用来自 settings 的设置。

如果异步调用已成功分发,则返回 true

调用完成时,会发射 enableMonitoringFinished 信号。存在多个错误情况,会生成错误状态码:在 settings 中指定的订阅 ID 不存在,服务器上的节点不存在,节点不具有请求的属性或服务器达到了监控项的最大数量。

相同的函数也用于启用事件监控。事件是 OPC UA 地址空间中的特殊对象,它包含有关已发生事件的情報。如果服务器上触发事件,事件监控项收集事件对象及其子节点的节点属性的选择值。每个具有事件源的节点都可以监控事件。为了监控事件,必须使用 EventNotifier 属性,并结合一个包含用户所需的字段以及可选的用于按条件过滤事件的子句的 EventFilter(有关详细信息,请参阅 EventFilter )。

enableMonitoringFinished(attr, statusCode)#
参数::

此信号在异步调用 enableMonitoring() 完成后发出。在此信号发出后,monitoringStatus() 将返回关于 attr 的有效信息。statusCode 包含操作的状

eventOccurred(eventFields)#
参数::

eventFields – .QVariant的列表

在接收到新事件后发出此信号。

eventFields 包含事件筛选器中 select 子句指定的顺序中事件字段的值。

static mandatoryBaseAttributes()#
返回类型::

NodeAttribute 的组合

包含 OPC UA 基节点类的所有强制属性。

methodCallFinished(methodNodeId, result, statusCode)#
参数::
  • methodNodeId – str

  • result – 对象

  • statusCodeUaStatusCode

在服务器上对 methodNodeId 的方法调用完成后发出此信号。statusCode 包含方法调用的状态代码,result 包含方法的输出参数。result 为空,如果方法没有输出参数,或 statusCode 不是 Good 。如果只有一个输出参数,则 result 变元是一个单个值;如果被调用的函数返回了多个输出参数,它包含变元的列表。

if (result.canConvert<QVariantList>()) {
    // handle list type
} else {
    // handle value type
}
modifyDataChangeFilter(attr, filter)#
参数::
返回类型::

bool

修改现有的数据更改监控,使用 filter 作为数据更改筛选器。

如果筛选器修改请求已成功发送到后端,则返回 true

修改 attrmonitoringStatusChanged,在操作完成后发出。

modifyEventFilter(eventFilter)#
参数::

eventFilterEventFilter

返回类型::

bool

修改现有的事件监控以使用eventFilter作为事件过滤。

如果筛选器修改请求已成功发送到后端,则返回 true

monitoringStatusChanged在针对事件通知器的操作完成之后发出。

modifyMonitoring(attr, item, value)#
参数::
返回类型::

bool

此方法修改了被监控项或订阅的设置。尝试将属性attr关联的被监控项或订阅的item参数设置成value

如果异步调用已成功分发,则返回 true

调用完成后,将发出monitoringStatusChanged信号。此信号包含修改后的参数和状态码。如果没有与请求的属性关联的被监控项,或者没有实现修改请求的参数或服务器拒绝了请求的值时,将生成错误状态码。

monitoringStatus(attr)#
参数::

attrNodeAttribute

返回类型::

QOpcUaMonitoringParameters

返回与属性attr关联的监控参数。这可以用来检查enableMonitoring()是否成功,或者是参数是否已被修改。返回的值只在enableMonitoringFinishedmonitoringStatusChanged已针对attr发出时有效。如果在进行状态查询之前没有发出信号,则返回值将返回BadNoEntryExists

monitoringStatusChanged(attr, items, statusCode)#
参数::

在调用 modifyMonitoring() 异步调用完成之后,会发出此信号。要求操作的节点属性将在 attr 中返回。《code class="docutils literal notranslate">items》 包含已经修改的参数。《code class="docutils literal notranslate">statusCode 包含对服务器上的修改操作的结果。

nodeId()#
返回类型::

字符串

返回OPC UA节点的ID。

readAttributeRange(attribute, indexRange)#
参数::
返回类型::

bool

开始异步读取节点属性 attribute 的操作。`indexRange` 是一个字符串,可以用来选择数组的一部分。它定义在OPC UA 1.05第4部分7.27。数组中的第一个元素是0,“1”返回第二个元素,“0:9”返回前10个元素,“0,1”返回二维数组第一行第二个元素。

如果异步调用已成功分发,则返回 true

属性值只在attributeRead 信号发出后包含有效信息。

readAttributes([attributes=QOpcUaNode.mandatoryBaseAttributes()])#
参数::

attributes – 由NodeAttribute组合而成

返回类型::

bool

开始异步读取 attributes 中的节点属性。

如果异步调用已成功分发,则返回 true

属性值只在attributeRead 信号发出后包含有效信息。

readHistoryEvents(startTime, endTime, filter[, numValues=0])#
参数::
  • startTimeQDateTime

  • endTimeQDateTime

  • filterEventFilter

  • numValues – 整数

返回类型::

QOpcUaHistoryReadResponse

使用参数 startTimeendTimefilternumValues 开始对这个节点进行读取事件历史记录请求。`filter` 用于由服务器确定将返回哪些事件及其字段集。

返回一个包含请求状态的QOpcUaHistoryReadResponse对象,如果异步请求已成功分发。结果在 UaStatusCode serviceResult) 信号中返回。

以下示例获取过去两天的历史事件。每次最多返回10个事件。如果还有更多符合筛选条件并处于提供时间段内的事件,hasMoreData() 将为真,可以通过 readMoreData() 获取更多事件。

QScopedPointer<QOpcUaNode> node(opcuaClient->node("ns=2;s=EventHistorian"));
QVERIFY(node != nullptr);

QOpcUaMonitoringParameters::EventFilter filter;
filter << QOpcUaSimpleAttributeOperand("Message");
filter << QOpcUaSimpleAttributeOperand("Time");

const auto response = node->readHistoryEvents(QDateTime::currentDateTime().addDays(-2), QDateTime::currentDateTime(), filter, 10);

QObject::connect(response, &QOpcUaHistoryReadResponse::readHistoryEventsFinished, this,
                 [response](const QList<QOpcUaHistoryEvent> &results, QOpcUa::UaStatusCode serviceResult) {
                     if (serviceResult != QOpcUa::UaStatusCode::Good) {
                         qDebug() << "Service call failed with" << serviceResult;
                         return;
                     }

                     // Print what we got so far
                     for (const auto &result : response->events()) {
                         qDebug() << "Results for" << result.nodeId() << result.statusCode();
                         for (const auto &event : result.events())
                             qDebug() << "    Event:" << event;
                     }

                     if (response->hasMoreData())
                         response->readMoreData();
                 });
readHistoryRaw(startTime, endTime, numValues, returnBounds)#
参数::
  • startTimeQDateTime

  • endTimeQDateTime

  • numValues – 整数

  • returnBounds – bool

返回类型::

QOpcUaHistoryReadResponse

为该节点启动读取历史请求。这是 Qt OPC UA 对 OPC UA 读取历史服务的表示,该服务在 OPC UA 1.05 第4部分 5.10.3 中定义了读取原始历史数据。它根据参数 startTimeendTimenumValuesreturnBounds 读取历史。

返回一个包含请求状态的QOpcUaHistoryReadResponse对象,如果异步请求已成功分发。结果在 UaStatusCode serviceResult) 信号中返回。

在以下示例中,请求并打印了节点的过去两天的历史数据。结果限制为每个节点返回十个值。

QOpcUaHistoryReadResponse *response = node->readHistoryRaw(QDateTime::currentDateTime(),
                                                           QDateTime::currentDateTime().addDays(-2),
                                                           10,
                                                           true);
if (response) {
    QObject::connect(response123, &QOpcUaHistoryReadResponse::readHistoryDataFinished,
                     [] (QList<QOpcUaHistoryData> results, QOpcUa::UaStatusCode serviceResult) {
        if (serviceResult != QOpcUa::UaStatusCode::Good) {
            qWarning() << "Fetching historical data failed with:" << serviceResult;
        } else {
            for (const auto& result : results) {
                qInfo() << "NodeId:" << result.nodeId();
                for (const auto &dataValue : result.result())
                    qInfo() << "Value:" << dataValue.value();
            }
        }
    });
}
readHistoryRaw(startTime, endTime, numValues, returnBounds, timestampsToReturn)
参数::
返回类型::

QOpcUaHistoryReadResponse

为该节点启动读取历史请求。额外的 timestampsToReturn 参数确定每个值将返回哪些时间戳。

readValueAttribute()#
返回类型::

bool

启动对节点值属性的异步读取操作。

如果异步调用已成功分发,则返回 true

另请参阅

readAttributes()

resolveBrowsePath(path)#
参数::

path – .list of QOpcUaRelativePathElement

返回类型::

bool

使用 OPC UA 1.05 第4部分中指定的 TranslateBrowsePathsToNodeIds 服务,从该节点开始解析浏览路径 path 到一个或多个节点ID。

如果异步调用已成功分发,则返回 true

TranslateBrowsePathsToNodeIds 主要用于针对类型定义编程,而不是针对 OPC UA 地址空间中一组具体的节点。例如,一个机器模型类型定义可能包含一个起始节点,其在浏览名称为“Machine”的组件下有名为“Fan”的组件。Fan 有一个名为“RPM”的组件,这是一个变量节点,包含风扇的当前 RPM 值。有多种类型的机器,并且每种类型的每台机器都将作为该类型对象映射到 OPC UA 地址空间中。对于这些机器对象中的每一个,从机器节点到“RPM”节点的路径都是相同的。如果客户端想要读取当前的 RPM 值,它需要以机器节点作为起始节点,调用 resolveBrowsePath(),并带上从机器到“RPM”节点的浏览路径。

QScopedPointer<QOpcUaNode> node(opcuaClient->node("ns=1;s=machine1"));

QList<QOpcUaRelativePathElement> path;
path.append(QOpcUaRelativePathElement(QOpcUaQualifiedName(1, "Fan"), QOpcUa::ReferenceTypeId::HasComponent));
path.append(QOpcUaRelativePathElement(QOpcUaQualifiedName(1, "RPM"), QOpcUa::ReferenceTypeId::HasComponent));
node->resolveBrowsePath(path);

resolveBrowsePathFinished() 返回的结果包含“RPM”节点的节点 ID,可用于访问节点的属性。

if (!results.size()) {
    qWarning() << "Browse path resolution failed";
    return;
}

if (results.at(0).isFullyResolved()) {
   QOpcUaNode *rpmNode = client->node(results.at(0).targetId());
   if (!rpmNode) {
       qWarning() << "Failed to create node";
       return;
   }
   // Connect slots, call methods
} else {
    qWarning() << "Browse path could not be fully resolved, the target node is on another server";
    return;
}
resolveBrowsePathFinished(targets, path, statusCode)#
参数::
  • targets – .QOpcUaBrowsePathTarget 列表

  • path – .list of QOpcUaRelativePathElement

  • statusCodeUaStatusCode

在调用 resolveBrowsePath() 后会发出此信号。

含匹配信息的 QOpcUaBrowsePathTarget 列表包含在 targets 中,statusCode 是操作的代码。如果 statusCode 不是 Good,则 targets 为空。浏览路径 path 是请求中的浏览路径。它可以用来将结果关联到请求。

serverTimestamp(attribute)#
参数::

attributeNodeAttribute

返回类型::

QDateTime

返回从最后一次读取或数据更改的 attribute 的服务器时间戳。在至少发出一个 attributeReaddataChangeOccurred 信号之前,返回一个空的 datetime。

sourceTimestamp(attribute)#
参数::

attributeNodeAttribute

返回类型::

QDateTime

返回从上次读取或数据更改的 attribute 的源时间戳。在至少发出一个 attributeReaddataChangeOccurred 信号之前,返回一个空的 datetime。

valueAttribute()#
返回类型::

对象

返回节点的Value属性的值。

返回的值仅在Value属性被成功读取或写入或者监控中数据更改更新了属性缓存后才有效。这可以通过attributeRead()attributeWritten() 信号的状态码为Good 或Value属性有一个dataChangeOccurred() 信号来完成。

如果属性缓存中没有值,则返回无效的QVariant。

valueAttributeError()#
返回类型::

UaStatusCode

返回节点Value属性的错误代码。如果状态码为Good,则表示valueAttribute() 的有效返回值。如果属性缓存中没有条目,则返回 BadNoEntryExists

valueAttributeUpdated(value)#
参数::

value – 对象

在服务器从数据更改通知、读取或写入操作更新属性缓存中的值属性后发出此信号。《code class="docutils literal notranslate">value 包含值属性的新的值。

writeAttribute(attribute, value[, type=QOpcUa.Types.Undefined])#
参数::
返回类型::

bool

使用来自 type 的类型信息将 value 写入 attribute 所指定的属性。如果异步调用已成功调度,则返回 true

如果省略了 type 参数,后端将尝试找到正确的类型。以下为默认假设类型:

Qt 元类型

OPC UA 类型

布尔

布尔类型

无符号字符

字节

字符

有符号字节

无符号短整型

无符号整型 16

短整型

整型 16

整型

整型 32

无符号整型

无符号整型 32

无符号长整型

无符号长整型 64

长整型

长整型 64

双精度浮点型

双精度浮点型

单精度浮点型

单精度浮点型

QString

字符串

QDateTime

日期时间

QByteArray

字节字符串

QUuid

UUID

writeAttributeRange(attribute, value, indexRange[, type=QOpcUa.Types.Undefined])#
参数::
返回类型::

bool

使用来自 type 的类型信息将 value 写入 attribute 所指定的属性。有关 indexRange 的说明,请参阅 readAttributeRange()

如果异步调用已成功分发,则返回 true

writeAttributes(toWrite[, valueAttributeType=QOpcUa.Types.Undefined])#
参数::
  • toWrite – 键的类型为 .QOpcUa.NodeAttribute,值为 QVariant 的字典。

  • valueAttributeTypeTypes

返回类型::

bool

执行 toWrite 中指定的属性和值的写操作。

如果异步调用已成功分发,则返回 true

可以使用 valueAttributeType 参数提供值属性的类型信息。其他所有属性都有已知的类型。

另请参阅

writeAttribute()

writeValueAttribute(value[, type=QOpcUa.Types.Undefined])#
参数::
  • value – 对象

  • 类型Types

返回类型::

bool

使用来自 type 的类型信息将 value 写入节点的 Value 属性。

如果异步调用已成功分发,则返回 true

另请参阅

writeAttribute()