QOpcUaGenericStructHandler Class
Liest die Datentypen eines Servers und decodiert/encodiert generische Strukturen von/zu Erweiterungsobjekten. Mehr...
Kopfzeile: | #include <QOpcUaGenericStructHandler> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS OpcUa) target_link_libraries(mytarget PRIVATE Qt6::OpcUa) |
qmake: | QT += opcua |
Seit: | Qt 6.7 |
Erbt: | 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) |
Detaillierte Beschreibung
Die in OPC UA verwendete Binärdatenkodierung wurde im Hinblick auf eine kleine Nachrichtengröße entwickelt und enthält keine Informationen über die Struktur der Daten. Dies 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 DataType-Knotenklasse das Attribut DataTypeDefinition haben, das Informationen über die Felder strukturierter Typen und die Zuordnung von Enum-Werten zu Namen enthält. Zusammen mit dem Wissen darüber, wie eingebaute Typen zu dekodieren sind, ermöglicht dies einem Client, generische, benutzerdefinierte strukturierte Typen zu dekodieren, ohne auf externes Wissen angewiesen zu sein.
QOpcUaGenericStructHandler durchläuft die Typenhierarchie eines Servers, indem er den HasSubtype-Referenzen ausgehend von BaseDataType folgt und das DataTypeDefinition-Attribut der Knoten liest.
Für strukturierte Typen, deren DataTypeDefinition-Attribut den Wert QOpcUaStructureDefinition enthält, ist eine automatische Dekodierung von Erweiterungsobjekten, die sie enthalten, verfügbar. Felder mit einem eingebauten 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 eine QOpcUaStructureDefinition im Server haben, sonst 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 benutzerdefinierter struct-Testknoten 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 der Mitgliedstypen
enum class QOpcUaGenericStructHandler::DataTypeKind
Dieser Aufzählungstyp gibt die Art des Datentyps eines Datentypknotens an.
Konstante | Wert | Beschreibung |
---|---|---|
QOpcUaGenericStructHandler::DataTypeKind::Unknown | 0 | Der Typ node id ist unbekannt. |
QOpcUaGenericStructHandler::DataTypeKind::Struct | 1 | Der Typ node id gehört zu einem strukturierten Typ. |
QOpcUaGenericStructHandler::DataTypeKind::Enum | 2 | Der Typ node id gehört zu einem Enum-Typ. |
QOpcUaGenericStructHandler::DataTypeKind::Other | 3 | Der Typ node id gehört zu einem Typ, der kein struct oder enum ist (andere eingebaute Typen oder deren Subtypen) |
Dokumentation der Mitgliedsfunktionen
[explicit]
QOpcUaGenericStructHandler::QOpcUaGenericStructHandler(QOpcUaClient *client, QObject *parent = nullptr)
Konstruiert einen generischen struct-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 mit der Strukturdefinition, der Typ-ID und dem Typnamen entsprechend typeId vorausgefüllt ist. Für 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 node id id zurück.
std::optional<QOpcUaGenericStructValue> QOpcUaGenericStructHandler::decode(const QOpcUaExtensionObject &extensionObject) const
Dekodiert extensionObject in eine QOpcUaGenericStructValue. Schlägt der Dekodierer fehl, wird std::nullopt
zurückgegeben.
std::optional<QOpcUaExtensionObject> QOpcUaGenericStructHandler::encode(const QOpcUaGenericStructValue &value)
Gibt value kodiert als QOpcUaExtensionObject zurück, oder std::nullopt
, wenn der Wert nicht kodiert werden konnte.
QOpcUaEnumDefinition QOpcUaGenericStructHandler::enumDefinitionForTypeId(const QString &id) const
Gibt die QOpcUaEnumDefinition für den Typ node id id zurück. Wenn die node id unbekannt ist oder nicht zu einem Enum-Typ gehört, wird ein konstruierter Standardwert zurückgegeben.
bool QOpcUaGenericStructHandler::initialize()
Startet die Durchquerung der Datentyphierarchie. Erfolg oder Misserfolg wird in dem 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 struct-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 zeigt 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ärkodierung node id id zurück. Ist die node id unbekannt oder gehört sie nicht zu einem Strukturtyp, wird ein konstruierter Standardwert zurückgegeben.
QOpcUaStructureDefinition QOpcUaGenericStructHandler::structureDefinitionForTypeId(const QString &id) const
Gibt die QOpcUaStructureDefinition für den Typ node id id zurück. Wenn die node id unbekannt ist oder nicht zu einem Strukturtyp gehört, wird ein konstruierter Standardwert zurückgegeben.
QString QOpcUaGenericStructHandler::typeIdForBinaryEncodingId(const QString &id) const
Gibt den Typ node id zurück, der mit der binären Kodierung id id verbunden ist.
QString QOpcUaGenericStructHandler::typeNameForBinaryEncodingId(const QString &id) const
Gibt den Typnamen zurück, der zu der binären Kodierungsknoten-ID id gehört. Ist die node id unbekannt oder gehört sie nicht zu einem Strukturtyp, wird eine leere Zeichenfolge zurückgegeben.
QString QOpcUaGenericStructHandler::typeNameForTypeId(const QString &id) const
Gibt den Typnamen zurück, der zu einem Datentyp-Knoten gehört, der durch die Typ-Knoten-ID id identifiziert wird. Ist die node id unbekannt, wird eine leere Zeichenfolge zurückgegeben.
© 2025 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.