Qt OPC UA 数据类型生成器

从 Qt 6.7 开始,Qt OPC UA 附带了一个名为qopcuaxmldatatypes2cpp 的数据类型生成器,它可以从 .bsd 文件中的枚举和结构化类型生成Qt OPC UA 兼容 C++ 的枚举和数据类型。作为辅助功能,它还能从 CSV 文件生成节点 ID 枚举。

生成器是一个命令行工具,可通过以下参数控制:

短参数目的
--输入-i一个 .bsd 文件,将为其生成所有包含的枚举和结构类型。可多次使用,为多个模型生成代码。
--依赖输入-d依赖输入 .bsd 文件,只生成通过 --input 传递的输入文件中结构体所需的类型。可多次使用,以适应与多个其他模型有依赖关系的模型。
--节点编号-n包含节点 id 的 .csv 文件的名称和路径,用于生成枚举,例如 MyModel:/path/to/nodeids.csv => 枚举类 MyModelNodeId。可多次指定。
--输出-o生成文件的输出目录。
--前缀-p生成的文件、枚举和类名称的前缀。默认值为GeneratedOpcUa
-bundle-b生成捆绑文件 <prefix>datatypes.h 和 <prefix>datatypes.cpp,其中 #include 所有生成的文件

每次运行都会生成以下文件

  • 一个.h 文件,包含一个包含所有枚举类型的命名空间
  • 每个结构化类型的一个.h 和一个.cpp 文件
  • 一个.h 和一个.cpp 文件,包含编码和解码方法
  • 一个.h 文件,其中包含节点 ID 枚举(如果至少给出一次 -n
  • 捆绑文件 <prefix>datatypes.h 和 <prefix>datatypes.cpp (如果给定-b)

CMake 集成

qt_opcua_generate_datatypes()函数接收一个或多个输入.bsd文件和任何所需的依赖.bsd文件,并调用qopcuaxmldatatypes2cpp。生成的源文件和头文件会写入OUTPUT_DIR,并添加到第一个参数指定的目标中。

OUTPUT_DIR或其父级目录也必须添加到目标的 include 目录中。

下面的CMakeLists.txt片段展示了如何将代码生成器集成到基于 CMake 的项目中:

find_package(Qt6 REQUIRED COMPONENTS Core OpcUa)

qt_standard_project_setup()

qt_add_executable(my_codegen
    mycodegen.cpp
)

qt_opcua_generate_datatypes(
    my_codegen # The target to add the generated files to
    INPUT_BSD "${CMAKE_CURRENT_SOURCE_DIR}/mymodel.bsd" # Must be set at least once if INPUT_CSV_MAP is not set
    INPUT_BSD "${CMAKE_CURRENT_SOURCE_DIR}/myothermodel.bsd"
    DEPENDENCY_BSD "${CMAKE_CURRENT_SOURCE_DIR}/mydependency.bsd" # Optional
    INPUT_CSV_MAP "MyModel:${CMAKE_CURRENT_SOURCE_DIR}/mymodel.csv" # Must be set at least once if INPUT_BSD is not set
    INPUT_CSV_MAP "MyOtherModel:${CMAKE_CURRENT_SOURCE_DIR}/myothermodel.csv"
    PREFIX "GeneratedOpcUa" # Mandatory
    OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated" # Mandatory
)

target_include_directories(my_codegen
    PRIVATE
        ${CMAKE_CURRENT_BINARY_DIR}
)

target_link_libraries(my_codegen PRIVATE Qt6::Core Qt6::OpcUa)

通过包含数据类型和编码器/解码器类的两个顶级头文件,生成的文件可以在任何头文件或源文件中使用。

#include <generated/generatedopcuabinarydeencoder.h> // If INPUT_BSD was set
#include <generated/generatedopcuadatatypes.h> // If INPUT_BSD was set
#include <generated/generatedopcuanodeids.h> // If INPUT_CSV_MAP was set

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.