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, UnsupportedAuthenticationInformation } |
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 ®isteredNodeIds, 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 对象。
QOpcUaProviderQOpcUaClient *client =provider.createClient(provider.availableBackends()[0]);if(!client)return;// 连接到 stateChanged 信号。可以使用 QObject 的兼容槽来代替 lambda。QObject::connect(client, &QOpcUaClient::stateChanged, [client](QOpcUaClient::ClientState state) { qDebug() << "Client state changed:" << state; 如果(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());// Connectto the first endpoint in the list}); client->requestEndpoints(QUrl("opc.tcp://127.0.0.1:4840"));// 向服务器请求端点列表
成员类型文档
enum QOpcUaClient::ClientError
该枚举类型指定客户端当前的错误状态。
常量 | 值 | 说明 |
---|---|---|
QOpcUaClient::NoError | 0 | 未发生错误。 |
QOpcUaClient::InvalidUrl | 1 | 错误指定了要连接的 URL,或与该 URL 的连接失败。 |
QOpcUaClient::AccessDenied | 2 | 由于凭证错误,使用用户名/密码连接服务器的尝试失败。 |
QOpcUaClient::ConnectionError | 3 | 连接发生错误。 |
QOpcUaClient::UnknownError | 4 | 出现未知错误。 |
QOpcUaClient::UnsupportedAuthenticationInformation | 5 | 不支持给定的身份验证信息类型或数据。 |
enum QOpcUaClient::ClientState
该枚举类型指定客户端的连接状态。
常量 | 值 | 描述 |
---|---|---|
QOpcUaClient::Disconnected | 0 | 客户端未连接服务器。 |
QOpcUaClient::Connecting | 1 | 客户端正在连接服务器。 |
QOpcUaClient::Connected | 2 | 客户端已连接服务器。 |
QOpcUaClient::Closing | 3 | 客户端已连接服务器并请求断开连接。 |
属性文档
[read-only]
error : const ClientError
指定客户端当前的错误状态。
访问功能:
QOpcUaClient::ClientError | error() const |
通知信号:
void | errorChanged(QOpcUaClient::ClientError error) |
[read-only]
state : const ClientState
指定客户端当前的连接状态。
访问功能:
QOpcUaClient::ClientState | state() const |
Notifier 信号:
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 是 () 调用请求的节点 ID, 是服务器分配给新节点的节点 ID。 包含操作结果。如果结果是 ,则 为空,服务器地址空间中没有添加任何节点。addNode assignedNodeId 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 。
[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 是来自 () 调用的节点 ID。 包含操作结果。deleteNode statusCode
bool QOpcUaClient::deleteReference(const QOpcUaDeleteReferenceItem &referenceToDelete)
从服务器中删除referenceToDelete 所描述的引用。
如果异步调用调度成功,则返回true
。
操作成功与否将在deleteReferenceFinished() 信号中返回。
以下示例代码将删除 "对象 "文件夹中一个节点的引用:
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 包含操作结果。如果结果是 , 包含服务器上所有可用端点的描述。 包含 () 调用中使用的 URL。Good endpoints requestUrl requestEndpoints
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 "表示德语(德国)。如果指定了多个本地标识,服务器将使用第一个匹配的本地标识。如果没有匹配或 为空,服务器将选择默认的语言。localeIds
serverUris 可用于将结果限制为在其应用程序描述中具有匹配 applicationUri 的服务器。例如,要查找应用程序 Uri 为 "MyPLC "的服务器的当前 URL,可使用以下调用:
client->findServers(discoveryServerUrl, QStringList(), QStringList({"MyPLC"}));
结果将在findServersFinished() 信号中返回。
[signal]
void QOpcUaClient::findServersFinished(QList<QOpcUaApplicationDescription> servers, QOpcUa::UaStatusCode statusCode, QUrl requestUrl)
findServers statusCode 包含操作结果。如果结果是 ,则 包含查询服务器已知的符合筛选条件的所有服务器的应用程序描述。 包含 () 调用中使用的 URL。Good servers requestUrl findServers
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 包含服务器命名空间表的内容。 中条目索引与节点 id 中使用的命名空间索引相对应。namespaces
如果名称空间数组内容在更新后保持不变,则仍会发出该信号。
另请参阅 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 解析成功,"...... "将被设置为 。如果无法解析名称空间 URI, 将被设置为 。true
ok false
[since 6.3]
QOpcUaHistoryReadResponse *QOpcUaClient::readHistoryData(const QOpcUaHistoryReadRawRequest &request)
为一个或多个节点启动读取原始历史数据request 。这是 OPC UA ReadHistory 服务的Qt OPC UA 表示法,用于读取OPC UA 1.05 第 4 部分 5.10.3 中定义的原始历史数据。
开始时间戳、结束时间戳、每个节点的值数、returnBounds 和要读取的节点可在QOpcUaHistoryReadRawRequest 中指定。
如果异步请求已成功发送,则返回一个包含请求状态的QOpcUaHistoryReadResponse 。结果在QOpcUaHistoryReadResponse::readHistoryDataFinished(const QList<QOpcUaHistoryData> &results, QOpcUa::UaStatusCode serviceResult) 信号中返回。
在下面的示例中,将请求并打印两个节点过去两天的历史数据。结果限制为每个节点十个值。
QOpcUaHistoryReadRawRequest请求({ 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 过滤器; 过滤器<<QOpcUaSimpleAttributeOperand("Message"); filter<<QOpcUaSimpleAttributeOperand("Time");constQOpcUaHistoryReadEventRequestrequest({ QOpcUaReadItem("ns=2;s=EventHistorian")、 QOpcUaReadItem("ns=2;s=EventHistorian2")}、 QDateTime::currentDateTime().addDays(-2)、 QDateTime::currentDateTime(),filter,10);// 用户必须在获取所有想要的数据后释放响应对象const autoresponse= opcuaClient->readHistoryEvents(request);QObject连接(response, &QOpcUaHistoryReadResponsereadHistoryEventsFinished, this, [response](constQList<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);
另请参阅 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)
在服务器上注册nodesToRegister 中的节点 ID,如果请求已成功发送,则返回true
。结果在registerNodesFinished() 信号中返回。
节点注册服务用于让服务器知道某个节点将被频繁访问,这样服务器就可以执行一些操作,如保持与外部资源的连接处于打开状态。服务器还可能返回一个别名节点 ID,建议使用数字。如果在许多请求中都使用了带有长字符串标识符节点 id 的节点,这可能会派上用场。真正的性能增益(如果有的话)取决于服务器的实现。
已注册的节点 id 只保证在当前会话中有效。任何不再需要的注册都应尽快取消注册,以便服务器可以释放相关资源。
此函数在 Qt 6.7 中引入。
另请参阅 unregisterNodes()。
[signal, since 6.7]
void QOpcUaClient::registerNodesFinished(const QStringList &nodesToRegister, const QStringList ®isteredNodeIds, QOpcUa::UaStatusCode statusCode)
registerNodes nodesToRegister 包含请求中的节点 id,用于关联目的。服务器返回的节点 id 在 中,其顺序与请求中的 id 相同。 表示操作是否成功。registeredNodeIds 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
插件支持更新当前连接的会话本地标识。所有其他已修改但不支持在连接时更新的值都会导致一条警告消息,并将在下一次调用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 。
© 2025 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.