- class 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 –
QOpcUaClient
parent –
QObject
为
client
构造一个通用的结构处理程序。- addCustomEnumDefinition(definition, typeId, name[, isAbstract=false])#
- 参数:
definition –
QOpcUaEnumDefinition
typeId – str
name – str
isAbstract – bool
- 返回类型:
bool
将自定义枚举定义
definition
添加到已知类型中。这可以用于支持服务器没有公开 StructureDefinition 的自定义结构。参数definition
、typeId
和name
对于正确的解码和编码是必需的。如果设置了isAbstract
,则无法进行编码和解码。如果枚举定义成功添加,返回
true
。- dataTypeKindForTypeId(id)#
- 参数:
id – str
- 返回类型:
为类型节点 ID
id
返回数据类型。- enumDefinitionForTypeId(id)#
- 参数:
id – str
- 返回类型:
返回类型节点 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 未知,则返回空字符串。