The Qt OPC UA data type generator
Starting with Qt 6.7, Qt OPC UA comes with a data type generator named qopcuaxmldatatypes2cpp which generates Qt OPC UA compatible C++ enumerations and data classes from enums and structured types in .bsd files. As a secondary function, node id enums are generated from CSV files.
The generator is a command line tool which can be controlled by the following arguments:
| Long | Short | Purpose |
|---|---|---|
| --input | -i | A .bsd file for which all contained enum and struct types will be generated. Can be used more than once to generate code for multiple models. |
| --dependencyinput | -d | A dependency input .bsd file where only types required by a struct from an input file passed via --input will be generated. Can be used more than once to accommodate models with dependencies to multiple other models. |
| --nodeids | -n | A name and the path to a .csv file with node ids to generate an enum for, e.g. MyModel:/path/to/nodeids.csv => enum class MyModelNodeId. Can be specified multiple times. |
| --output | -o | The output directory where the generated files will be placed. |
| --prefix | -p | The prefix for the generated file, enum and class names. The default value is GeneratedOpcUa. |
| --bundle | -b | Generate bundle files <prefix>datatypes.h and <prefix>datatypes.cpp which #include all generated files |
The following files are generated for each run:
- One .h file containing a namespace with all enumerated types
- One .h and one .cpp file for each structured type
- One .h and one .cpp file containing encoding and decoding methods
- One .h file containing the node id enums if -n is given at least once
- The bundle files <prefix>datatypes.h and <prefix>datatypes.cpp if -b is given
CMake Integration
The qt_opcua_generate_datatypes() function takes one or multiple input .bsd files and any required dependency .bsd files and invokes qopcuaxmldatatypes2cpp. The generated source and header files are written to OUTPUT_DIR and are added to the target specified as the first argument.
The OUTPUT_DIR or its parent directory must also be added to the target's include directories.
The following CMakeLists.txt snippet shows how to integrate the code generator in to a CMake based project:
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)
The generated files can then be used in any header or source file by including the two top-level headers for the data types and the encoder/decoder class.
#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