QOpcUaClient 类
QOpcUaClient 允许与 OPC UA 服务器交互。 更多信息...
头文件 | #include <QOpcUaClient> |
CMake | find_package(Qt6 REQUIRED COMPONENTS OpcUa) target_link_libraries(mytarget PRIVATE Qt6::OpcUa) |
qmake | QT += opcua |
继承 | QObject |
公共类型
枚举 | ClientError { NoError, InvalidUrl, AccessDenied, ConnectionError, UnknownError, UnsupportedAuthenticationInformation } |
枚举 | 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 QString &nodeId) |
QOpcUaNode * | node(const QOpcUaExpandedNodeId &expandedNodeId) |
(since QtOpcUa 5.13) QOpcUaPkiConfiguration | pkiConfiguration() const |
QOpcUaQualifiedName | qualifiedNameFromNamespaceUri(const QString &namespaceUri, const QString &name, bool *ok = nullptr) const |
(自6.3以来) QOpcUaHistoryReadResponse * | readHistoryData(const QOpcUaHistoryReadRawRequest &request) |
(自6.7以来) QOpcUaHistoryReadResponse * | readHistoryEvents(const QOpcUaHistoryReadEventRequest &request) |
bool | readNodeAttributes(const QList<QOpcUaReadItem> &nodesToRead) |
(自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) |
(自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 |
(自QtOpcUa 5.14以来) QStringList | supportedSecurityPolicies() const |
(自QtOpcUa 5.14以来) QList<QOpcUaUserTokenPolicy::TokenType> | supportedUserTokenTypes() const |
(自6.7以来) bool | unregisterNodes(const QStringList &nodesToUnregister) |
bool | updateNamespaceArray() |
bool | writeNodeAttributes(const QList<QOpcUaWriteItem> &nodesToWrite) |
Signal信号
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) |
(自6.7以来) void | registerNodesFinished(const QStringList &nodesToRegister, const QStringList ®isteredNodeIds, QOpcUa::UaStatusCode statusCode) |
void | stateChanged(QOpcUaClient::ClientState state) |
(自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,该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::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 | 客户端已连接,并请求从服务器断开连接。 |
属性文档
[只读]
error : const ClientError
指定客户端的当前错误状态。
访问函数
QOpcUaClient::ClientError | error() const |
通知信号
void | errorChanged(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() 操作完成后发出此信号。 requestedNodeId 是 addNode() 调用的请求节点 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() 操作完成后发出此信号。sourceNodeId,referenceTypeId,targetNodeId 和 isForwardReference 是 addReference() 调用中的值。statusCode 包含操作的结果。
[自 QtOpcUa 5.13 开始]
QOpcUaApplicationIdentity QOpcUaClient::applicationIdentity() const
返回此 QOpcUaClient 实例的应用程序身份。
此函数自 QtOpcUa 5.13 起被引入。
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 起被引入。
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)
在 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() 操作完成后,将发出此信号。 sourceNodeId、referenceTypeId、targetNodeId 和 isForwardReference 是 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);
另请参阅QOpcUaReadItem 和 readNodeAttributesFinished。
[信号]
void QOpcUaClient::readNodeAttributesFinished(QList<QOpcUaReadResult> results, QOpcUa::UaStatusCode serviceResult)
在 readNodeAttributes() 操作完成后发出此信号。
在 results 中的元素与请求中的元素顺序相同。对于每个请求的元素,在 results 中都有一个值以及时间戳和状态码。serviceResult 包含 OPC UA 读取服务的状态码。
另请参阅readNodeAttributes,QOpcUaReadResult 和 QOpcUaReadItem。
[自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 ®isteredNodeIds, 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);
另请参阅QOpcUaWriteItem 和 writeNodeAttributesFinished。
[信号]
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. 在芬兰和其他国家的商标。所有其他商标均为各自所有者的财产。