Modèles PLCnext CLI : rationalisez votre développement C++
Cet article s'applique à la version 22.0.0 LTS de PLCnext CLI.
Si vous programmez des contrôleurs PLCnext en C++, vous avez probablement utilisé les modèles de code installés avec PLCnext CLI.
Dans Visual Studio et Eclipse, vous choisissez le modèle de projet lors de la création via l'assistant PLCnext (installé avec l'extension PLCnext IDE).
En ligne de commande avec PLCnext CLI, vous devez également spécifier un modèle de projet.
Les trois modèles par défaut sont :
project Modèle pour programmes utilisateur, gérés par le PLM (Program Library Manager).
acfproject Modèle pour développement de composants plateforme, gérés par l'ACF (Application Component Framework).
consumablelibrary Modèle créant une bibliothèque utilisable par d'autres projets.
Ces informations apparaissent avec la commande plcncli new. Plus de détails dans le PLCnext Info Center :
- Différenciation ACF et PLM
- Création et utilisation de bibliothèques partagées
Cet article explique comment activer et utiliser des modèles additionnels installés avec PLCnext CLI, et comment créer et utiliser votre propre modèle.
Regardons d'abord le fonctionnement du système de modèles PLCnext CLI.
Le système de modèles PLCnext CLI
PLCnext CLI inclut un paramètre par défaut TemplateLocations indiquant où trouver les modèles. Sa valeur se consulte ainsi :
user@machine:~$ plcncli get setting TemplateLocations
{
"setting": {
"TemplateLocations": "./Templates/Templates.xml"
}
}
Le chemin du fichier XML est relatif au chemin d'installation de plcncli.
Dans le répertoire ./Templates, on trouve Templates.xml et plusieurs sous-répertoires.
Contenu de Templates.xml :
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>
On voit des références aux fichiers TemplateDescription.xml de différents types dans les sous-répertoires. Ils contiennent les instructions pour PLCnext CLI lors de l'utilisation du modèle.
Ces fichiers implémentent les trois modèles par défaut déjà connus.
Comment activer des modèles additionnels
Un modèle « caché » est installé par défaut mais non disponible :
minimumproject Identique à acfproject, sans la capacité de créer des variables de port dans l'espace de données global.
Pour le rendre disponible, ajoutez MinimalAcfTemplates.xml (déjà présent dans Templates) aux emplacements de modèles :
user@machine:~$ plcncli set setting TemplateLocations ./Templates/MinimalAcfTemplates.xml --add
Le nouveau fichier XML est ajouté :
user@machine:~$ plcncli get setting TemplateLocations
{
"setting": {
"TemplateLocations": "./Templates/Templates.xml;./Templates/MinimalAcfTemplates.xml"
}
}
La commande plcncli new affiche désormais minimumproject dans la liste. Ce modèle peut être utilisé pour créer un nouveau projet C++ en ligne de commande.
Note : L'ajout d'un modèle au CLI ne l'ajoute pas automatiquement aux assistants de projet Visual Studio ou Eclipse.
Comment créer votre propre modèle PLCnext CLI
La création sera démontrée avec un exemple simple : un modèle générant une application console « Hello World ! » en C++.
Procédure :
Créez un répertoire pour le nouveau modèle de projet PLCnext CLI.
Sous Linux :
user@machine:~/plcncli/Templates$ mkdir ExeTemplate && cd ExeTemplateCréez un fichier avec le code C++ modèle, point de départ pour chaque nouveau projet de ce type.
user@machine:~/plcncli/Templates/ExeTemplate$ touch Main.cppCode C++ utilisé :
#include <iostream> int main() { std::cout << "Hello World!" << std::endl; return 0; }Créez un fichier source CMake modèle.
user@machine:~/plcncli/Templates/ExeTemplate$ touch CMakeLists.txtCode CMake (avec placeholder
$(name)remplacé par le nom du projet passé àplcncli new) :cmake_minimum_required(VERSION 3.13) project($(name)) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release) endif() ################# create target ####################################################### 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}) ####################################################################################### ################# set install directories ############################################# 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}) ####################################################################################### ################# project include-paths ############################################### target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) ####################################################################################### ################# include arp cmake module path ####################################### list(INSERT CMAKE_MODULE_PATH 0 "${ARP_TOOLCHAIN_CMAKE_MODULE_PATH}") ####################################################################################### ################# set link options #################################################### # WARNING: Without --no-undefined the linker will not check whether all necessary # libraries are linked. When a necessary library is not linked, the firmware will crash # with NO indication why. ####################################################################################### target_link_options(${CMAKE_PROJECT_NAME} PRIVATE LINKER:--no-undefined) ####################################################################################### ################# add link targets #################################################### find_package(ArpDevice REQUIRED) find_package(ArpProgramming REQUIRED) target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE ArpDevice ArpProgramming) ####################################################################################### ################# install ############################################################# install(TARGETS ${CMAKE_PROJECT_NAME} RUNTIME DESTINATION ${BIN_INSTALL_DIR}) unset(_ARP_SHORT_DEVICE_VERSION) #######################################################################################Optionnel : ajoutez un fichier README dans le répertoire du modèle, qui servira à créer un README dans chaque nouveau projet.
Créez un fichier de configuration de projet PLCnext CLI (
.proj).Ce fichier stocke les infos de configuration (liste des cibles de build). Pour l'exemple, copié depuis
ConsumableLibraryTemplateet modifié :<?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>Le champ
Typecontient le nom unique du modèle (repris dans le fichier de description).Namecontient le placeholder$(name)substitué à la création.Créez un fichier de description de modèle (
TemplateDescription.xml).Copié depuis
ConsumableLibraryTemplateet modifié :<?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>Create a new stand-alone executable project.</Description> <Example> <Arguments> <Argument name="name" value="MyExe"/> </Arguments> <Description>creates a new stand-alone executable project in the directory 'MyExe'</Description> </Example> </TemplateDescription>Champs clés :
name="exeproject": permetplcncli new exeproject.File name="A" template="B" path="C": crée un fichier dans le nouveau projet, chemin spécifié, basé sur le template. Le nom peut inclure$(name).DescriptionetExample: affichés dans l'aideplcncli.
Créez un nouveau fichier Templates pour déclarer votre modèle au CLI.
Copiez
MinimalAcfTemplates.xmlversCustomTemplates.xmlet modifiez :<?xml version="1.0" encoding="utf-8"?> <Templates xmlns="https://www.phoenixcontact.com/schema/clitemplates"> <Include type="Template">ExeTemplate/TemplateDescription.xml</Include> </Templates>Enregistrez les modèles personnalisés auprès du CLI :
user@machine:~$ plcncli set setting TemplateLocations ./Templates/CustomTemplates.xml --addLe chemin est relatif au répertoire d'installation de PLCnext CLI.
Testez !
Commandes bash démontrant le nouveau modèle :
plcncli new # L'aide inclut le nouveau modèle et sa description plcncli new exeproject --help # Affiche l'exemple d'utilisation plcncli new exeproject --name "HelloWorld" # Crée un nouveau projet cd HelloWorld plcncli set target -n AXCF2152 -v 2022 --add # Définit la cible de build plcncli build # Compile le projet avec le code modèle scp bin/AXCF2152_22.0.3.129/Release/HelloWorld admin@192.168.1.10:~ # Copie l'exécutable ssh admin@192.168.1.10 ./HelloWorld # Exécute l'exécutable !
Contribuer
À l'avenir, les contributions au projet PLCnext CLI Templates sur GitHub seront possibles. En attendant, ouvrez une issue avec vos idées ou exemples de modèles créés.
Questions ou commentaires ?
Postez un commentaire ci-dessous ou posez vos questions sur le forum PLCnext Community.
Technologie industrielle
- Maîtriser les templates de classe en C++ : Guide pratique
- Maîtriser les templates C++ : Guide de la programmation générique
- Traitement XML en Python : Guide pour la gestion de données interopérables
- Simplifier la configuration VLAN sur PLCnext Control avec commandes terminal Linux
- Accès distant gRPC sécurisé avec grpcurl sur appareils PLCnext
- Intégrer le connecteur Alibaba Cloud avec PLCnext : guide étape par étape
- Accéder en toute sécurité à un serveur web PLCnext avec IP DHCP
- Réveiller votre PC à distance avec PLCnext via Wake-on-LAN
- Gestion de cluster sur PLCnext : exploiter Kubernetes pour l'automatisation industrielle