PySide6.QtOpcUa.QOpcUaGenericStructHandler

class QOpcUaGenericStructHandler

读取服务器的数据类型,并从/向扩展对象解码/编码通用结构。更多

PySide6.QtOpcUa.QOpcUaGenericStructHandler 的继承图

在版本6.7中添加。

概要

方法

信号

注意

本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。

详细描述

OPC UA中使用的二进制数据编码设计时考虑了较小的消息大小,并且不包含任何关于数据结构的信息。这意味着解码器必须预先知道编码数据的结构,才能解码数据缓冲区。

自OPC UA 1.04版本以来,DataType节点类的节点可能具有DataTypeDefinition属性,该属性包含有关结构化类型字段的信息以及枚举值到名称的映射。结合如何解码内置类型的知识,这使得客户端能够解码通用的自定义结构化类型,而无需依赖外部知识。

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...
});
class DataTypeKind

此枚举类型指定数据类型节点的数据类型种类。

常量

描述

QOpcUaGenericStructHandler.DataTypeKind.Unknown

类型节点ID未知。

QOpcUaGenericStructHandler.DataTypeKind.Struct

类型节点ID属于结构化类型。

QOpcUaGenericStructHandler.DataTypeKind.Enum

类型节点ID属于枚举类型。

QOpcUaGenericStructHandler.DataTypeKind.Other

类型节点ID属于一个不是结构体或枚举的类型(其他内置类型或其子类型)

__init__(client[, parent=None])
Parameters:

client构建一个通用的结构处理程序。

addCustomEnumDefinition(definition, typeId, name[, isAbstract=QOpcUa.IsAbstract.NotAbstract])
Parameters:
Return type:

布尔

将自定义枚举定义 definition 添加到已知类型中。这可以用于支持服务器未公开 StructureDefinition 的自定义结构。参数 definitiontypeIdname 是正确解码和编码所必需的。如果设置了 isAbstract,则该类型无法进行编码和解码。

如果枚举定义成功添加,则返回 true

addCustomStructureDefinition(definition, typeId, name[, isAbstract=QOpcUa.IsAbstract.NotAbstract])
Parameters:
Return type:

布尔

将自定义结构定义 definition 添加到已知类型中。这可以用于支持服务器未公开 StructureDefinition 的自定义结构。参数 definitiontypeIdname 是正确解码和编码所必需的。如果设置了 isAbstract,则该类型无法进行编码和解码。

如果结构定义成功添加,则返回 true

createGenericStructValueForTypeId(typeId)
Parameters:

typeId – str

Return type:

QOpcUaGenericStructValue

返回一个预填充了结构体定义、类型ID和类型名称的通用结构体值,对应于typeId。对于所有必填字段,将插入一个无效的占位符QVariant。

dataTypeKindForTypeId(id)
Parameters:

id – str

Return type:

DataTypeKind

返回类型节点ID id 的数据类型种类。

enumDefinitionForTypeId(id)
Parameters:

id – str

Return type:

QOpcUaEnumDefinition

返回类型节点ID idQOpcUaEnumDefinition。如果节点ID未知或不属于枚举类型,则返回默认构造的值。

initialize()
Return type:

布尔

开始数据类型层次结构的遍历。成功或失败将在initializedChanged信号中报告。

如果操作无法启动,则返回 false

initialized()
Return type:

布尔

如果通用结构处理程序已初始化,则返回 true

initializedChanged(initialized)
Parameters:

initialized – 布尔值

当初始化过程完成时,会发出此信号。initialized 表示初始化是否成功。

isAbstractTypeId(id)
Parameters:

id – str

Return type:

布尔

如果由id描述的数据类型是抽象的,则返回true。

structureDefinitionForBinaryEncodingId(id)
Parameters:

id – str

Return type:

QOpcUaStructureDefinition

返回二进制编码节点ID idQOpcUaStructureDefinition。如果节点ID未知或不属于结构类型,则返回默认构造的值。

structureDefinitionForTypeId(id)
Parameters:

id – str

Return type:

QOpcUaStructureDefinition

返回类型节点ID idQOpcUaStructureDefinition。如果节点ID未知或不属于结构类型,则返回默认构造的值。

typeIdForBinaryEncodingId(id)
Parameters:

id – str

Return type:

字符串

返回与二进制编码ID id 关联的类型节点ID。

typeNameForBinaryEncodingId(id)
Parameters:

id – str

Return type:

字符串

返回属于二进制编码节点ID id 的类型名称。如果节点ID未知或不属于结构类型,则返回空字符串。

typeNameForTypeId(id)
Parameters:

id – str

Return type:

字符串

返回由类型节点ID id 标识的数据类型节点的类型名称。如果节点ID未知,则返回空字符串。