From 75d77c39924629eaebf6b721a541407e19ced762 Mon Sep 17 00:00:00 2001 From: Thomas Vanbesien Date: Tue, 24 Feb 2026 16:51:15 +0100 Subject: Add ValueRank and ArrayDimensions to OpcUaNodeInfo Read both attributes at node setup alongside the existing metadata. ValueRank is mapped to human-readable names (Scalar, OneDimension, etc.) and ArrayDimensions is formatted as a comma-separated size list. Both are shown in the demo tooltip. --- src/OpcUaMonitoredNode.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ src/OpcUaMonitoredNode.h | 4 ++++ 2 files changed, 45 insertions(+) (limited to 'src') diff --git a/src/OpcUaMonitoredNode.cpp b/src/OpcUaMonitoredNode.cpp index c5f1dc0..9155838 100644 --- a/src/OpcUaMonitoredNode.cpp +++ b/src/OpcUaMonitoredNode.cpp @@ -155,6 +155,8 @@ OpcUaMonitoredNode::setupNode () m_node->readAttributes ( QOpcUa::NodeAttribute::DisplayName | QOpcUa::NodeAttribute::Description | QOpcUa::NodeAttribute::NodeClass | QOpcUa::NodeAttribute::DataType + | QOpcUa::NodeAttribute::ValueRank + | QOpcUa::NodeAttribute::ArrayDimensions | QOpcUa::NodeAttribute::AccessLevel); if (m_monitored) @@ -238,6 +240,45 @@ OpcUaMonitoredNode::handleAttributeUpdated (QOpcUa::NodeAttribute attr, m_info.dataType = rawId; } break; + case QOpcUa::NodeAttribute::ValueRank: + { + qint32 vr = value.toInt (); + switch (vr) + { + case -3: + m_info.valueRank = QStringLiteral ("ScalarOrOneDimension"); + break; + case -2: + m_info.valueRank = QStringLiteral ("Any"); + break; + case -1: + m_info.valueRank = QStringLiteral ("Scalar"); + break; + case 0: + m_info.valueRank = QStringLiteral ("OneOrMoreDimensions"); + break; + case 1: + m_info.valueRank = QStringLiteral ("OneDimension"); + break; + case 2: + m_info.valueRank = QStringLiteral ("TwoDimensions"); + break; + default: + m_info.valueRank = QString::number (vr) + + QStringLiteral ("Dimensions"); + break; + } + } + break; + case QOpcUa::NodeAttribute::ArrayDimensions: + { + QStringList dims; + const QVariantList list = value.toList (); + for (const QVariant &dim : list) + dims << QString::number (dim.toUInt ()); + m_info.arrayDimensions = dims.join (QStringLiteral (", ")); + } + break; case QOpcUa::NodeAttribute::AccessLevel: { quint32 bits = value.toUInt (); diff --git a/src/OpcUaMonitoredNode.h b/src/OpcUaMonitoredNode.h index 2ecffb7..3314874 100644 --- a/src/OpcUaMonitoredNode.h +++ b/src/OpcUaMonitoredNode.h @@ -30,6 +30,8 @@ struct OpcUaNodeInfo Q_PROPERTY (QString description MEMBER description) Q_PROPERTY (QString nodeClass MEMBER nodeClass) Q_PROPERTY (QString dataType MEMBER dataType) + Q_PROPERTY (QString valueRank MEMBER valueRank) + Q_PROPERTY (QString arrayDimensions MEMBER arrayDimensions) Q_PROPERTY (QString accessLevel MEMBER accessLevel) Q_PROPERTY (QString status MEMBER status) Q_PROPERTY (QDateTime sourceTimestamp MEMBER sourceTimestamp) @@ -40,6 +42,8 @@ public: QString description; QString nodeClass; QString dataType; + QString valueRank; + QString arrayDimensions; QString accessLevel; QString status; QDateTime sourceTimestamp; -- cgit v1.2.3