class QOpcUaGenericStructHandler#

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

Inheritance diagram of 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::initializeFinished, [opcuaClient, &handler](bool success) {
    if (!success)
        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::initializeFinished, [opcuaClient, &handler](bool success) {
    if (!success)
        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])#
参数:

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

addCustomEnumDefinition(definition, typeId, name[, isAbstract=false])#
参数:
返回类型:

bool

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

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

dataTypeKindForTypeId(id)#
参数:

id – str

返回类型:

DataTypeKind

为类型节点 ID id 返回数据类型。

enumDefinitionForTypeId(id)#
参数:

id – str

返回类型:

QOpcUaEnumDefinition

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

initialize()#
返回类型:

bool

启动数据类型分层遍历。成功或失败将通过 initializeFinished 信号进行报告。

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

initializeFinished(success)#
参数:

success – bool

当初始化完成后会发出此信号。success 表示初始化是否成功。

isAbstractTypeId(id)#
参数:

id – str

返回类型:

bool

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

typeIdForBinaryEncodingId(id)#
参数:

id – str

返回类型:

str

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

typeNameForBinaryEncodingId(id)#
参数:

id – str

返回类型:

str

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

typeNameForTypeId(id)#
参数:

id – str

返回类型:

str

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