QOpcUaNode允许与OPC UA节点进行交互。
1.详细描述:
节点是OPC UA地址空间的基本构建块。它具有浏览名称、值、关联属性等属性,并且可以引用地址空间中的其他节点。节点被组织在名称空间中,并且具有ID,例如可以是数字、字符串、名称空间特定格式(不透明)或全局唯一标识符。节点由名称空间ID和节点ID标识。该标识符通常以字符串的形式给出:例如,位于名称空间0中并具有数字标识符42的节点的标识符,则字符串为ns=0;i=42。具有字符串标识符的节点可以通过“ns=0;s=myStringIdentifier”寻址。
此类型的对象归用户所有,在不再需要时必须删除。只要创建它们的QOpcUaClient存在,它们就有效。
2.读写属性
当调用readAttributes()或readAttributeRange()时,将从服务器读取节点属性。结果缓存在本地,并且可以在接收到attributeRead信号后使用attribute()进行检索。
如果用户具有必要的权限,则可以使用writeAttribute()、writeAttributes()和writeAttributeRange()写入属性。使用attributeWritten信号报告写入操作成功。
attributeError()包含与属性上的最后一次读取或写入操作相关联的状态代码。这是OPC UA服务返回的低级别状态代码。通过使用QOpcUa::ErrorCategory()将此状态代码转换为QOpcUa::ErrorCategory,可以简化此状态代码.
3.订阅和监视项目
订阅是OPC UA中的一个概念,它允许接收数据更改的通知或在发生事件的情况下接收通知,而不是连续轮询节点以获取更改。监视的项定义了如何监视节点的属性以进行更改。它们被添加到订阅中,并且它们生成的任何通知都会通过订阅转发给用户。用户可以配置更新的间隔以及监视项目和订阅的许多其他选项。
QOpcUaNode提供了一个抽象,用于与订阅和监视项目交互。enableMonitoring()为一个或多个属性启用数据更改通知。dataChangeOccurred信号包含新值,并且本地缓存会更新。disableMonitoring()将禁用数据更改通知。monitoringStatusChanged信号通知监视状态的更改,例如在手动启用和禁用或服务器上的状态更改之后。
事件监视使用相同的API进行设置和生命周期管理。EventNotifier属性必须使用EventFilter进行监控,该EventFilter选择所需的事件字段并根据用户定义的标准筛选报告的事件。事件在eventOccurred()信号中报告为QVariantList,其中包含所选事件字段的值。
订阅和监视项的设置可以在运行时使用modifyMonitoring()进行修改。
4.浏览地址空间
OPC UA地址空间由通过引用连接的节点组成。browseChildren在前向上遵循这些引用,并在browseFinished信号中返回连接到QOpcUaNode实例后面节点的所有节点的属性。browse()类似于browseChildren(),但提供了更多选项来配置浏览调用。
5.方法调用
OPC UA指定了用户可以调用的服务器上的方法。QOpcUaNode通过callMethod支持这一点,该方法获取参数并在methodCallFinished信号中返回调用结果。
6.解析浏览路径
为了支持根据类型描述进行编程,OPC UA支持解析从某个节点开始的浏览名称路径,以获得目标节点的节点id。resolveBrowsePath()方法遵循从调用它的节点开始的路径,并在resolveBrowserPathFinished()信号中返回结果。
7.实例
有关将客户端连接到服务器并获取QOpcUaNode对象的信息,请参阅QOpcUaClient。
成功创建节点后,将从服务器中读取根节点的BrowseName:
QOpcUaNode *rootNode; // Created before, see QOpcUaClient documentation.
// Connect to the attributeRead signal. Compatible slots of QObjects can be used instead of a lambda.
QObject::connect(rootNode, &QOpcUaNode::attributeRead, [rootNode, client](QOpcUa::NodeAttributes attr) {
qDebug() << "Signal for attributes:" << attr;
if (rootNode->attributeError(QOpcUa::NodeAttribute::BrowseName) != QOpcUa::UaStatusCode::Good) {
qDebug() << "Failed to read attribute:" << rootNode->attributeError(QOpcUa::NodeAttribute::BrowseName);
client->disconnectFromEndpoint();
}
qDebug() << "Browse name:" << rootNode->attribute(QOpcUa::NodeAttribute::BrowseName).value<QOpcUaQualifiedName>().name();
});
rootNode->readAttributes(QOpcUa::NodeAttribute::BrowseName); // Start a read operation for the node's BrowseName attribute.