Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Tecnología Industrial

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:

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:

  1. Cree un directorio para la nueva plantilla de proyecto PLCnext CLI.

    En Linux:

    user@machine:~/plcncli/Templates$ mkdir ExeTemplate && cd ExeTemplate
  2. 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.cpp

    El código C++ usado en este ejemplo es:

    #include <iostream>
    int main() {
      std::cout << "Hello World!" << std::endl;
      return 0;
    }
  3. Cree un archivo fuente de plantilla CMake.

    user@machine:~/plcncli/Templates/ExeTemplate$ touch CMakeLists.txt

    El 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 comando plcncli new.

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

  5. 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 .proj se copió del directorio ConsumableLibraryTemplate y 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 Type debe 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 Name contiene el marcador de posición $(name), que se sustituirá con el nombre del proyecto durante la creación de cada nuevo proyecto.

  6. Cree un archivo de descripción de plantilla.

    Para este ejemplo, el archivo TemplateDescription.xml se copió del directorio ConsumableLibraryTemplate y 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 comando plcncli 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 Description y Example, que se muestran en las secciones relevantes del sistema de ayuda de plcncli.
  7. 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.xml en el directorio Templates se copió a un archivo llamado CustomTemplates.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>
  8. Registre las plantillas personalizadas con PLCnext CLI

    user@machine:~$ plcncli set setting TemplateLocations ./Templates/CustomTemplates.xml --add

    La ruta es relativa al directorio de instalación de PLCnext CLI.

  9. ¡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

  1. Optimiza la Configuración VLAN en PLCnext Control con Comandos de Terminal Linux
  2. Acceso Remoto Seguro gRPC con grpcurl en Dispositivos PLCnext
  3. Integrar Alibaba Cloud Connector con PLCnext: Guía paso a paso
  4. Acceder de forma segura a un servidor web PLCnext con IP asignada por DHCP
  5. Encender su PC remotamente con PLCnext vía Wake-on-LAN
  6. Gestión de clústeres en PLCnext: Aprovechando Kubernetes para automatización industrial
  7. Monitorización en tiempo real de PLCnext con dashboards Tableau
  8. Crea dashboards Power BI desde datos PLCnext en la nube
  9. Dominando las plantillas de clase en C++: guía práctica
  10. Dominando Plantillas en C++: Guía de Programación Genérica
  11. Procesamiento XML en Python: Guía para Gestión de Datos Interoperables