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
© 2024 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.