本页内容

QOpcUaClient Class

QOpcUaClient 支持与 OPC UA 服务器进行交互。更多内容...

标题: #include <QOpcUaClient>
CMake: find_package(Qt6 REQUIRED COMPONENTS OpcUa)
target_link_libraries(mytarget PRIVATE Qt6::OpcUa)
qmake: QT += opcua
继承自: QObject

公共类型

enum ClientError { NoError, InvalidUrl, AccessDenied, ConnectionError, UnknownError, …, CertificateUntrusted }
enum ClientState { Disconnected, Connecting, Connected, Closing }

属性

公共函数

virtual ~QOpcUaClient()
bool addNode(const QOpcUaAddNodeItem &nodeToAdd)
bool addReference(const QOpcUaAddReferenceItem &referenceToAdd)
(since QtOpcUa 5.13) QOpcUaApplicationIdentity applicationIdentity() const
const QOpcUaAuthenticationInformation &authenticationInformation() const
QString backend() const
(since QtOpcUa 5.13) void connectToEndpoint(const QOpcUaEndpointDescription &endpoint)
(since 6.6) QOpcUaConnectionSettings connectionSettings() const
bool deleteNode(const QString &nodeId, bool deleteTargetReferences = true)
bool deleteReference(const QOpcUaDeleteReferenceItem &referenceToDelete)
void disconnectFromEndpoint()
QOpcUaEndpointDescription endpoint() const
QOpcUaClient::ClientError error() const
bool findServers(const QUrl &url, const QStringList &localeIds = QStringList(), const QStringList &serverUris = QStringList())
bool isNamespaceAutoupdateEnabled() const
QStringList namespaceArray() const
int namespaceAutoupdateInterval() const
QOpcUaNode *node(const QOpcUaExpandedNodeId &expandedNodeId)
QOpcUaNode *node(const QString &nodeId)
(since QtOpcUa 5.13) QOpcUaPkiConfiguration pkiConfiguration() const
QOpcUaQualifiedName qualifiedNameFromNamespaceUri(const QString &namespaceUri, const QString &name, bool *ok = nullptr) const
(since 6.3) QOpcUaHistoryReadResponse *readHistoryData(const QOpcUaHistoryReadRawRequest &request)
(since 6.7) QOpcUaHistoryReadResponse *readHistoryEvents(const QOpcUaHistoryReadEventRequest &request)
bool readNodeAttributes(const QList<QOpcUaReadItem> &nodesToRead)
(since 6.7) bool registerNodes(const QStringList &nodesToRegister)
bool requestEndpoints(const QUrl &url)
QString resolveExpandedNodeId(const QOpcUaExpandedNodeId &expandedNodeId, bool *ok = nullptr) const
(since QtOpcUa 5.13) void setApplicationIdentity(const QOpcUaApplicationIdentity &identity)
void setAuthenticationInformation(const QOpcUaAuthenticationInformation &authenticationInformation)
(since 6.6) void setConnectionSettings(const QOpcUaConnectionSettings &connectionSettings)
void setNamespaceAutoupdate(bool isEnabled)
void setNamespaceAutoupdateInterval(int interval)
(since QtOpcUa 5.13) void setPkiConfiguration(const QOpcUaPkiConfiguration &config)
QOpcUaClient::ClientState state() const
(since QtOpcUa 5.14) QStringList supportedSecurityPolicies() const
(since QtOpcUa 5.14) QList<QOpcUaUserTokenPolicy::TokenType> supportedUserTokenTypes() const
(since 6.7) bool unregisterNodes(const QStringList &nodesToUnregister)
bool updateNamespaceArray()
bool writeNodeAttributes(const QList<QOpcUaWriteItem> &nodesToWrite)

信号

void addNodeFinished(QOpcUaExpandedNodeId requestedNodeId, QString assignedNodeId, QOpcUa::UaStatusCode statusCode)
void addReferenceFinished(QString sourceNodeId, QString referenceTypeId, QOpcUaExpandedNodeId targetNodeId, bool isForwardReference, QOpcUa::UaStatusCode statusCode)
(since QtOpcUa 5.13) void connectError(QOpcUaErrorState *errorState)
void connected()
void deleteNodeFinished(QString nodeId, QOpcUa::UaStatusCode statusCode)
void deleteReferenceFinished(QString sourceNodeId, QString referenceTypeId, QOpcUaExpandedNodeId targetNodeId, bool isForwardReference, QOpcUa::UaStatusCode statusCode)
void disconnected()
void endpointsRequestFinished(QList<QOpcUaEndpointDescription> endpoints, QOpcUa::UaStatusCode statusCode, QUrl requestUrl)
void errorChanged(QOpcUaClient::ClientError error)
void findServersFinished(QList<QOpcUaApplicationDescription> servers, QOpcUa::UaStatusCode statusCode, QUrl requestUrl)
void namespaceArrayChanged(QStringList namespaces)
void namespaceArrayUpdated(QStringList namespaces)
(since QtOpcUa 5.13) void passwordForPrivateKeyRequired(QString keyFilePath, QString *password, bool previousTryWasInvalid)
void readNodeAttributesFinished(QList<QOpcUaReadResult> results, QOpcUa::UaStatusCode serviceResult)
(since 6.7) void registerNodesFinished(const QStringList &nodesToRegister, const QStringList &registeredNodeIds, QOpcUa::UaStatusCode statusCode)
void stateChanged(QOpcUaClient::ClientState state)
(since 6.7) void unregisterNodesFinished(const QStringList &nodesToUnregister, QOpcUa::UaStatusCode statusCode)
void writeNodeAttributesFinished(QList<QOpcUaWriteResult> results, QOpcUa::UaStatusCode serviceResult)

详细说明

QOpcUaClient

QOpcUaClient 实现了与支持 OPC UA 的设备和应用程序进行通信的基本客户端功能。这包括向发现服务器查询已知服务器、向服务器请求端点列表,以及建立和断开连接。

成功连接到服务器后,QOpcUaClient 允许获取 `QOpcUaNode ` 对象,从而能够与 OPC UA 服务器上的节点进行进一步交互。对于涉及多个节点的操作,QOpcUaClient 提供了一个 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;
// 订阅 stateChanged 信号。可以使用 QObject 的兼容槽(slot)代替 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>端点) {
    qDebug() << "Endpoints returned:" << endpoints.count();
   if(endpoints.size())
        client->connectToEndpoint(endpoints.first());// 连接到列表中的第一个端点
});

client->requestEndpoints(QUrl("opc.tcp://127.0.0.1:4840"));// 向服务器请求端点列表

成员类型文档

enum QOpcUaClient::ClientError

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

常量值描述
QOpcUaClient::NoError0未发生错误。
QOpcUaClient::InvalidUrl1指定的连接 URL 有误,或者连接到该 URL 失败。
QOpcUaClient::AccessDenied2尝试使用用户名/密码连接到服务器失败,原因是凭据错误。
QOpcUaClient::ConnectionError3连接过程中发生错误。
QOpcUaClient::UnknownError4发生未知错误。
QOpcUaClient::UnsupportedAuthenticationInformation5不支持所提供的身份验证信息类型或数据。
QOpcUaClient::InvalidAuthenticationInformation6提供的身份验证信息无效
QOpcUaClient::InvalidEndpointDescription7端点描述无效,例如 URL 为空或缺少用户身份令牌。
QOpcUaClient::NoMatchingUserIdentityTokenFound8所选端点不支持请求的令牌类型或支持的策略。
QOpcUaClient::UnsupportedSecurityPolicy9该端点的安全策略不受支持。
QOpcUaClient::InvalidPki10无法加载 PKI 的证书或密钥,或者其无效
QOpcUaClient::CertificateUntrusted11服务器证书不受信任

enum QOpcUaClient::ClientState

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

常量值描述
QOpcUaClient::Disconnected0客户端未连接到服务器。
QOpcUaClient::Connecting1客户端当前正在连接到服务器。
QOpcUaClient::Connected2客户端已连接到服务器。
QOpcUaClient::Closing3客户端已连接,并向服务器请求断开连接。

属性文档

[read-only] error : ClientError

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

访问函数:

QOpcUaClient::ClientError error() const

通知信号:

void errorChanged(QOpcUaClient::ClientError error)

[read-only] state : ClientState

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

访问函数:

QOpcUaClient::ClientState state() const

通知信号:

void stateChanged(QOpcUaClient::ClientState state)

成员函数文档

[virtual noexcept] QOpcUaClient::~QOpcUaClient()

销毁该QOpcUaClient 实例。

bool QOpcUaClient::addNode(const QOpcUaAddNodeItem &nodeToAdd)

在服务器上添加由nodeToAdd 描述的节点。

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

操作的成功与否通过addNodeFinished() 信号返回。

以下示例代码在服务器上添加了一个新的 Variable 节点:

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 。

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

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

bool QOpcUaClient::addReference(const QOpcUaAddReferenceItem &referenceToAdd)

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

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

操作的成功状态将通过addReferenceFinished() 信号返回。

以下示例代码将一个节点的引用添加到“Objects”文件夹中:

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 。

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

该信号在addReference()操作完成后触发。sourceNodeId 、referenceTypeId 、targetNodeId 和isForwardReference 分别表示addReference()调用返回的值。statusCode 包含该操作的结果。

[since QtOpcUa 5.13] QOpcUaApplicationIdentity QOpcUaClient::applicationIdentity() const

返回此QOpcUaClient 实例的应用程序标识。

该函数在 QtOpcUa 5.13 中引入。

另请参阅 setApplicationIdentity()。

const QOpcUaAuthenticationInformation &QOpcUaClient::authenticationInformation() const

返回当前的身份验证信息。

另请参阅 setAuthenticationInformation()。

QString QOpcUaClient::backend() const

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

[signal, since QtOpcUa 5.13] void QOpcUaClient::connectError(QOpcUaErrorState *errorState)

当建立连接时发生错误,会发出此信号。参数errorState 包含有关该错误的信息。

如果是客户端错误,可以通过对该对象调用QOpcUaErrorState::setIgnoreError 来忽略这些错误。

在执行与该信号关联的槽时,后端将暂停并等待所有槽返回。这允许在后端继续运行之前弹出用户对话框,例如询问最终用户是否信任未知证书。

该函数在 QtOpcUa 5.13 中引入。

[invokable, since 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 。

[signal] void QOpcUaClient::connected()

当连接建立后,会发出此信号。

[since 6.6] QOpcUaConnectionSettings QOpcUaClient::connectionSettings() const

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

该函数于 Qt 6.6 中引入。

另请参阅 setConnectionSettings()。

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

从服务器中删除节点 ID 为nodeId 的节点。如果deleteTargetReferences 为false ,则仅删除源节点为nodeId 的引用;如果deleteTargetReferences 为true ,则还会删除目标节点为nodeId 的引用。

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

操作的成功状态将通过deleteNodeFinished() 信号返回。

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

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

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

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

该信号在deleteNode()操作完成后触发。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()操作完成后触发。sourceNodeId 、referenceTypeId 、targetNodeId 和isForwardReference 分别表示deleteReference()调用返回的值。statusCode 包含该操作的结果。

[invokable] void QOpcUaClient::disconnectFromEndpoint()

与服务器断开连接。

注意: 可通过元对象系统和 QML 调用此 函数。参见Q_INVOKABLE 。

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

[signal] void QOpcUaClient::disconnected()

当连接因关闭请求而被关闭时,会发出此信号。

QOpcUaEndpointDescription QOpcUaClient::endpoint() const

返回客户端当前连接或上次连接的端点的描述。

[signal] void QOpcUaClient::endpointsRequestFinished(QList<QOpcUaEndpointDescription> endpoints, QOpcUa::UaStatusCode statusCode, QUrl requestUrl)

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

QOpcUaClient::ClientError QOpcUaClient::error() const

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

注意: 这是 error 属性的获取器 函数。

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 可用于将结果限制为应用描述中包含匹配 applicationUri 的服务器。例如,要查找 applicationUri 为“MyPLC”的服务器的当前 URL,可使用以下调用:

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

结果将通过findServersFinished()信号返回。

[signal] void QOpcUaClient::findServersFinished(QList<QOpcUaApplicationDescription> servers, QOpcUa::UaStatusCode statusCode, QUrl requestUrl)

该信号在findServers()操作完成后触发。statusCode 包含该操作的结果。如果结果为Good ,则servers 包含被查询服务器已知且符合过滤条件的所有服务器的应用程序描述。requestUrl 包含在findServers()调用中使用的URL。

bool QOpcUaClient::isNamespaceAutoupdateEnabled() const

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

QStringList QOpcUaClient::namespaceArray() const

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

该值仅在发出namespaceArrayUpdated() 信号后才有效。

另请参阅 updateNamespaceArray() 和namespaceArrayUpdated()。

[signal] void QOpcUaClient::namespaceArrayChanged(QStringList namespaces)

该信号在命名空间数组发生变化后触发。namespaces 包含服务器命名空间表的内容。namespaces 中条目的索引与节点 ID 中使用的命名空间索引相对应。

另请参阅 namespaceArrayUpdated() 和updateNamespaceArray()。

[signal] void QOpcUaClient::namespaceArrayUpdated(QStringList namespaces)

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

如果更新后命名空间数组的内容保持不变,该信号仍会被触发。

另请参阅 namespaceArrayChanged() 和updateNamespaceArray()。

int QOpcUaClient::namespaceAutoupdateInterval() const

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

另请参阅 setNamespaceAutoupdateInterval(int interval)。

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

返回一个与由expandedNodeId 标识的 OPC UA 节点关联的 `QOpcUaNode ` 对象。调用者将成为该节点对象的所有者。

如果该节点不在当前连接的服务器上、无法解析命名空间、节点 ID 格式错误,或者客户端未连接,则返回 `nullptr `。

另请参阅 updateNamespaceArray()。

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

返回一个与由nodeId 标识的 OPC UA 节点关联的QOpcUaNode 对象。调用方成为该节点对象的所有者。

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

[signal, since QtOpcUa 5.13] void QOpcUaClient::passwordForPrivateKeyRequired(QString keyFilePath, QString *password, bool previousTryWasInvalid)

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

在执行与该信号关联的槽时,后端将被暂停并等待所有槽返回。这使得可以弹出用户对话框,向最终用户询问密码。

该功能于 QtOpcUa 5.13 版本中引入。

[since 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 如果命名空间 URI 解析成功,则将true 设置为false 。如果命名空间 URI 无法解析,则将ok 设置为 。

[since 6.3] QOpcUaHistoryReadResponse *QOpcUaClient::readHistoryData(const QOpcUaHistoryReadRawRequest &request)

启动一个用于一个或多个节点的原始历史数据读取服务request 。这是OPC UA 1.05 第 4 部分 5.10.3 节中定义的用于读取原始历史数据的 OPC UA ReadHistory 服务的Qt OPC UA 表示形式。

在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 中引入。

[since 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");

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

// 在获取所有所需数据后,用户必须释放响应对象
const autoresponse= opcuaClient->readHistoryEvents(request);

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

    // 输出目前获得的结果
    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);

另请参阅 QOpcUaReadItem 和readNodeAttributesFinished()。

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

该信号在readNodeAttributes()操作完成后触发。

results 中的元素顺序与请求中的元素顺序一致。对于每个被请求的元素,results 中都包含该元素的值、时间戳以及状态码。serviceResult 包含来自 OPC UA 读取服务的状态码。

另请参阅 readNodeAttributes()、QOpcUaReadResult 以及QOpcUaReadItem 。

[since 6.7] bool QOpcUaClient::registerNodes(const QStringList &nodesToRegister)

将节点 ID 注册到服务器上的nodesToRegister ,如果请求已成功分发,则返回true 。结果通过registerNodesFinished() 信号返回。

节点注册服务用于告知服务器某个节点将被频繁访问,以便服务器执行保持与外部资源连接处于打开状态等操作。 服务器还可以返回一个别名节点 ID,建议该 ID 为数字形式。如果一个具有长字符串标识符的节点 ID 在许多请求中被使用,这可能会派上用场。实际的性能提升(如果有的话)取决于服务器的实现。

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

该函数于 Qt 6.7 中引入。

另请参阅 unregisterNodes()。

[signal, since 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 的标识符部分格式不正确,则返回空字符串。如果转换成功,ok 将被设置为true 。如果无法解析展开后的节点 ID,ok 将被设置为false 。

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

将此QOpcUaClient 实例的应用程序标识设置为identity 。

该函数在 QtOpcUa 5.13 中引入。

另请参阅 applicationIdentity()。

void QOpcUaClient::setAuthenticationInformation(const QOpcUaAuthenticationInformation &authenticationInformation)

将此客户端的身份验证信息设置为authenticationInformation 。

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

[since 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 的设置值。

open62541 插件支持更新当前连接的会话区域设置 ID。所有其他被修改但无法在连接期间更新的值都会触发警告消息,并将在下次调用connectToEndpoint() 时生效。

该函数在 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()信号返回。

传递给nodesToUnregister 的节点ID必须通过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);

另请参阅 QOpcUaWriteItem 和writeNodeAttributesFinished()。

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

该信号在writeNodeAttributes()操作完成后触发。

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

serviceResult 是来自 OPC UA 写入服务的状态码。如果serviceResult 不是Good ,则results 中的条目也具有无效的状态码,不得使用。

另请参阅 writeNodeAttributes() 和QOpcUaWriteResult 。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.