QOpcUaGenericStructHandler Class
サーバーのデータ型を読み込み、拡張オブジェクトから/拡張オブジェクトへの汎用構造体をデコード/エンコードします。詳細...
Header: | #include <QOpcUaGenericStructHandler> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS OpcUa) target_link_libraries(mytarget PRIVATE Qt6::OpcUa) |
qmake: | QT += opcua |
Since: | Qt 6.7 |
Inherits: | QObject |
パブリック型
enum class | DataTypeKind { Unknown, Struct, Enum, Other } |
パブリック関数
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 |
シグナル
void | initializedChanged(bool initialized) |
詳細説明
OPC UAで使用されているバイナリデータエンコーディングは、小さなメッセージサイズを念頭に設計されており、データの構造に関する情報は一切含まれていません。このため、デコーダはエンコードされたデータの構造を事前に知っていなければ、データバッファをデコードすることができません。
OPC UA 1.04以降、DataTypeノードクラスのノードは、DataTypeDefinition属性を持つことができ、この属性には、構造化型のフィールドとenum値の名前へのマッピングに関する情報が含まれています。組み込み型をデコードする方法に関する知識とともに、これによってクライアントは、外部の知識に頼ることなく、一般的なカスタム構造化型をデコードできます。
QOpcUaGenericStructHandler は、BaseDataType から始まる HasSubtype 参照をたどってサーバーの型階層を走査し、ノードの DataTypeDefinition 属性を読み取ります。
DataTypeDefinition属性にQOpcUaStructureDefinition 値が存在する構造化型については、それを含む拡張オブジェクトの自動デコードが可能です。組み込み型または C++ データクラスが存在する型のフィールドは、対応する Qt OPC UA 型にデシリアライズされ、その他の汎用構造体はネストされたQOpcUaGenericStructValue にシリアライズされます。ネストされたジェネリック構造体の値はすべて、サーバー内にQOpcUaStructureDefinition がなければデコードに失敗します。
カスタム構造体をエンコードする場合も、同じ条件が適用されます。
カスタム構造体のデコード例
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"); // A custom struct test node in the 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; }); });
カスタム構造体をエンコードする例:
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... });
メンバ型の説明
enum class QOpcUaGenericStructHandler::DataTypeKind
この列挙型は、データ型ノードのデータ型の種類を指定します。
定数 | 値 | 説明 |
---|---|---|
QOpcUaGenericStructHandler::DataTypeKind::Unknown | 0 | 型ノード ID は不明です。 |
QOpcUaGenericStructHandler::DataTypeKind::Struct | 1 | 型ノード ID は構造化型に属します。 |
QOpcUaGenericStructHandler::DataTypeKind::Enum | 2 | 型ノード ID は列挙型に属しています。 |
QOpcUaGenericStructHandler::DataTypeKind::Other | 3 | 型ノード ID が struct 型でも enum 型でもない型(他の組み込み型またはそのサブタイプ)に属している。 |
メンバ関数 ドキュメント
[explicit]
QOpcUaGenericStructHandler::QOpcUaGenericStructHandler(QOpcUaClient *client, QObject *parent = nullptr)
client の汎用構造体ハンドラを構築します。
bool QOpcUaGenericStructHandler::addCustomEnumDefinition(const QOpcUaEnumDefinition &definition, const QString &typeId, const QString &name, QOpcUa::IsAbstract isAbstract = QOpcUa::IsAbstract::NotAbstract)
カスタム enum 定義definition を既知の型に追加します。これは、サーバーが StructureDefinition を公開していないカスタム構造体をサポートするために使用できます。パラメータdefinition 、typeId 、name は、適切なデコードとエンコードに必要です。isAbstract がセットされていると、その型はエンコードもデコードもできません。
列挙型の定義が正常に追加された場合はtrue
を返します。
bool QOpcUaGenericStructHandler::addCustomStructureDefinition(const QOpcUaStructureDefinition &definition, const QString &typeId, const QString &name, QOpcUa::IsAbstract isAbstract = QOpcUa::IsAbstract::NotAbstract)
カスタム構造体定義definition を既知の型に追加します。これは、サーバーがStructureDefinitionを公開していないカスタム構造をサポートするために使用できます。パラメータdefinition 、typeId 、name は、適切なデコードとエンコードに必要です。isAbstract がセットされている場合、その型をエンコードおよびデコードすることはできません。
構造体定義が正常に追加された場合はtrue
を返す。
QOpcUaGenericStructValue QOpcUaGenericStructHandler::createGenericStructValueForTypeId(const QString &typeId)
typeId に対応する構造体定義、型 ID、および型名があらかじめ入力された汎用構造体値を返します。すべての必須フィールドには、無効なプレースホルダQVariant が挿入されます。
QOpcUaGenericStructHandler::DataTypeKind QOpcUaGenericStructHandler::dataTypeKindForTypeId(const QString &id) const
型ノード IDid のデータ型 kind を返します。
std::optional<QOpcUaGenericStructValue> QOpcUaGenericStructHandler::decode(const QOpcUaExtensionObject &extensionObject) const
extensionObject QOpcUaGenericStructValueデコーダが失敗すると、std::nullopt
が返されます。
std::optional<QOpcUaExtensionObject> QOpcUaGenericStructHandler::encode(const QOpcUaGenericStructValue &value)
QOpcUaExtensionObject としてエンコードされたvalue を返し、値がエンコードできなかった場合はstd::nullopt
を返す。
QOpcUaEnumDefinition QOpcUaGenericStructHandler::enumDefinitionForTypeId(const QString &id) const
型ノード IDid のQOpcUaEnumDefinition を返す。ノード ID が不明な場合、または列挙型に属さない場合は、既定の構築値が返されます。
bool QOpcUaGenericStructHandler::initialize()
データ型階層の走査を開始します。成功または失敗はinitializedChanged シグナルで報告されます。
操作を開始できない場合はfalse
を返す。
[since 6.7]
bool QOpcUaGenericStructHandler::initialized() const
ジェネリック構造体ハンドラが初期化されている場合はtrue
を返します。
この関数はQt 6.7で導入されました。
[signal]
void QOpcUaGenericStructHandler::initializedChanged(bool initialized)
このシグナルは、初期化プロセスが終了したときに発行されます。initialized は、初期化が成功したかどうかを示します。
bool QOpcUaGenericStructHandler::isAbstractTypeId(const QString &id) const
id で記述されたデータ型が抽象の場合、true を返します。
QOpcUaStructureDefinition QOpcUaGenericStructHandler::structureDefinitionForBinaryEncodingId(const QString &id) const
バイナリ符号化ノード IDid のQOpcUaStructureDefinition を返します。ノード ID が不明な場合、または構造体タイプに属さない場合は、デフォルトの構築された値が返されます。
QOpcUaStructureDefinition QOpcUaGenericStructHandler::structureDefinitionForTypeId(const QString &id) const
型ノード IDid に対するQOpcUaStructureDefinition を返します。ノード ID が不明な場合、または struct 型に属さない場合、デフォルトの構築済み値が返されます。
QString QOpcUaGenericStructHandler::typeIdForBinaryEncodingId(const QString &id) const
バイナリ符号化 idid に関連付けられた型ノード ID を返します。
QString QOpcUaGenericStructHandler::typeNameForBinaryEncodingId(const QString &id) const
バイナリ符号化ノード IDid に属する型名を返します。ノード ID が不明な場合、または構造体タイプに属さない場合は、空の文字列が返されます。
QString QOpcUaGenericStructHandler::typeNameForTypeId(const QString &id) const
型ノード IDid で識別されるデータ型ノードに属する型名を返す。ノード ID が不明な場合は、空文字列が返されます。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。