Plantillas PLCnext CLI: Optimice su desarrollo en C++
Este artículo se aplica a la versión 22.0.0 LTS de PLCnext CLI.
Si programa dispositivos PLCnext Control usando C++, probablemente haya utilizado plantillas de código que se instalan con PLCnext CLI.
En Visual Studio y Eclipse, debe elegir la plantilla de proyecto que desea usar al crear un nuevo proyecto con el asistente de proyectos PLCnext (instalado con la extensión PLCnext IDE).
Al generar un nuevo proyecto C++ en la línea de comandos con PLCnext CLI, también debe especificar una plantilla de proyecto.
Las tres plantillas de proyecto predeterminadas son:
project La plantilla para programas de usuario. Son gestionados por el PLM (Program Library Manager).
acfproject La plantilla para desarrollo de componentes basados en plataforma. El componente resultante será gestionado por el ACF (Application Component Framework).
consumablelibrary La plantilla que crea una biblioteca que puede ser usada por otros proyectos.
La información anterior puede verse ejecutando el comando plcncli new. Más información sobre estos tipos de proyectos se puede encontrar en el PLCnext Info Center:
- Delimitación de ACF y PLM
- Creación y uso de bibliotecas compartidas
Este artículo describe cómo activar y usar plantillas de proyecto adicionales que se instalan con PLCnext CLI, y cómo crear y usar su propia plantilla de proyecto.
Pero primero, veamos cómo funciona el sistema de plantillas PLCnext CLI.
El sistema de plantillas PLCnext CLI
PLCnext CLI incluye una configuración predeterminada llamada TemplateLocations, que le indica dónde encontrar las plantillas de código. Puede ver el valor de esta configuración con el siguiente comando:
user@machine:~$ plcncli get setting TemplateLocations
{
"setting": {
"TemplateLocations": "./Templates/Templates.xml"
}
}
La ruta al archivo XML es relativa a la ruta de instalación de plcncli.
Si navega al directorio ./Templates, verá el archivo Templates.xml y varios subdirectorios.
Listando el contenido del archivo 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>
... puede ver que hay referencias a archivos TemplateDescription.xml de varios tipos en los directorios debajo del directorio Templates. Estos contienen instrucciones que dicen a PLCnext CLI qué hacer cuando se usa esa plantilla.
Los archivos de descripción de plantilla mostrados arriba implementan las tres plantillas de proyecto predeterminadas con las que ya está familiarizado.
Cómo activar plantillas adicionales
Hay una plantilla de proyecto "oculta" instalada por defecto con PLCnext CLI, que no está disponible por defecto:
minimumproject Es lo mismo que acfproject, pero sin la capacidad de crear variables de puerto en el Espacio de Datos Global.
Podemos hacer esta plantilla disponible para PLCnext CLI añadiendo el archivo MinimalAcfTemplates.xml - que puede haber notado ya en el directorio Templates - a la configuración de ubicaciones de plantillas:
user@machine:~$ plcncli set setting TemplateLocations ./Templates/MinimalAcfTemplates.xml --add
El nuevo archivo XML se ha añadido ahora a las ubicaciones de plantillas:
user@machine:~$ plcncli get setting TemplateLocations
{
"setting": {
"TemplateLocations": "./Templates/Templates.xml;./Templates/MinimalAcfTemplates.xml"
}
}
... y cuando se ejecuta el comando plcncli new, minimumproject ahora aparece en la lista de opciones. Esta plantilla ahora puede usarse para crear un nuevo proyecto C++ desde la línea de comandos.
Nota: Añadir una plantilla de proyecto a PLCnext CLI no añade automáticamente la plantilla a los asistentes de proyectos de Visual Studio o Eclipse.
Cómo crear su propia plantilla PLCnext CLI
La creación de plantillas PLCnext CLI personalizadas se demostrará con un ejemplo sencillo. Se creará una plantilla PLCnext CLI que genere una aplicación de consola "¡Hola Mundo!" en C++.
El procedimiento es el siguiente:
-
Cree un directorio para la nueva plantilla de proyecto PLCnext CLI.
En Linux:
user@machine:~/plcncli/Templates$ mkdir ExeTemplate && cd ExeTemplate -
Cree un archivo que contenga código C++ de plantilla, que puede usarse como punto de partida para cada nuevo proyecto de este tipo.
user@machine:~/plcncli/Templates/ExeTemplate$ touch Main.cppEl código C++ usado en este ejemplo es:
#include <iostream> int main() { std::cout << "Hello World!" << std::endl; return 0; } -
Cree un archivo fuente de plantilla CMake.
user@machine:~/plcncli/Templates/ExeTemplate$ touch CMakeLists.txtEl código CMake usado en este ejemplo es:
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 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>) ####################################################################################### ################# 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 library which is necessary is not linked, # the firmware will crash and there will be NO indication why it crashed. ####################################################################################### 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) #######################################################################################Tenga en cuenta que el código CMake incluye el marcador de posición
$(name), que será reemplazado con el nombre del proyecto que se pasa al comandoplcncli new. -
Opcional: Añada un archivo README al nuevo directorio de plantilla, que también puede usarse para crear un archivo README en cada nuevo proyecto creado desde esta plantilla.
-
Cree un archivo de configuración de proyecto PLCnext CLI.
Este archivo se usa para almacenar información de configuración del proyecto para PLCnext CLI, por ejemplo, la lista de objetivos para los que se debe construir el proyecto.
Para este ejemplo, el archivo
.projse copió del directorioConsumableLibraryTemplatey se editó para producir lo siguiente:<?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>El campo
Typedebe contener el nombre único de esta plantilla de proyecto, que también se incluirá en el archivo de descripción de plantilla en el siguiente paso.El campo
Namecontiene el marcador de posición$(name), que se sustituirá con el nombre del proyecto durante la creación de cada nuevo proyecto. -
Cree un archivo de descripción de plantilla.
Para este ejemplo, el archivo
TemplateDescription.xmlse copió del directorioConsumableLibraryTemplatey se editó para producir lo siguiente:<?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>Los campos en la descripción de plantilla incluyen:
name="exeproject": Permite crear proyectos desde esta plantilla usando el comandoplcncli new exeproject.File name="A" template="B" path="C": Crea un archivo en el nuevo proyecto, en la ruta especificada, basado en el archivo de plantilla especificado. El nombre del archivo también puede incluir marcadores de posición como$(name), que se sustituirán con el nombre del proyecto durante la creación de cada nuevo proyecto.- Campos
DescriptionyExample, que se muestran en las secciones relevantes del sistema de ayuda deplcncli.
-
Cree un nuevo archivo Templates, que se usará para decir a PLCnext CLI sobre nuestra(s) nueva(s) plantilla(s).
Para este ejemplo, el archivo
MinimalAcfTemplates.xmlen el directorioTemplatesse copió a un archivo llamadoCustomTemplates.xml, y ese archivo se editó para producir lo siguiente:<?xml version="1.0" encoding="utf-8"?> <Templates xmlns="https://www.phoenixcontact.com/schema/clitemplates"> <Include type="Template">ExeTemplate/TemplateDescription.xml</Include> </Templates> -
Registre las plantillas personalizadas con PLCnext CLI
user@machine:~$ plcncli set setting TemplateLocations ./Templates/CustomTemplates.xml --addLa ruta es relativa al directorio de instalación de PLCnext CLI.
-
¡Pruébelo!
La siguiente lista de comandos bash demuestra las características de la nueva plantilla:
plcncli new # El texto de ayuda incluye la nueva plantilla y descripción plcncli new exeproject --help # Muestra el ejemplo de cómo usar esta plantilla plcncli new exeproject --name "HelloWorld" # Crea un nuevo proyecto basado en la plantilla cd HelloWorld plcncli set target -n AXCF2152 -v 2022 --add # Establece el objetivo de construcción plcncli build # Construye el proyecto con el código de plantilla predeterminado scp bin/AXCF2152_22.0.3.129/Release/HelloWorld admin@192.168.1.10:~ # Copia el ejecutable al dispositivo ssh admin@192.168.1.10 ./HelloWorld # ¡Ejecuta el ejecutable!
Contribuir
En el futuro, está planeado que las contribuciones al proyecto PLCnext CLI Templates en Github sean posibles. Mientras tanto, puede abrir un issue con ideas para nuevas plantillas, o con ejemplos de plantillas que haya creado usted mismo.
¿Preguntas o comentarios?
Publique un comentario a continuación, o haga preguntas en el Foro de la Comunidad PLCnext.
Tecnología Industrial
- Optimiza la Configuración VLAN en PLCnext Control con Comandos de Terminal Linux
- Acceso Remoto Seguro gRPC con grpcurl en Dispositivos PLCnext
- Integrar Alibaba Cloud Connector con PLCnext: Guía paso a paso
- Acceder de forma segura a un servidor web PLCnext con IP asignada por DHCP
- Encender su PC remotamente con PLCnext vía Wake-on-LAN
- Gestión de clústeres en PLCnext: Aprovechando Kubernetes para automatización industrial
- Monitorización en tiempo real de PLCnext con dashboards Tableau
- Crea dashboards Power BI desde datos PLCnext en la nube
- Dominando las plantillas de clase en C++: guía práctica
- Dominando Plantillas en C++: Guía de Programación Genérica
- Procesamiento XML en Python: Guía para Gestión de Datos Interoperables