QOpcUaGenericStructHandler Class
Liest die Datentypen eines Servers ein und dekodiert bzw. kodiert generische Strukturen in bzw. aus Erweiterungsobjekten. Mehr...
| Header: | #include <QOpcUaGenericStructHandler> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS OpcUa) target_link_libraries(mytarget PRIVATE Qt6::OpcUa) |
| qmake: | QT += opcua |
| Seit: | Qt 6.7 |
| Erbt von: | QObject |
Öffentliche Typen
| enum class | DataTypeKind { Unknown, Struct, Enum, Other } |
Öffentliche Funktionen
| QOpcUaGenericStructHandler(QOpcUaClient *client, QObject *parent = nullptr) | |
| bool | addCustomEnumDefinition(const QOpcUaEnumDefinition &definition, const QString &typeId, const QString &name, QOpcUa::IsAbstract isAbstract = QOpcUa::IsAbstract::NotAbstract) |
| bool | addCustomStructureDefinition(const QOpcUaStructureDefinition &definition, const QString &typeId, const QString &name, QOpcUa::IsAbstract isAbstract = QOpcUa::IsAbstract::NotAbstract) |
| QOpcUaGenericStructValue | createGenericStructValueForTypeId(const QString &typeId) |
| QOpcUaGenericStructHandler::DataTypeKind | dataTypeKindForTypeId(const QString &id) const |
| std::optional<QOpcUaGenericStructValue> | decode(const QOpcUaExtensionObject &extensionObject) const |
| std::optional<QOpcUaExtensionObject> | encode(const QOpcUaGenericStructValue &value) |
| QOpcUaEnumDefinition | enumDefinitionForTypeId(const QString &id) const |
| bool | initialize() |
(since 6.7) bool | initialized() const |
| bool | isAbstractTypeId(const QString &id) const |
| QOpcUaStructureDefinition | structureDefinitionForBinaryEncodingId(const QString &id) const |
| QOpcUaStructureDefinition | structureDefinitionForTypeId(const QString &id) const |
| QString | typeIdForBinaryEncodingId(const QString &id) const |
| QString | typeNameForBinaryEncodingId(const QString &id) const |
| QString | typeNameForTypeId(const QString &id) const |
Signale
| void | initializedChanged(bool initialized) |
Ausführliche Beschreibung
Die in OPC UA verwendete binäre Datenkodierung wurde mit Blick auf eine geringe Nachrichtengröße entwickelt und enthält keine Informationen über die Struktur der Daten. Das bedeutet, dass ein Decoder die Struktur der kodierten Daten im Voraus kennen muss, um einen Datenpuffer dekodieren zu können.
Seit OPC UA 1.04 können Knoten der Knotenklasse „DataType“ das Attribut „DataTypeDefinition“ aufweisen, das Informationen über die Felder strukturierter Typen und die Zuordnung von Enum-Werten zu Namen enthält. Zusammen mit dem Wissen darüber, wie integrierte Typen zu dekodieren sind, ermöglicht dies einem Client, generische benutzerdefinierte strukturierte Typen zu dekodieren, ohne auf externes Wissen zurückgreifen zu müssen.
QOpcUaGenericStructHandler durchläuft die Typenhierarchie eines Servers, indem er den HasSubtype-Referenzen ausgehend von „BaseDataType“ folgt und das Attribut „DataTypeDefinition“ der Knoten ausliest.
Bei strukturierten Typen, bei denen im Attribut „DataTypeDefinition“ ein „ QOpcUaStructureDefinition “-Wert vorhanden ist, ist eine automatische Dekodierung der sie enthaltenden Erweiterungsobjekte möglich. Felder mit einem integrierten Typ oder einem Typ, für den eine C++-Datenklasse existiert, werden in den entsprechenden „ Qt OPC UA “-Typ deserialisiert; andere generische Strukturen werden in eine verschachtelte „ QOpcUaGenericStructValue “ serialisiert. Alle verschachtelten generischen Strukturwerte müssen auf dem Server über einen „ QOpcUaStructureDefinition “ verfügen, andernfalls schlägt die Dekodierung fehl.
Die gleichen Bedingungen gelten für die Kodierung einer benutzerdefinierten Struktur.
Beispiel für die Dekodierung einer benutzerdefinierten Struktur:
QOpcUaGenericStructHandler handler(opcuaClient);
handler.initialize();
QObject::connect(&handler, &QOpcUaGenericStructHandler::initializedChanged, [opcuaClient, &handler](bool initialized) {
if (!initialized)
return;
auto node = opcuaClient->node("ns=4;i=3003"); // Ein Testknoten mit benutzerdefinierter Struktur im open62541-Testserver
node->readValueAttribute();
QObject::connect(node, &QOpcUaNode::attributeRead, [node, &handler](QOpcUa::NodeAttributes attr) {
if (!attr.testFlag(QOpcUa::NodeAttribute::Value)|| node->valueAttributeError() != QOpcUa::UaStatusCode::Good)
return;
auto extObj = node->valueAttribute().value<QOpcUaExtensionObject>();
qDebug() << "Got object of type" << handler.typeNameForBinaryEncodingId(extObj.encodingTypeId());
const auto result = handler.decode(extObj);
if (!result)
return;
qDebug() << *result;
});
});Beispiel für die Kodierung einer benutzerdefinierten Struktur:
QOpcUaGenericStructHandler handler(opcuaClient);
handler.initialize();
QObject::connect(&handler, &QOpcUaGenericStructHandler::initializedChanged, [opcuaClient, &handler](bool initialized) {
if (!initialized)
return;
QOpcUaGenericStructValue value = handler.createGenericStructValueForTypeId("ns=4;i=3006");
value.fieldsRef()["MandatoryMember"] = 23.0;
value.fieldsRef()["OptionalMember"] = 42.0;
const auto ext = handler.encode(value);
if (!ext)
return;
// Use the extension object to write a node's value attribute, in a method parameter, etc...
});Dokumentation zu Mitgliedstypen
enum class QOpcUaGenericStructHandler::DataTypeKind
Dieser Enum-Typ gibt die Art eines Datentyp-Knotens an.
| Konstante | Wert | Beschreibung |
|---|---|---|
QOpcUaGenericStructHandler::DataTypeKind::Unknown | 0 | Die Typknoten-ID ist unbekannt. |
QOpcUaGenericStructHandler::DataTypeKind::Struct | 1 | Die Typknoten-ID gehört zu einem strukturierten Typ. |
QOpcUaGenericStructHandler::DataTypeKind::Enum | 2 | Die Typknoten-ID gehört zu einem Enum-Typ. |
QOpcUaGenericStructHandler::DataTypeKind::Other | 3 | Die Typknoten-ID gehört zu einem Typ, der weder eine Struktur noch eine Aufzählung ist (andere integrierte Typen oder deren Untertypen) |
Dokumentation der Mitgliedsfunktionen
[explicit] QOpcUaGenericStructHandler::QOpcUaGenericStructHandler(QOpcUaClient *client, QObject *parent = nullptr)
Erstellt einen generischen Struktur-Handler für „ client “.
bool QOpcUaGenericStructHandler::addCustomEnumDefinition(const QOpcUaEnumDefinition &definition, const QString &typeId, const QString &name, QOpcUa::IsAbstract isAbstract = QOpcUa::IsAbstract::NotAbstract)
Fügt die benutzerdefinierte Enum-Definition „ definition “ zu den bekannten Typen hinzu. Dies kann verwendet werden, um benutzerdefinierte Strukturen zu unterstützen, für die der Server keine „StructureDefinition“ bereitstellt. Die Parameter „ definition “, „ typeId “ und „ name “ sind für die korrekte Dekodierung und Kodierung erforderlich. Wenn „ isAbstract “ gesetzt ist, kann der Typ nicht kodiert und dekodiert werden.
Gibt „ true “ zurück, wenn die Enum-Definition erfolgreich hinzugefügt wurde.
bool QOpcUaGenericStructHandler::addCustomStructureDefinition(const QOpcUaStructureDefinition &definition, const QString &typeId, const QString &name, QOpcUa::IsAbstract isAbstract = QOpcUa::IsAbstract::NotAbstract)
Fügt die benutzerdefinierte Strukturdefinition „ definition “ zu den bekannten Typen hinzu. Dies kann verwendet werden, um benutzerdefinierte Strukturen zu unterstützen, für die der Server keine „StructureDefinition“ bereitstellt. Die Parameter „ definition “, „ typeId “ und „ name “ sind für die korrekte Dekodierung und Kodierung erforderlich. Wenn „ isAbstract “ gesetzt ist, kann der Typ nicht kodiert und dekodiert werden.
Gibt „ true “ zurück, wenn die Strukturdefinition erfolgreich hinzugefügt wurde.
QOpcUaGenericStructValue QOpcUaGenericStructHandler::createGenericStructValueForTypeId(const QString &typeId)
Gibt einen generischen Strukturwert zurück, der bereits mit der Strukturdefinition, der Typ-ID und dem Typnamen vorbelegt ist, die typeId entsprechen. In alle Pflichtfelder wird ein ungültiger Platzhalter QVariant eingefügt.
QOpcUaGenericStructHandler::DataTypeKind QOpcUaGenericStructHandler::dataTypeKindForTypeId(const QString &id) const
Gibt den Datentyp „kind“ für den Typ-Knoten mit der ID „ id “ zurück.
std::optional<QOpcUaGenericStructValue> QOpcUaGenericStructHandler::decode(const QOpcUaExtensionObject &extensionObject) const
Konvertiert ` extensionObject ` in ` QOpcUaGenericStructValue`. Wenn die Konvertierung fehlschlägt, wird ` std::nullopt ` zurückgegeben.
std::optional<QOpcUaExtensionObject> QOpcUaGenericStructHandler::encode(const QOpcUaGenericStructValue &value)
Gibt „ value “ zurück, kodiert als „ QOpcUaExtensionObject “, oder „ std::nullopt “, falls der Wert nicht kodiert werden konnte.
QOpcUaEnumDefinition QOpcUaGenericStructHandler::enumDefinitionForTypeId(const QString &id) const
Gibt den „ QOpcUaEnumDefinition “ für die Knoten-ID id zurück. Ist die Knoten-ID unbekannt oder gehört sie nicht zu einem Enum-Typ, wird ein standardmäßig konstruierter Wert zurückgegeben.
bool QOpcUaGenericStructHandler::initialize()
Startet die Durchquerung der Datentyp-Hierarchie. Erfolg oder Misserfolg wird über das Signal „ initializedChanged “ gemeldet.
Gibt „ false “ zurück, wenn der Vorgang nicht gestartet werden kann.
[since 6.7] bool QOpcUaGenericStructHandler::initialized() const
Gibt „ true “ zurück, wenn der generische Struktur-Handler initialisiert ist.
Diese Funktion wurde in Qt 6.7 eingeführt.
[signal] void QOpcUaGenericStructHandler::initializedChanged(bool initialized)
Dieses Signal wird ausgegeben, wenn der Initialisierungsprozess abgeschlossen ist. „ initialized “ gibt an, ob die Initialisierung erfolgreich war.
bool QOpcUaGenericStructHandler::isAbstractTypeId(const QString &id) const
Gibt „true“ zurück, wenn der durch „ id “ beschriebene Datentyp abstrakt ist.
QOpcUaStructureDefinition QOpcUaGenericStructHandler::structureDefinitionForBinaryEncodingId(const QString &id) const
Gibt die „ QOpcUaStructureDefinition “ für die Binärkodierungsknoten-ID „ id “ zurück. Ist die Knoten-ID unbekannt oder gehört sie keinem Strukturtyp an, wird ein standardmäßig konstruierter Wert zurückgegeben.
QOpcUaStructureDefinition QOpcUaGenericStructHandler::structureDefinitionForTypeId(const QString &id) const
Gibt die „ QOpcUaStructureDefinition “ für die Knoten-ID id zurück. Ist die Knoten-ID unbekannt oder gehört sie nicht zu einem Strukturtyp, wird ein standardmäßig konstruierter Wert zurückgegeben.
QString QOpcUaGenericStructHandler::typeIdForBinaryEncodingId(const QString &id) const
Gibt die Typ-Knoten-ID zurück, die der Binärkodierungs-ID „ id “ zugeordnet ist.
QString QOpcUaGenericStructHandler::typeNameForBinaryEncodingId(const QString &id) const
Gibt den Typnamen zurück, der zur Knoten-ID „ id “ der binären Kodierung gehört. Ist die Knoten-ID unbekannt oder gehört sie nicht zu einem Strukturtyp, wird eine leere Zeichenkette zurückgegeben.
QString QOpcUaGenericStructHandler::typeNameForTypeId(const QString &id) const
Gibt den Typnamen zurück, der zu einem Datentypknoten gehört, der durch die Typknoten-ID id identifiziert wird. Ist die Knoten-ID unbekannt, wird eine leere Zeichenkette zurückgegeben.
© 2026 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.