diff options
| author | Thomas Vanbesien <tvanbesi@proton.me> | 2026-02-24 16:51:15 +0100 |
|---|---|---|
| committer | Thomas Vanbesien <tvanbesi@proton.me> | 2026-02-24 16:51:15 +0100 |
| commit | 75d77c39924629eaebf6b721a541407e19ced762 (patch) | |
| tree | 27cd8050e0296bf61dc3a007e12c49452cc6cf2b | |
| parent | 0a3a5c241e0de6587f0c19fd3ef73024fa1d4b52 (diff) | |
| download | BobinkQtOpcUa-75d77c39924629eaebf6b721a541407e19ced762.tar.gz BobinkQtOpcUa-75d77c39924629eaebf6b721a541407e19ced762.zip | |
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.
| -rw-r--r-- | demo/NodePage.qml | 2 | ||||
| -rw-r--r-- | src/OpcUaMonitoredNode.cpp | 41 | ||||
| -rw-r--r-- | src/OpcUaMonitoredNode.h | 4 |
3 files changed, 47 insertions, 0 deletions
diff --git a/demo/NodePage.qml b/demo/NodePage.qml index 9b23502..e089f0e 100644 --- a/demo/NodePage.qml +++ b/demo/NodePage.qml @@ -307,6 +307,8 @@ Page { + "\nDescription: " + (node.info.description || "—") + "\nNode Class: " + (node.info.nodeClass || "—") + "\nData Type: " + (node.info.dataType || "—") + + "\nValue Rank: " + (node.info.valueRank || "—") + + "\nArray Dimensions: " + (node.info.arrayDimensions || "—") + "\nAccess Level: " + node.info.accessLevel + "\nStatus: " + (node.info.status || "—") + "\nSource Time: " + (node.info.sourceTimestamp.toLocaleString() || "—") 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; |
