QOpcUaClient 类

QOpcUaClient 允许与 OPC UA 服务器交互。 更多信息...

头文件 #include <QOpcUaClient>
CMakefind_package(Qt6 REQUIRED COMPONENTS OpcUa)
target_link_libraries(mytarget PRIVATE Qt6::OpcUa)
qmakeQT += opcua
继承 QObject

公共类型

枚举ClientError { NoError, InvalidUrl, AccessDenied, ConnectionError, UnknownError, UnsupportedAuthenticationInformation }
枚举ClientState { Disconnected, Connecting, Connected, Closing }

属性

  • error : const ClientError
  • state : const ClientState

公共功能

virtual~QOpcUaClient()
booladdNode(const QOpcUaAddNodeItem &nodeToAdd)
booladdReference(const QOpcUaAddReferenceItem &referenceToAdd)
(since QtOpcUa 5.13) QOpcUaApplicationIdentityapplicationIdentity() const
const QOpcUaAuthenticationInformation &authenticationInformation() const
QStringbackend() const
(since QtOpcUa 5.13) voidconnectToEndpoint(const QOpcUaEndpointDescription &endpoint)
(since 6.6) QOpcUaConnectionSettingsconnectionSettings() const
booldeleteNode(const QString &nodeId, bool deleteTargetReferences = true)
booldeleteReference(const QOpcUaDeleteReferenceItem &referenceToDelete)
voiddisconnectFromEndpoint()
QOpcUaEndpointDescriptionendpoint() const
QOpcUaClient::ClientErrorerror() const
boolfindServers(const QUrl &url, const QStringList &localeIds = QStringList(), const QStringList &serverUris = QStringList())
boolisNamespaceAutoupdateEnabled() const
QStringListnamespaceArray() const
intnamespaceAutoupdateInterval() const
QOpcUaNode *node(const QString &nodeId)
QOpcUaNode *node(const QOpcUaExpandedNodeId &expandedNodeId)
(since QtOpcUa 5.13) QOpcUaPkiConfigurationpkiConfiguration() const
QOpcUaQualifiedNamequalifiedNameFromNamespaceUri(const QString &namespaceUri, const QString &name, bool *ok = nullptr) const
(自6.3以来) QOpcUaHistoryReadResponse *readHistoryData(const QOpcUaHistoryReadRawRequest &request)
(自6.7以来) QOpcUaHistoryReadResponse *readHistoryEvents(const QOpcUaHistoryReadEventRequest &request)
boolreadNodeAttributes(const QList<QOpcUaReadItem> &nodesToRead)
(自6.7以来) boolregisterNodes(const QStringList &nodesToRegister)
boolrequestEndpoints(const QUrl &url)
QStringresolveExpandedNodeId(const QOpcUaExpandedNodeId &expandedNodeId, bool *ok = nullptr) const
(since QtOpcUa 5.13) voidsetApplicationIdentity(const QOpcUaApplicationIdentity &identity)
voidsetAuthenticationInformation(const QOpcUaAuthenticationInformation &authenticationInformation)
(自6.6以来) voidsetConnectionSettings(const QOpcUaConnectionSettings &connectionSettings)
voidsetNamespaceAutoupdate(bool isEnabled)
voidsetNamespaceAutoupdateInterval(int interval)
(since QtOpcUa 5.13) voidsetPkiConfiguration(const QOpcUaPkiConfiguration &config)
QOpcUaClient::ClientStatestate() const
(自QtOpcUa 5.14以来) QStringListsupportedSecurityPolicies() const
(自QtOpcUa 5.14以来) QList<QOpcUaUserTokenPolicy::TokenType>supportedUserTokenTypes() const
(自6.7以来) boolunregisterNodes(const QStringList &nodesToUnregister)
boolupdateNamespaceArray()
boolwriteNodeAttributes(const QList<QOpcUaWriteItem> &nodesToWrite)

Signal信号

voidaddNodeFinished(QOpcUaExpandedNodeId requestedNodeId, QString assignedNodeId, QOpcUa::UaStatusCode statusCode)
voidaddReferenceFinished(QString sourceNodeId, QString referenceTypeId, QOpcUaExpandedNodeId targetNodeId, bool isForwardReference, QOpcUa::UaStatusCode statusCode)
(since QtOpcUa 5.13) voidconnectError(QOpcUaErrorState *errorState)
voidconnected()
voiddeleteNodeFinished(QString nodeId, QOpcUa::UaStatusCode statusCode)
voiddeleteReferenceFinished(QString sourceNodeId, QString referenceTypeId, QOpcUaExpandedNodeId targetNodeId, bool isForwardReference, QOpcUa::UaStatusCode statusCode)
voiddisconnected()
voidendpointsRequestFinished(QList<QOpcUaEndpointDescription> endpoints, QOpcUa::UaStatusCode statusCode, QUrl requestUrl)
voiderrorChanged(QOpcUaClient::ClientError error)
voidfindServersFinished(QList<QOpcUaApplicationDescription> servers, QOpcUa::UaStatusCode statusCode, QUrl requestUrl)
voidnamespaceArrayChanged(QStringList namespaces)
voidnamespaceArrayUpdated(QStringList namespaces)
(since QtOpcUa 5.13) voidpasswordForPrivateKeyRequired(QString keyFilePath, QString *password, bool previousTryWasInvalid)
voidreadNodeAttributesFinished(QList<QOpcUaReadResult> results, QOpcUa::UaStatusCode serviceResult)
(自6.7以来) voidregisterNodesFinished(const QStringList &nodesToRegister, const QStringList &registeredNodeIds, QOpcUa::UaStatusCode statusCode)
voidstateChanged(QOpcUaClient::ClientState state)
(自6.7以来) voidunregisterNodesFinished(const QStringList &nodesToUnregister, QOpcUa::UaStatusCode statusCode)
voidwriteNodeAttributesFinished(QList<QOpcUaWriteResult> results, QOpcUa::UaStatusCode serviceResult)

详细说明

QOpcUaClient

QOpcUaClient实现了与OPC UA设备和应用通信的基本客户端功能。这包括查询发现服务器以获取已知服务器、从服务器请求端点列表、连接和断开连接。

成功连接到服务器后,QOpcUaClient允许获取QOpcUaNode对象,这可以使用户进一步与OPC UA服务器上的节点进行交互。对于涉及多个节点的操作,QOpcUaClient提供了一个API,该API支持在一次对服务器的请求中读取多个节点的多个属性。

QOpcUaClient还保留了服务器命名空间数组的本地副本,该副本在成功连接后创建。在连接持续期间,可以查询或更新此信息。命名空间数组的副本也用于解析扩展节点ID和从命名空间URI创建限定名称。

节点寻址

有关节点和节点ID的介绍,请参阅QOpcUaNode

使用方法

使用QOpcUaProvider创建QOpcUaClient,使用requestEndpoints从服务器请求端点列表,并调用connectToEndpoint()连接到可用的端点之一。连接建立后,请求根节点的QOpcUaNode对象。

QOpcUaProvider provider;
if (provider.availableBackends().isEmpty())
    return;
QOpcUaClient *client = provider.createClient(provider.availableBackends()[0]);
if (!client)
    return;
// Connect to the stateChanged signal. Compatible slots of QObjects can be used instead of a lambda.
QObject::connect(client, &QOpcUaClient::stateChanged, [client](QOpcUaClient::ClientState state) {
    qDebug() << "Client state changed:" << state;
    if (state == QOpcUaClient::ClientState::Connected) {
        QOpcUaNode *node = client->node("ns=0;i=84");
        if (node)
            qDebug() << "A node object has been created";
    }
});

QObject::connect(client, &QOpcUaClient::endpointsRequestFinished,
                 [client](QList<QOpcUaEndpointDescription> endpoints) {
    qDebug() << "Endpoints returned:" << endpoints.count();
    if (endpoints.size())
        client->connectToEndpoint(endpoints.first()); // Connect to the first endpoint in the list
});

client->requestEndpoints(QUrl("opc.tcp://127.0.0.1:4840")); // Request a list of endpoints from the server

成员类型文档

enum QOpcUaClient::ClientError

此枚举类型指定客户端的当前错误状态。

常数描述
QOpcUaClient::NoError0未发生错误。
QOpcUaClient::InvalidUrl1连接到的URL被错误指定或连接到此URL失败。
QOpcUaClient::AccessDenied2尝试使用用户名/密码连接到服务器失败,因为凭证错误。
QOpcUaClient::ConnectionError3连接发生错误。
QOpcUaClient::UnknownError4发生了未知错误。
QOpcUaClient::UnsupportedAuthenticationInformation5给定的认证信息类型或数据不受支持。

enum QOpcUaClient::ClientState

此枚举类型指定客户端的连接状态。

常数描述
QOpcUaClient::Disconnected0客户端未连接到服务器。
QOpcUaClient::Connecting1客户端正在尝试连接到服务器。
QOpcUaClient::Connected2客户端已连接到服务器。
QOpcUaClient::Closing3客户端已连接,并请求从服务器断开连接。

属性文档

[只读] error : const ClientError

指定客户端的当前错误状态。

访问函数

QOpcUaClient::ClientErrorerror() const

通知信号

voiderrorChanged(QOpcUaClient::ClientError error)

[只读] 状态 : const ClientState

指定客户端的当前连接状态。

访问函数

QOpcUaClient::ClientState状态() const

通知信号

void状态改变(QOpcUaClient::ClientState 状态)

成员函数文档

[虚函数 noexcept] QOpcUaClient::~QOpcUaClient()

销毁 QOpcUaClient 实例。

bool QOpcUaClient::addNode(const QOpcUaAddNodeItem &nodeToAdd)

nodeToAdd 描述的节点添加到服务器。

如果在异步调用中已成功分配,返回 true

操作的成功结果通过 addNodeFinished() 信号返回。

以下示例代码向服务器添加新的变量节点

QOpcUaNodeCreationAttributes attributes;
attributes.setDisplayName(QOpcUaLocalizedText("en", "My new Variable node"));
attributes.setDescription(QOpcUaLocalizedText("en", "A node which has been added at runtime"));
attributes.setValue(23.0, QOpcUa::Types::Double);
attributes.setDataTypeId(QOpcUa::ns0ID(QOpcUa::NodeIds::Namespace0::Double));
attributes.setValueRank(-2); // Scalar or array
attributes.setAccessLevel(QOpcUa::AccessLevelBit::CurrentRead);
attributes.setUserAccessLevel(QOpcUa::AccessLevelBit::CurrentRead);

QOpcUaAddNodeItem item;
item.setParentNodeId(QOpcUaExpandedNodeId("ns=3;s=TestFolder"));
item.setReferenceTypeId(QOpcUa::nodeIdFromReferenceType(QOpcUa::ReferenceTypeId::Organizes));
item.setRequestedNewNodeId(QOpcUaExpandedNodeId("ns=3;s=MyNewVariableNode"));
item.setBrowseName(QOpcUaQualifiedName(3, "MyNewVariableNode"));
item.setNodeClass(QOpcUa::NodeClass::Variable);
item.setNodeAttributes(attributes);

m_client->addNode(item);

另请参阅deleteNode(),addNodeFinished() 和 QOpcUaAddNodeItem

[信号] void QOpcUaClient::addNodeFinished(QOpcUaExpandedNodeId requestedNodeId, QString assignedNodeId, QOpcUa::UaStatusCode statusCode)

addNode() 操作完成后发出此信号。 requestedNodeIdaddNode() 调用的请求节点 ID,assignedNodeId 是服务器分配给新节点的节点 ID。statusCode 包含操作的结果。如果结果是 Bad,则 assignedNodeId 为空且未将任何节点添加到服务器的地址空间。

bool QOpcUaClient::addReference(const QOpcUaAddReferenceItem &referenceToAdd)

referenceToAdd 描述的引用添加到服务器。

如果在异步调用中已成功分配,返回 true

操作的成功结果通过 addReferenceFinished() 信号返回。

以下示例代码向“对象”文件夹添加对节点的引用

QOpcUaAddReferenceItem item;
item.setSourceNodeId(QOpcUa::namespace0Id(QOpcUa::NodeIds::Namespace0::ObjectsFolder));
item.setReferenceTypeId(QOpcUa::nodeIdFromInteger(0, static_cast<quint32>(QOpcUa::ReferenceTypeId::Organizes)));
item.setIsForwardReference(true);
item.setTargetNodeId(QOpcUaExpandedNodeId("ns=3;s=MyNewVariableNode"));
item.setTargetNodeClass(QOpcUa::NodeClass::Variable);

m_client->addReference(item);

另请参阅deleteReference(),addReferenceFinished() 和 QOpcUaAddReferenceItem

[信号] void QOpcUaClient::addReferenceFinished(QString sourceNodeId, QString referenceTypeId, QOpcUaExpandedNodeId targetNodeId, bool isForwardReference, QOpcUa::UaStatusCode statusCode)

addReference() 操作完成后发出此信号。sourceNodeIdreferenceTypeIdtargetNodeIdisForwardReferenceaddReference() 调用中的值。statusCode 包含操作的结果。

[自 QtOpcUa 5.13 开始] QOpcUaApplicationIdentity QOpcUaClient::applicationIdentity() const

返回此 QOpcUaClient 实例的应用程序身份。

此函数自 QtOpcUa 5.13 起被引入。

另请参阅setApplicationIdentity

const QOpcUaAuthenticationInformation &QOpcUaClient::authenticationInformation() const

返回当前的认证信息。

另请参阅setAuthenticationInformation

QString QOpcUaClient::backend() const

返回此 QOpcUaClient 实例使用的后端名称,例如 "open62541"。

[信号,自 QtOpcUa 5.13 开始] void QOpcUaClient::connectError(QOpcUaErrorState *errorState)

在连接过程中出现错误时发出此信号。参数 errorState 包含有关错误的信息。

对于客户端错误,可以忽略这些错误,方法是在对象上调用 QOpcUaErrorState::setIgnoreError

在执行连接到此信号的槽时,后端将停止并等待所有槽返回。这允许在后台继续之前弹出用户对话框,例如询问是否信任未知证书。

此函数自 QtOpcUa 5.13 起被引入。

[可调用函数,自 QtOpcUa 5.13 开始] void QOpcUaClient::connectToEndpoint(const QOpcUaEndpointDescription &endpoint)

连接到 endpoint 中指定的 OPC UA 端点。

QEndpointDescription endpointDescription;
...
client->connectToEndpoint(endpointDescription);

通常通过调用 QOpcUaClient::requestEndpoints() 获取可用端点的列表。

如果端点需要用户名认证,至少必须在 QOpcUaAuthenticationInformation 中设置用户名。在设置认证信息之前调用此函数将使用匿名认证。

QOpcUaAuthenticationInformation authInfo;
authInfo.setUsernameAuthentication("user", "password");

client->setAuthenticationInformation(authInfo);

注意:此函数可以通过元对象系统从 QML 调用。请参阅 Q_INVOKABLE

此函数自 QtOpcUa 5.13 起被引入。

另请参阅connected(), stateChanged(), setAuthenticationInformation() 和 QOpcUaEndpointDescription

[信号] void QOpcUaClient::connected()

当建立连接时发出此信号。

[自 6.6 版本开始] QOpcUaConnectionSettings QOpcUaClient::connectionSettings() const

返回此客户端的连接设置。

此函数自 Qt 6.6 起被引入。

另请参阅setConnectionSettings

bool QOpcUaClient::deleteNode(const QString &nodeId, bool deleteTargetReferences = true)

从服务器中删除具有节点 ID nodeId 的节点。如果 deleteTargetReferencesfalse,则仅删除来源节点为 nodeId 的引用。如果 deleteTargetReferencestrue,则同时删除目标为 nodeId 的引用。

如果在异步调用中已成功分配,返回 true

操作成功的结果在 deleteNodeFinished() 信号中返回。

以下示例代码从服务器删除一个节点及其所有引用

m_client->deleteNode(QOpcUaExpandedNodeId("ns=3;s=MyNewVariableNode"), true);

另请参阅 addNode() 和 deleteNodeFinished()。

[signal] void QOpcUaClient::deleteNodeFinished(QString nodeId, QOpcUa::UaStatusCode statusCode)

在 completedNode() 操作完成后,将发出此信号。 nodeId 是 deleteNode() 调用的节点 ID。 statusCode 包含操作结果。

bool QOpcUaClient::deleteReference(const QOpcUaDeleteReferenceItem &referenceToDelete)

从服务器中删除由 referenceToDelete 描述的引用。

如果在异步调用中已成功分配,返回 true

操作成功的结果在 deleteReferenceFinished() 信号中返回。

以下示例代码从 "Objects" 文件夹中删除一个节点的引用

QOpcUaDeleteReferenceItem item;
item.setSourceNodeId(QOpcUa::namespace0Id(QOpcUa::NodeIds::Namespace0::ObjectsFolder));
item.setReferenceTypeId(QOpcUa::nodeIdFromInteger(0, static_cast<quint32>(QOpcUa::ReferenceTypeId::Organizes)));
item.setIsForwardReference(true);
item.setTargetNodeId(QOpcUaExpandedNodeId("ns=3;s=MyNewVariableNode"));
item.setDeleteBidirectional(true);

m_client->deleteReference(item);

另请参阅 addReference()、deleteReferenceFinished() 和 QOpcUaDeleteReferenceItem

[signal] void QOpcUaClient::deleteReferenceFinished(QString sourceNodeId, QString referenceTypeId, QOpcUaExpandedNodeId targetNodeId, bool isForwardReference, QOpcUa::UaStatusCode statusCode)

在 deleteReference() 操作完成后,将发出此信号。 sourceNodeIdreferenceTypeIdtargetNodeIdisForwardReference 是 deleteReference() 调用的值。 statusCode 包含操作结果。

[invokable] void QOpcUaClient::disconnectFromEndpoint()

与服务器断开连接。

注意:此函数可以通过元对象系统从 QML 调用。请参阅 Q_INVOKABLE

另请参阅 disconnected() 和 connectToEndpoint

[signal] void QOpcUaClient::disconnected()

在收到关闭请求后关闭连接时,将发出此信号。

QOpcUaEndpointDescription QOpcUaClient::endpoint() const

返回客户端当前连接到的或最后连接到的端点的描述。

[信号] void QOpcUaClient::endpointsRequestFinished(QList<QOpcUaEndpointDescription> 端点, QOpcUa::UaStatusCode statusCode, QUrl requestUrl)

此信号在 requestEndpoints() 操作完成后发出。 statusCode 包含操作的结果。如果结果是 Good,则 端点 包含服务器上所有可用的端点的描述。 requestUrl 包含在 requestEndpoints() 调用中使用的 URL。

QOpcUaClient::ClientError QOpcUaClient::error() const

返回客户端的当前错误状态。

注意:属性错误的获取函数。

bool QOpcUaClient::findServers(const QUrl &url, const QStringList &localeIds = QStringList(), const QStringList &serverUris = QStringList())

启动异步 FindServers 请求,从 url 所在的服务器或发现服务器中读取已知服务器的列表。如果异步调用已成功分派,返回 true

localeIds 可用于选择由请求返回的应用程序名称的语言。格式在 OPC UA 1.05 第 3 部分 8.4 中指定,例如 "en" 为英语,或 "de-DE" 为德语(德国)。如果指定了多个地区 ID,则服务器使用第一个匹配。如果没有匹配或 localeIds 为空,则服务器选择默认地区。

serverUris 可用于将结果限制为在其应用程序描述中具有匹配的应用程序Uri的服务器。例如,查找具有应用程序Uri "MyPLC" 的服务器的当前 URL,可以使用以下调用

client->findServers(discoveryServerUrl, QStringList(), QStringList({"MyPLC"}));

结果在 findServersFinished() 信号中返回。

[信号] void QOpcUaClient::findServersFinished(QList<QOpcUaApplicationDescription> 服务器, QOpcUa::UaStatusCode statusCode, QUrl requestUrl)

findServers() 操作完成后发出此信号。 statusCode 包含操作的结果。如果结果是 Good,则 服务器 包含所有已知服务器的应用程序描述,这些描述符合筛选条件。 requestUrl 包含在 findServers() 调用中使用的 URL。

bool QOpcUaClient::isNamespaceAutoupdateEnabled() const

返回命名空间数组的自动更新是否启用。

QStringList QOpcUaClient::namespaceArray() const

返回命名空间数组的缓存值。

只有 namespaceArrayUpdated() 信号发出后,此值才有效。

另请参阅 updateNamespaceArray() 和 namespaceArrayUpdated

[信号] void QOpcUaClient::namespaceArrayChanged(QStringList namespaces)

在命名空间数组更改后发出此信号。参数namespaces包含服务器的命名空间表内容。在namespaces中条目的索引对应于节点ID中使用的命名空间索引。

另请参阅 namespaceArrayUpdated() 和 updateNamespaceArray

[信号] void QOpcUaClient::namespaceArrayUpdated(QStringList namespaces)

updateNamespaceArray操作完成后发出此信号。参数namespaces包含服务器的命名空间表内容。在namespaces中条目的索引对应于节点ID中使用的命名空间索引。

即使在更新后命名空间数组的内容保持不变,此信号也会发出。

另请参阅 namespaceArrayChanged() 和 updateNamespaceArray

int QOpcUaClient::namespaceAutoupdateInterval() const

返回命名空间数组的当前更新间隔。

另请参阅 setNamespaceAutoupdateInterval(int interval)。

QOpcUaNode *QOpcUaClient::node(const QString &nodeId)

返回由nodeId标识的OPC UA节点的QOpcUaNode对象。调用者成为节点对象的拥有者。

如果客户端未连接,将返回nullptr。后端也可能在其他错误情况下返回nullptr(例如,节点ID格式不正确)。

QOpcUaNode *QOpcUaClient::node(const QOpcUaExpandedNodeId &expandedNodeId)

返回由expandedNodeId标识的OPC UA节点的QOpcUaNode对象。调用者成为节点对象的拥有者。

如果节点不在当前连接的服务器上,无法解析命名空间,节点ID格式不正确或客户端未连接,将返回nullptr

另请参阅 updateNamespaceArray

[信号,自QtOpcUa 5.13起] void QOpcUaClient::passwordForPrivateKeyRequired(QString keyFilePath, QString *password, bool previousTryWasInvalid)

当需要加密私钥的密码时,会发出此信号。参数 keyFilePath 包含用于加密的密钥的文件路径。如果之前的尝试解密密钥失败(即密码无效),则参数 previousTryWasInvalid 为true。参数 password 指向一个 QString,需要用实际的密码填充密钥。如果之前的尝试失败,它包含之前使用的密码。

在执行连接到此信号的槽期间,后端会停止并等待所有槽返回。这允许弹出一个用户对话框要求用户输入密码。

此函数自 QtOpcUa 5.13 起被引入。

[自 QtOpcUa 5.13起] QOpcUaPkiConfiguration QOpcUaClient::pkiConfiguration() const

返回此 QOpcUaClient 实例的 PKI 配置。

此函数自 QtOpcUa 5.13 起被引入。

另请参阅setPkiConfiguration

QOpcUaQualifiedName QOpcUaClient::qualifiedNameFromNamespaceUri(const QString &namespaceUri, const QString &name, bool *ok = nullptr) const

尝试从 namespaceUri 和名称字符串 name 创建一个具有资格的名称。返回生成的具有资格的名称。如果无法解析 namespaceUri,则返回空具有资格的名称。

ok 将设置为 true,如果已成功解析命名空间 URI。如果无法解析命名空间 URI,则将 ok 设置为 false

[自 6.3版起] QOpcUaHistoryReadResponse *QOpcUaClient::readHistoryData(const QOpcUaHistoryReadRawRequest &request)

启动对一个或多个节点进行原始历史数据读取的请求。这是 Qt OPC UA 对在OPC UA 1.05 第 4 部分 5.10.3 中定义的 OPC UA ReadHistory 服务的表示。

可以通过 QOpcUaHistoryReadRawRequest 指定起始时间戳、结束时间戳、每个节点的值数、returnBounds 和要读取的节点。

如果异步请求成功发送,则返回一个包含请求状态的 QOpcUaHistoryReadResponse。结果在 QOpcUaHistoryReadResponse::readHistoryDataFinished(const QList<QOpcUaHistoryData> &results, QOpcUa::UaStatusCode serviceResult) 信号中返回。

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

QOpcUaHistoryReadRawRequest request(
            { QOpcUaReadItem("ns=1;s=myValue1"), QOpcUaReadItem("ns=1;s=myValue2") },
            QDateTime::currentDateTime(),
            QDateTime::currentDateTime().addDays(-2),
            10,
            true);

QOpcUaHistoryReadResponse *response = m_client->readHistoryData(request);
if (response) {
   QObject::connect(response, &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();
                            }
                        }
                    });
}

该功能是在 Qt 6.3 版本中引入的。

[自 6.7版起] QOpcUaHistoryReadResponse *QOpcUaClient::readHistoryEvents(const QOpcUaHistoryReadEventRequest &request)

使用 request 中的参数,启动针对一个或多个节点 id 的读取事件历史请求。

如果异步请求成功发送,则返回一个包含请求状态的 QOpcUaHistoryReadResponse。结果在 QOpcUaHistoryReadResponse::readHistoryEventsFinished(const QList<QOpcUaHistoryEvent> &results, QOpcUa::UaStatusCode serviceResult) 信号中返回。

以下示例检索过去两天两个节点的历史事件。每次返回每个节点的最多10个事件。如果还有与筛选条件和提供的时间范围匹配的更多事件,则 hasMoreData() 将为 true,可以通过 readMoreData() 获取更多事件。

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

const QOpcUaHistoryReadEventRequest request({ QOpcUaReadItem("ns=2;s=EventHistorian"), QOpcUaReadItem("ns=2;s=EventHistorian2") },
                                            QDateTime::currentDateTime().addDays(-2), QDateTime::currentDateTime(),
                                            filter, 10);

// The response object must be freed by the user after all wanted data has been retrieved
const auto response = opcuaClient->readHistoryEvents(request);

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();
});

该函数在 Qt 6.7 中引入。

bool QOpcUaClient::readNodeAttributes(const QList<QOpcUaReadItem> &nodesToRead)

开始读取不同节点的多个属性。可以在 nodesToRead 中的每个条目中指定节点 ID、属性和索引范围。

如果异步请求已成功发送,则返回 true。结果返回在 readNodeAttributesFinished() 信号中。

此读取函数提供了读取节点属性的另一种方式,可用于在不要求使用基于 QOpcUaNode 的 API 的其他功能(如值变化的监视)的情况下,读取多个节点属性的值。请求中的所有读取项都将在单个请求中发送到服务器,并通过单个响应回答,这会生成单个 readNodeAttributesFinished() 信号。这减少了网络开销和信号槽连接的数量,如果涉及许多不同的节点。

在以下示例中,通过单个服务调用读取了同一节点的显示名称属性和值属性的“0:2”和“5:7”两个索引范围以及第二节点整个值属性。

QList<QOpcUaReadItem> request;
request.push_back(QOpcUaReadItem("ns=1;s=MyArrayNode",
                                 QOpcUa::NodeAttribute::DisplayName));
request.push_back(QOpcUaReadItem("ns=1;s=MyArrayNode",
                                 QOpcUa::NodeAttribute::Value, "0:2"));
request.push_back(QOpcUaReadItem("ns=1;s=MyArrayNode",
                                 QOpcUa::NodeAttribute::Value, "5:7"));
request.push_back(QOpcUaReadItem("ns=1;s=MyScalarNode));
m_client->readNodeAttributes(request);

另请参阅QOpcUaReadItemreadNodeAttributesFinished

[信号] void QOpcUaClient::readNodeAttributesFinished(QList<QOpcUaReadResult> results, QOpcUa::UaStatusCode serviceResult)

readNodeAttributes() 操作完成后发出此信号。

results 中的元素与请求中的元素顺序相同。对于每个请求的元素,在 results 中都有一个值以及时间戳和状态码。serviceResult 包含 OPC UA 读取服务的状态码。

另请参阅readNodeAttributesQOpcUaReadResultQOpcUaReadItem

[自6.7以来] bool QOpcUaClient::registerNodes(const QStringList &nodesToRegister)

在服务器上注册 nodesToRegister 中的节点 ID 并返回 true 如果请求已成功发送。结果返回在 registerNodesFinished() 信号中。

节点注册服务用于让服务器知道某个节点将被频繁访问,因此它可以执行保持与外部资源连接等操作。服务器还可以返回别名节点 ID,建议为数字形式。在需要在使用许多请求的具有长字符串标识符节点 ID 的节点时可能很有用。实际的性能提升(如果有)取决于服务器的实现。

已注册的节点ID仅保证在当前会话中有效。任何不再需要的注册应尽快注销,以便服务器释放相关资源。

该函数在 Qt 6.7 中引入。

另请参阅 unregisterNodes()。

[自6.7起发出信号] void QOpcUaClient::registerNodesFinished(const QStringList &nodesToRegister, const QStringList &registeredNodeIds, QOpcUa::UaStatusCode statusCode)

此信号在完成 registerNodes() 操作后发出。 nodesToRegister 包含请求中的节点ID,用于关联目的。服务器返回的节点ID位于 registeredNodeIds 中,并按请求中ID的顺序排列。statusCode 表示操作是否成功。

该函数在 Qt 6.7 中引入。

另请参阅 registerNodes()。

bool QOpcUaClient::requestEndpoints(const QUrl &url)

开始异步 GetEndpoints 请求,从位于 url 服务器读取可用端点列表。如果异步调用成功调度,则返回 true

端点信息在 endpointsRequestFinished() 信号中返回。

QString QOpcUaClient::resolveExpandedNodeId(const QOpcUaExpandedNodeId &expandedNodeId, bool *ok = nullptr) const

尝试将 expandedNodeId 解析为具有数字命名空间索引的节点ID字符串。如果转换成功,则返回节点ID字符串。

如果无法解析命名空间索引或扩展节点ID的标识部分格式不正确,则返回空字符串。《i translate="no">ok》将在转换成功时设置为 true。如果扩展节点ID无法解析,则ok 将设置为 false

[自 QtOpcUa 5.13起] void QOpcUaClient::setApplicationIdentity(const QOpcUaApplicationIdentity &identity)

将此 QOpcUaClient 实例的应用程序身份设置为 identity

此函数自 QtOpcUa 5.13 起被引入。

另请参阅 applicationIdentity()。

void QOpcUaClient::setAuthenticationInformation(const QOpcUaAuthenticationInformation &authenticationInformation)

将此客户端的认证信息设置为 authenticationInformation

另请参阅 authenticationInformation() 和 connectToEndpoint()。

[自6.6起] void QOpcUaClient::setConnectionSettings(const QOpcUaConnectionSettings &connectionSettings)

将此客户端的连接设置为 connectionSettings

示例

QOpcUaConnectionSettings settings;
// Ask the server to give localized texts in german with french as fallback
settings.setSessionLocaleIds({ "de", "fr" });
// We need to call some long running methods, increase the request timeout
settings.setRequestTimeout(std::chrono::minutes(2));
opcuaClient->setConnectionSettings(settings);

从这一点开始,将 connectionSettings 的值应用于任何新的连接。

此函数自 Qt 6.6 起被引入。

另请参阅 connectionSettings()。

void QOpcUaClient::setNamespaceAutoupdate(bool isEnabled)

启用命名空间表的自动更新。

启用此项将自动保持本地命名空间表的副本更新。namespaceArrayUpdated将会在数组变更时发出。isEnabled决定了是否启用或禁用自动更新。

将在服务器上的节点上创建一个订阅来跟踪变更。如果服务器不支持订阅,这将不起作用,并且isNamespaceAutoupdateEnabled返回false

另请参阅namespaceArray()和namespaceArrayUpdated

void QOpcUaClient::setNamespaceAutoupdateInterval(int interval)

设置命名空间表订阅的间隔。

订阅可以被服务器修改。

interval确定检查更改的间隔(以毫秒为单位)。默认值为每秒一次。

另请参阅namespaceAutoupdateInterval()和QOpcUaClient::setNamespaceAutoupdate(bool isEnabled)。

[since QtOpcUa 5.13] void QOpcUaClient::setPkiConfiguration(const QOpcUaPkiConfiguration &config)

将此QOpcUaClient实例的应用程序PKI配置设置为config

此函数自 QtOpcUa 5.13 起被引入。

另请参阅pkiConfiguration

[since QtOpcUa 5.14] QStringList QOpcUaClient::supportedSecurityPolicies() const

返回由使用后端支持的安全策略。

此功能目前作为技术预览提供,因此该函数提供的API和功能可能会在任何时候未经预先通知而更改。

此功能是在QtOpcUa 5.14中引入的。

[since QtOpcUa 5.14] QList<QOpcUaUserTokenPolicy::TokenType> QOpcUaClient::supportedUserTokenTypes() const

返回由使用后端支持的用户令牌类型。

此功能目前作为技术预览提供,因此该函数提供的API和功能可能会在任何时候未经预先通知而更改。

此功能是在QtOpcUa 5.14中引入的。

另请参阅QOpcUaUserTokenPolicy::TokenType

[since 6.7] bool QOpcUaClient::unregisterNodes(const QStringList &nodesToUnregister)

在服务器上注销nodesToUnregister中的节点ID,如果请求已成功发送,则返回true。结果将返回在unregisterNodesFinished()信号中。

要传递的节点IDnodesToUnregister必须通过registerNodes()获得。

该函数在 Qt 6.7 中引入。

另请参阅 registerNodes()。

[signal, since 6.7] void QOpcUaClient::unregisterNodesFinished(const QStringList &nodesToUnregister, QOpcUa::UaStatusCode statusCode)

unregisterNodes()操作完成后发出此信号。nodesToUnregister包含请求中的节点ID,用于相关性目的。statusCode指示操作是否成功。

该函数在 Qt 6.7 中引入。

另请参阅 unregisterNodes()。

bool QOpcUaClient::updateNamespaceArray()

从服务器请求更新命名空间数组。如果操作已成功发送,则返回true

在操作完成后,会发出namespaceArrayUpdated() 信号。

另请参阅namespaceArray()和namespaceArrayUpdated

bool QOpcUaClient::writeNodeAttributes(const QList<QOpcUaWriteItem> &nodesToWrite)

开始对多个节点上的多个属性进行写入。可以为nodesToWrite中的每个条目指定节点 ID、属性、值、值类型和索引范围。

如果异步请求已成功发送,则返回true。结果在writeNodeAttributesFinished() 信号中返回。

此写入函数提供了一种替代方法来写入节点的属性,这些属性可以用在不需要基于 QOpcUaNode 的 API 的其他功能(如监控值变化)的场景中。所有请求中的写入项都会在一个请求中发送到服务器,并在一个响应中回答,这会生成一个单个的 writeNodeAttributesFinished() 信号。这减少了涉及许多不同节点的网络开销和信号槽连接数。

在下例中,两个不同节点的 Values 属性在一个调用中写入。第二个节点的数组值只有前两个元素被覆盖

QList<QOpcUaWriteItem> request;

request.append(QOpcUaWriteItem("ns=2;s=Demo.Static.Scalar.Double", QOpcUa::NodeAttribute::Value,
                                  23.0, QOpcUa::Types::Double));
request.append(QOpcUaWriteItem("ns=2;s=Demo.Static.Arrays.UInt32", QOpcUa::NodeAttribute::Value,
                                  QVariantList({0, 1, 2}), QOpcUa::Types::UInt32, "0:2"));

m_client->writeNodeAttributes(request);

另请参阅QOpcUaWriteItemwriteNodeAttributesFinished

[信号] void QOpcUaClient::writeNodeAttributesFinished(QList<QOpcUaWriteResult> results, QOpcUa::UaStatusCode serviceResult)

writeNodeAttributes() 操作完成后发出此信号。

results中的元素与写入请求中的元素顺序相同。它们包含从服务器接收的值、时间戳和状态码,以及写入项的节点 ID、属性和索引范围。这有助于将结果与请求匹配。

serviceResult 是 OPC UA 写服务的状态码。如果 serviceResult 不是 Good,则 results 中的条目也将有一个无效的状态码,并且不得使用。

另请参阅 writeNodeAttributes() 和 QOpcUaWriteResult

© 2024 The Qt Company Ltd. 包含在此处的文档贡献是各自所有者的版权。提供的文档是根据自由软件基金会出版的GNU 自由文档许可证版本 1.3 的条款授权的。Qt 和相应标志是 The Qt Company Ltd. 在芬兰和其他国家的商标。所有其他商标均为各自所有者的财产。