Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Tecnologia industrial

Templates PLCnext CLI: Agilize seu Desenvolvimento em C++

Este artigo aplica-se à versão PLCnext CLI 22.0.0 LTS.


Se você programa dispositivos PLCnext Control usando C++, provavelmente já usou templates de código instalados com o PLCnext CLI.

No Visual Studio e Eclipse, você deve escolher o template de projeto ao criar um novo projeto com o assistente PLCnext (instalado com a extensão PLCnext IDE).

Ao gerar um novo projeto C++ na linha de comando com o PLCnext CLI, você também deve especificar um template de projeto.

Os três templates de projeto padrão são:

project      Template para programas de usuário. Gerenciados pelo PLM (Program Library Manager).
acfproject   Template para desenvolvimento de componentes baseados em plataforma. O componente resultante é gerenciado pelo ACF (Application Component Framework).
consumablelibrary Template que cria uma biblioteca utilizável por outros projetos.

Essas informações podem ser vistas executando o comando plcncli new. Mais informações sobre esses tipos de projetos no PLCnext Info Center:

Este artigo descreve como ativar e usar templates de projeto adicionais instalados com o PLCnext CLI, e como criar e usar seu próprio template de projeto.

Mas primeiro, vejamos como funciona o sistema de templates do PLCnext CLI.

O sistema de templates do PLCnext CLI

O PLCnext CLI inclui uma configuração padrão chamada TemplateLocations, que indica onde encontrar templates de código. Você pode ver o valor desta configuração com o comando:

user@machine:~$ plcncli get setting TemplateLocations
{
  "setting": {
    "TemplateLocations": "./Templates/Templates.xml"
  }
}

O caminho para o arquivo XML é relativo ao caminho de instalação do plcncli.

Se você navegar para o diretório ./Templates, verá o arquivo Templates.xml e vários subdiretórios.

Listando o conteúdo do arquivo 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>

... você vê referências a arquivos TemplateDescription.xml de vários tipos nos diretórios abaixo de Templates. Estes contêm instruções que dizem ao PLCnext CLI o que fazer quando aquele template é usado.

Os arquivos de descrição de template mostrados acima implementam os três templates de projeto padrão que você já conhece.

Como ativar templates adicionais

Existe um template de projeto "oculto" instalado por padrão com o PLCnext CLI, que não está disponível por padrão:

minimumproject Igual ao acfproject, mas sem a capacidade de criar variáveis de porta no Global Data Space.

Podemos tornar este template disponível ao PLCnext CLI adicionando o arquivo MinimalAcfTemplates.xml – que você talvez já tenha notado no diretório Templates – à configuração de template locations:

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

O novo arquivo XML foi adicionado aos template locations:

user@machine:~$ plcncli get setting TemplateLocations
{
  "setting": {
    "TemplateLocations": "./Templates/Templates.xml;./Templates/MinimalAcfTemplates.xml"
  }
}

... e ao executar o comando plcncli new, minimumproject agora aparece na lista de opções. Este template pode agora ser usado para criar um novo projeto C++ na linha de comando.

Nota: Adicionar um template de projeto ao PLCnext CLI não adiciona automaticamente o template aos assistentes de projeto do Visual Studio ou Eclipse.

Como criar seu próprio template PLCnext CLI

A criação de templates personalizados será demonstrada com um exemplo simples: um template que gera uma aplicação de console "Hello World!" em C++.

O procedimento é:

  1. Crie um diretório para o novo template de projeto PLCnext CLI.

    No Linux:

    user@machine:~/plcncli/Templates$ mkdir ExeTemplate && cd ExeTemplate
  2. Crie um arquivo com código C++ template, que serve como ponto de partida para todo novo projeto deste tipo.

    user@machine:~/plcncli/Templates/ExeTemplate$ touch Main.cpp

    O código C++ usado neste exemplo:

    #include <iostream>
    int main() {
      std::cout << "Hello World!" << std::endl;
      return 0;
    }
  3. Crie um arquivo fonte CMake template.

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

    O código CMake usado (contém placeholder $(name) que será substituído pelo nome do projeto passado ao comando 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 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)
    #######################################################################################
  4. Opcional: Adicione um arquivo README ao novo diretório de template, que também pode ser usado para criar um README em cada novo projeto criado a partir deste template.

  5. Crie um arquivo de configuração de projeto PLCnext CLI.

    Este arquivo armazena informações de configuração do projeto para o PLCnext CLI, por exemplo, a lista de targets para os quais o projeto deve ser compilado.

    Para este exemplo, o arquivo .proj foi copiado do diretório ConsumableLibraryTemplate e editado:

    <?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>

    O campo Type deve conter o nome único deste template de projeto, que também será incluído no arquivo de descrição do template no próximo passo.

    O campo Name contém o placeholder $(name), que será substituído pelo nome do projeto durante a criação.

  6. Crie um arquivo de descrição de template.

    Para este exemplo, o arquivo TemplateDescription.xml foi copiado do diretório ConsumableLibraryTemplate e editado:

    <?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>

    Campos na descrição do template:

    • name="exeproject": Permite criar projetos com plcncli new exeproject.
    • File name="A" template="B" path="C": Cria arquivo no novo projeto, no caminho especificado, baseado no template. O nome pode incluir placeholders como $(name).
    • Campos Description e Example, exibidos nas seções relevantes do sistema de ajuda do plcncli.
  7. Crie um novo arquivo Templates, para informar ao PLCnext CLI sobre o novo template.

    Para este exemplo, o arquivo MinimalAcfTemplates.xml no diretório Templates foi copiado para CustomTemplates.xml e editado:

    <?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 os templates personalizados com o PLCnext CLI:

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

    O caminho é relativo ao diretório de instalação do PLCnext CLI.

  9. Teste!

    Lista de comandos bash demonstrando as funcionalidades do novo template:

    plcncli new                          # O help inclui o novo template e descrição
    plcncli new exeproject --help        # Exibe o exemplo de uso
    plcncli new exeproject --name "HelloWorld"  # Cria novo projeto baseado no template
    cd HelloWorld
    plcncli set target -n AXCF2152 -v 2022 --add  # Define target de build
    plcncli build                        # Compila o projeto com código template padrão
    scp bin/AXCF2152_22.0.3.129/Release/HelloWorld admin@192.168.1.10:~  # Copia executável
    ssh admin@192.168.1.10 ./HelloWorld  # Executa o executável!

Contribua

No futuro, está planejado que contribuições ao projeto PLCnext CLI Templates no GitHub sejam possíveis. Até lá, você pode abrir uma issue com ideias para novos templates ou exemplos de templates que criou.

Dúvidas ou comentários?

Poste um comentário abaixo ou faça perguntas no PLCnext Community Forum.

Tecnologia industrial

  1. Dominando Templates de Classe em C++: Um Guia Prático
  2. Dominando Templates em C++: Guia para Programação Genérica
  3. Processamento de XML em Python: Guia para Gestão de Dados Interoperáveis
  4. Simplifique Configuração VLAN no PLCnext Control com Comandos Linux Terminal
  5. Acesso Remoto Seguro gRPC com grpcurl em Dispositivos PLCnext
  6. Integrando Alibaba Cloud Connector com PLCnext: Guia Passo a Passo
  7. Acessar Seguramente Servidor Web PLCnext com IP via DHCP
  8. Acordar PC Remotamente com PLCnext via Wake-on-LAN
  9. Gerenciamento de Cluster no PLCnext: Aproveitando Kubernetes para Automação Industrial
  10. Monitoramento em Tempo Real do PLCnext com Dashboards Tableau