Der Qt OPC UA Datentyp-Generator

Beginnend mit Qt 6.7 wird Qt OPC UA mit einem Datentypgenerator namens qopcuaxmldatatypes2cpp ausgeliefert, der Qt OPC UA kompatible C++ Aufzählungen und Datenklassen aus Enums und strukturierten Typen in .bsd-Dateien generiert. Als sekundäre Funktion werden Node-ID-Enums aus CSV-Dateien generiert.

Der Generator ist ein Kommandozeilenwerkzeug, das mit den folgenden Argumenten gesteuert werden kann:

LangKurzZweck
--Eingabe-iEine .bsd-Datei, für die alle enthaltenen enum- und struct-Typen generiert werden. Kann mehr als einmal verwendet werden, um Code für mehrere Modelle zu generieren.
--dependencyinput-dEine Abhängigkeitseingabe-.bsd-Datei, in der nur Typen generiert werden, die von einer Struktur aus einer mit --input übergebenen Eingabedatei benötigt werden. Kann mehr als einmal verwendet werden, um Modelle mit Abhängigkeiten zu mehreren anderen Modellen zu berücksichtigen.
--nodeids-nEin Name und der Pfad zu einer .csv-Datei mit Knoten-IDs, für die eine Enum generiert werden soll, z. B. MyModel:/path/to/nodeids.csv => enum class MyModelNodeId. Kann mehrere Male angegeben werden.
--output-oDas Ausgabeverzeichnis, in dem die generierten Dateien abgelegt werden.
--prefix-pDas Präfix für die generierten Datei-, Enum- und Klassennamen. Der Standardwert ist GeneratedOpcUa.
--bundle-bErzeugt die Bundle-Dateien <prefix>datatypes.h und <prefix>datatypes.cpp, die alle erzeugten Dateien #include

Die folgenden Dateien werden für jeden Lauf erzeugt:

  • Eine .h Datei, die einen Namespace mit allen aufgezählten Typen enthält
  • Eine .h und eine .cpp Datei für jeden strukturierten Typ
  • Eine .h und eine .cpp Datei mit den Kodierungs- und Dekodierungsmethoden
  • Eine .h Datei, die die Node-ID-Enums enthält, wenn -n mindestens einmal angegeben wird
  • Die Bundle-Dateien <prefix>datatypes.h und <prefix>datatypes.cpp, wenn -b angegeben wird

CMake-Integration

Die Funktion qt_opcua_generate_datatypes() nimmt eine oder mehrere Eingabe- .bsd-Dateien und alle erforderlichen Abhängigkeits- .bsd-Dateien und ruft qopcuaxmldatypes2cpp auf. Die erzeugten Quell- und Headerdateien werden nach OUTPUT_DIR geschrieben und zu dem als erstes Argument angegebenen Ziel hinzugefügt.

Das OUTPUT_DIR oder sein übergeordnetes Verzeichnis muss auch zu den Include-Verzeichnissen des Ziels hinzugefügt werden.

Der folgende CMakeLists.txt-Ausschnitt zeigt, wie der Codegenerator in ein CMake-basiertes Projekt integriert wird:

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)

Die generierten Dateien können dann in jeder Header- oder Quelldatei verwendet werden, indem die beiden Top-Level-Header für die Datentypen und die Encoder/Decoder-Klasse eingebunden werden.

#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.