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::Unknown0型ノード ID は不明です。
QOpcUaGenericStructHandler::DataTypeKind::Struct1型ノード ID は構造化型に属します。
QOpcUaGenericStructHandler::DataTypeKind::Enum2型ノード ID は列挙型に属しています。
QOpcUaGenericStructHandler::DataTypeKind::Other3型ノード 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 を公開していないカスタム構造体をサポートするために使用できます。パラメータdefinitiontypeIdname は、適切なデコードとエンコードに必要です。isAbstract がセットされていると、その型はエンコードもデコードもできません。

列挙型の定義が正常に追加された場合はtrue を返します。

bool QOpcUaGenericStructHandler::addCustomStructureDefinition(const QOpcUaStructureDefinition &definition, const QString &typeId, const QString &name, QOpcUa::IsAbstract isAbstract = QOpcUa::IsAbstract::NotAbstract)

カスタム構造体定義definition を既知の型に追加します。これは、サーバーがStructureDefinitionを公開していないカスタム構造をサポートするために使用できます。パラメータdefinitiontypeIdname は、適切なデコードとエンコードに必要です。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

型ノード IDidQOpcUaEnumDefinition を返す。ノード 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

バイナリ符号化ノード IDidQOpcUaStructureDefinition を返します。ノード 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.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。