Qt OPC UA 数据类型生成器
从 Qt 6.7 开始,Qt OPC UA 提供了一个名为qopcuaxmldatatypes2cpp 的数据类型生成器,该工具可根据 .bsd 文件中的枚举和结构化类型,生成与Qt OPC UA 兼容的 C++ 枚举和数据类。此外,该工具还具备从 CSV 文件生成节点 ID 枚举的辅助功能。
该生成器是一个命令行工具,可通过以下参数进行控制:
| 长 | 简短 | 用途 |
|---|---|---|
| --input | -i | 一个 .bsd 文件,其中包含的所有枚举和结构体类型都将被生成。可多次使用,以生成多个模型的代码。 |
| --dependencyinput | -d | 一个依赖输入 .bsd 文件,其中仅会生成由通过 --input 传递的输入文件中的某个结构体所必需的类型。可多次使用,以支持与多个其他模型存在依赖关系的模型。 |
| --nodeids | -n | 包含节点 ID 的 .csv 文件的名称及其路径,用于生成对应的枚举类型,例如:MyModel:/path/to/nodeids.csv => 枚举类 MyModelNodeId。可多次指定。 |
| --output | -o | 生成的文件将存放的输出目录。 |
| --prefix | -p | 生成的文件、枚举和类名称的前缀。默认值为GeneratedOpcUa 。 |
| --bundle | -b | 生成捆绑文件 <前缀>datatypes.h 和 <前缀>datatypes.cpp,其中包含所有生成的文件 |
每次运行都会生成以下文件:
- 一个.h 文件,其中包含一个包含所有枚举类型的命名空间
- 针对每个结构化类型,生成一个.h 文件和一个.cpp 文件
- 一个.h 文件和一个.cpp 文件,其中包含编码和解码方法
- 如果至少指定了一次 -n 选项,则包含节点 ID 枚举的.h 文件
- 若指定了-b选项,则生成捆绑文件 <prefix>datatypes.h 和 <prefix>datatypes.cpp
CMake 集成
qt_opcua_generate_datatypes()函数接受一个或多个输入.bsd文件以及任何必需的依赖.bsd文件,并调用qopcuaxmldatatypes2cpp。 生成的源文件和头文件将写入OUTPUT_DIR,并添加到作为第一个参数指定的目标中。
OUTPUT_DIR或其父目录还必须添加到该目标的包含目录中。
以下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© 2026 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.