PLCnext CLI Templates: C++-Entwicklung effizienter gestalten
Dieser Artikel bezieht sich auf PLCnext CLI Version 22.0.0 LTS.
Wenn Sie PLCnext Control-Geräte mit C++ programmieren, haben Sie vermutlich bereits die mit der PLCnext CLI installierten Code-Vorlagen verwendet.
In Visual Studio und Eclipse wählen Sie beim Erstellen eines neuen Projekts mit dem PLCnext-Projektassistenten (installiert mit der PLCnext IDE-Erweiterung) die gewünschte Projektvorlage aus.
Auch beim Generieren eines neuen C++-Projekts auf der Kommandozeile mit der PLCnext CLI müssen Sie eine Projektvorlage angeben.
Die drei Standard-Projektvorlagen sind:
project Vorlage für Benutzerprogramme. Sie werden vom PLM (Program Library Manager) verwaltet.
acfproject Vorlage für komponentenbasierte Plattformentwicklung. Die resultierende Komponente wird vom ACF (Application Component Framework) verwaltet.
consumablelibrary Vorlage für eine Bibliothek, die von anderen Projekten verwendet werden kann.
Diese Informationen lassen sich durch Ausführen des Befehls plcncli new anzeigen. Weitere Informationen zu diesen Projekttypen finden Sie im PLCnext Info Center:
- Abgrenzung von ACF und PLM
- Erstellen und Verwenden von Shared Libraries
In diesem Artikel wird beschrieben, wie Sie zusätzliche, mit der PLCnext CLI installierte Projektvorlagen aktivieren und nutzen, und wie Sie eigene Projektvorlagen erstellen und verwenden.
Zunächst schauen wir uns an, wie das PLCnext CLI Template-System funktioniert.
Das PLCnext CLI Template-System
Die PLCnext CLI enthält eine Standardeinstellung namens TemplateLocations, die angibt, wo Code-Vorlagen zu finden sind. Den Wert dieser Einstellung können Sie mit folgendem Befehl anzeigen:
user@machine:~$ plcncli get setting TemplateLocations
{
"setting": {
"TemplateLocations": "./Templates/Templates.xml"
}
}
Der Pfad zur XML-Datei ist relativ zum plcncli-Installationspfad.
Wechselt man in das Verzeichnis ./Templates, findet man die Datei Templates.xml und mehrere Unterverzeichnisse.
Den Inhalt der Templates.xml anzeigen:
user@machine:~/plcncli/Templates$ cat Templates.xml
<?xml version="1.0" encoding="utf-8"?>
<Templates xmlns="https://www.phoenixcontact.com/schema/clitemplates">
<Include type="Template">ProjectTemplate/TemplateDescription.xml</Include>
<Include type="Template">ProgramTemplate/TemplateDescription.xml</Include>
<Include type="Format">ProjectTemplate/FormatTemplates.xml</Include>
<Include type="Template">ComponentTemplate/TemplateDescription.xml</Include>
<Include type="Template">BaseTemplates/BaseTemplateDescription.xml</Include>
<Include type="Template">BaseTemplates/CodeTemplateDescription.xml</Include>
<Include type="Fields">BaseTemplates/FieldTemplates.xml</Include>
<Include type="Types">BaseTemplates/TypeTemplates.xml</Include>
<Include type="Format">BaseTemplates/FormatTemplates.xml</Include>
<Include type="Template">AcfProjectTemplate/TemplateDescription.xml</Include>
<Include type="Template">BaseProjectTemplate/TemplateDescription.xml</Include>
<Include type="Template">AcfComponentTemplate/TemplateDescription.xml</Include>
<Include type="Template">BaseComponentTemplate/TemplateDescription.xml</Include>
<Include type="Template">ConsumableLibraryTemplate/TemplateDescription.xml</Include>
</Templates>
Man sieht Verweise auf TemplateDescription.xml-Dateien verschiedener Typen in den Unterverzeichnissen. Diese enthalten Anweisungen, was die PLCnext CLI tun soll, wenn diese Vorlage verwendet wird.
Die gezeigten Template-Beschreibungsdateien implementieren die drei Standard-Projektvorlagen, die Sie bereits kennen.
Zusätzliche Vorlagen aktivieren
Es gibt eine „versteckte“ Projektvorlage, die standardmäßig mit der PLCnext CLI installiert wird, aber standardmäßig nicht verfügbar ist:
minimumproject Entspricht acfproject, aber ohne die Möglichkeit, Port-Variablen im Global Data Space zu erstellen.
Wir können diese Vorlage für die PLCnext CLI verfügbar machen, indem wir die Datei MinimalAcfTemplates.xml – die Sie vielleicht bereits im Templates-Verzeichnis bemerkt haben – zur Template-Locations-Einstellung hinzufügen:
user@machine:~$ plcncli set setting TemplateLocations ./Templates/MinimalAcfTemplates.xml --add
Die neue XML-Datei wurde nun zu den Template-Locations hinzugefügt:
user@machine:~$ plcncli get setting TemplateLocations
{
"setting": {
"TemplateLocations": "./Templates/Templates.xml;./Templates/MinimalAcfTemplates.xml"
}
}
Wenn nun der Befehl plcncli new ausgeführt wird, erscheint minimumproject in der Optionsliste. Diese Vorlage kann jetzt verwendet werden, um ein neues C++-Projekt von der Kommandozeile aus zu erstellen.
Hinweis: Das Hinzufügen einer Projektvorlage zur PLCnext CLI fügt diese nicht automatisch den Projektassistenten in Visual Studio oder Eclipse hinzu.
Eigene PLCnext CLI-Vorlage erstellen
Die Erstellung benutzerdefinierter PLCnext CLI-Vorlagen wird an einem einfachen Beispiel demonstriert. Es wird eine PLCnext CLI-Vorlage erstellt, die eine „Hello World!“-Konsolenanwendung in C++ generiert.
Vorgehensweise:
Erstellen Sie ein Verzeichnis für die neue PLCnext CLI-Projektvorlage.
Unter Linux:user@machine:~/plcncli/Templates$ mkdir ExeTemplate && cd ExeTemplateErstellen Sie eine Datei mit C++-Vorlagencode, der als Ausgangspunkt für jedes neue Projekt dieses Typs dient.
user@machine:~/plcncli/Templates/ExeTemplate$ touch Main.cppDer in diesem Beispiel verwendete C++-Code:
#include <iostream> int main() { std::cout << "Hello World!" << std::endl; return 0; }Erstellen Sie eine CMake-Vorlagendatei.
user@machine:~/plcncli/Templates/ExeTemplate$ touch CMakeLists.txtDer in diesem Beispiel verwendete CMake-Code:
cmake_minimum_required(VERSION 3.13) project($(name)) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release) endif() ################# Ziel erstellen ####################################################### file(GLOB_RECURSE Headers CONFIGURE_DEPENDS src/*.h src/*.hpp src/*.hxx) file(GLOB_RECURSE Sources CONFIGURE_DEPENDS src/*.cpp) add_executable(${CMAKE_PROJECT_NAME} ${Headers} ${Sources}) ####################################################################################### ################# Installationsverzeichnisse festlegen ############################################# string(REGEX REPLACE "^.*\(([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$" "\\1" _ARP_SHORT_DEVICE_VERSION ${ARP_DEVICE_VERSION}) set(BIN_INSTALL_DIR ${ARP_DEVICE}_${_ARP_SHORT_DEVICE_VERSION}/${CMAKE_BUILD_TYPE}) ####################################################################################### ################# Projekt-Include-Pfade ############################################### target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src) ####################################################################################### ################# ARP CMake-Modulpfad einbinden ####################################### list(INSERT CMAKE_MODULE_PATH 0 "${ARP_TOOLCHAIN_CMAKE_MODULE_PATH}") ####################################################################################### ################# Link-Optionen festlegen #################################################### # WARNUNG: Ohne --no-undefined prüft der Linker nicht, ob alle notwendigen # Bibliotheken gelinkt sind. Fehlt eine notwendige Bibliothek, # stürzt die Firmware ab, OHNE Hinweis auf den Grund. ####################################################################################### target_link_options(${CMAKE_PROJECT_NAME} PRIVATE LINKER:--no-undefined) ####################################################################################### ################# Link-Ziele hinzufügen #################################################### find_package(ArpDevice REQUIRED) find_package(ArpProgramming REQUIRED) target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE ArpDevice ArpProgramming) ####################################################################################### ################# Installation ############################################################# install(TARGETS ${CMAKE_PROJECT_NAME} RUNTIME DESTINATION ${BIN_INSTALL_DIR}) unset(_ARP_SHORT_DEVICE_VERSION) #######################################################################################Beachten Sie, dass der CMake-Code den Platzhalter
$(name)enthält, der durch den Projektnamen ersetzt wird, der an den Befehlplcncli newübergeben wird.Optional: Fügen Sie der neuen Vorlagenverzeichnis eine README-Datei hinzu, die auch zum Erstellen einer README-Datei in jedem neuen Projekt verwendet werden kann, das aus dieser Vorlage erstellt wird.
Erstellen Sie eine PLCnext CLI-Projektkonfigurationsdatei.
Diese Datei speichert Projektkonfigurationsinformationen für die PLCnext CLI, z. B. die Liste der Ziele, für die das Projekt gebaut werden soll.
Für dieses Beispiel wurde die
.proj-Datei aus dem VerzeichnisConsumableLibraryTemplatekopiert und bearbeitet, um Folgendes zu erzeugen:<?xml version="1.0" encoding="utf-8"?> <ProjectSettings xmlns="https://www.phoenixcontact.com/schema/cliproject"> <Type>exeproject</Type> <Version>0.1</Version> <Name>$(name)</Name> </ProjectSettings>Das Feld
Typesollte den eindeutigen Namen dieser Projektvorlage enthalten, der auch in der Template-Beschreibungsdatei im nächsten Schritt enthalten sein wird.Das Feld
Nameenthält den Platzhalter$(name), der bei der Erstellung jedes neuen Projekts durch den Projektnamen ersetzt wird.Erstellen Sie eine Template-Beschreibungsdatei.
Für dieses Beispiel wurde die Datei
TemplateDescription.xmlaus dem VerzeichnisConsumableLibraryTemplatekopiert und bearbeitet, um Folgendes zu erzeugen:<?xml version="1.0" encoding="utf-8"?> <TemplateDescription name="exeproject" isRoot="true" basedOn="baseproject" supportedFirmwareVersions="19.0.0.16199" requiredCliVersion="19.0.0.660" version="1.0" xmlns="https://www.phoenixcontact.com/schema/clitemplates" identifier="ProjectSettingsIdentifier"> <File name="plcnext.proj" template=".proj"/> <File name="CMakeLists.txt" template="CMakeLists.txt"/> <File name="README.md" template="README.md"/> <File name="$(name)Main.cpp" template="Main.cpp" path="src"/> <Description>Erstellt ein neues eigenständiges ausführbares Projekt.</Description> <Example> <Arguments> <Argument name="name" value="MyExe"/> </Arguments> <Description>erstellt ein neues eigenständiges ausführbares Projekt im Verzeichnis 'MyExe'</Description> </Example> </TemplateDescription>Die Felder in der Template-Beschreibung umfassen:
name="exeproject": Ermöglicht die Erstellung von Projekten aus dieser Vorlage mit dem Befehlplcncli new exeproject.File name="A" template="B" path="C": Erstellt eine Datei im neuen Projekt im angegebenen Pfad, basierend auf der angegebenen Vorlagendatei. Der Dateiname kann auch Platzhalter wie$(name)enthalten, die bei der Erstellung jedes neuen Projekts durch den Projektnamen ersetzt werden.DescriptionundExampleFelder, die in den entsprechenden Abschnitten desplcncli-Hilfesystems angezeigt werden.
Erstellen Sie eine neue Templates-Datei, die der PLCnext CLI unsere neuen Vorlagen mitteilt.
Für dieses Beispiel wurde die Datei
MinimalAcfTemplates.xmlim VerzeichnisTemplatesin eine Datei namensCustomTemplates.xmlkopiert und diese bearbeitet, um Folgendes zu erzeugen:<?xml version="1.0" encoding="utf-8"?> <Templates xmlns="https://www.phoenixcontact.com/schema/clitemplates"> <Include type="Template">ExeTemplate/TemplateDescription.xml</Include> </Templates>Registrieren Sie die benutzerdefinierten Vorlagen bei der PLCnext CLI:
user@machine:~$ plcncli set setting TemplateLocations ./Templates/CustomTemplates.xml --addDer Pfad ist relativ zum PLCnext CLI-Installationsverzeichnis.
Testen Sie es!
Die folgende Liste von Bash-Befehlen demonstriert die Funktionen der neuen Vorlage:
plcncli new # Der Hilfetext enthält die neue Vorlage und Beschreibung plcncli new exeproject --help # Zeigt das Beispiel zur Verwendung dieser Vorlage plcncli new exeproject --name "HelloWorld" # Erstellt ein neues Projekt basierend auf der Vorlage cd HelloWorld plcncli set target -n AXCF2152 -v 2022 --add # Legt das Build-Ziel fest plcncli build # Baut das Projekt mit dem Standard-Vorlagencode scp bin/AXCF2152_22.0.3.129/Release/HelloWorld admin@192.168.1.10:~ # Kopiert die Executable auf das Gerät ssh admin@192.168.1.10 ./HelloWorld # Führt die Executable aus!
Beitragen
In Zukunft ist geplant, dass Beiträge zum PLCnext CLI Templates-Projekt auf GitHub möglich sein werden. Bis dahin können Sie ein Issue mit Ideen für neue Vorlagen oder mit Beispielen von selbst erstellten Vorlagen eröffnen.
Fragen oder Kommentare?
Posten Sie einen Kommentar unten oder stellen Sie Fragen im PLCnext Community Forum.
Industrietechnik
- C++ Klassentemplates meistern: Ein praktischer Leitfaden
- C++ Templates: Generische Programmierung meistern
- Python XML-Verarbeitung: Leitfaden für interoperable Datenverwaltung
- VLAN-Setup auf PLCnext Control per Linux-Terminal optimieren
- Sicheren Remote-gRPC-Zugriff mit grpcurl auf PLCnext-Geräten
- Alibaba Cloud Connector mit PLCnext integrieren: Schritt-für-Schritt-Anleitung
- Sicher auf PLCnext Webserver zugreifen, der per DHCP eine IP erhält
- PC per Wake-on-LAN mit PLCnext fernwecken
- Cluster-Management auf PLCnext: Kubernetes für die industrielle Automatisierung nutzen
- Echtzeit-Monitoring von PLCnext mit Tableau-Dashboards