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:
- Delimitação entre ACF e PLM
- Criação e uso de bibliotecas compartilhadas
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 é:
-
Crie um diretório para o novo template de projeto PLCnext CLI.
No Linux:
user@machine:~/plcncli/Templates$ mkdir ExeTemplate && cd ExeTemplate -
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.cppO código C++ usado neste exemplo:
#include <iostream> int main() { std::cout << "Hello World!" << std::endl; return 0; } -
Crie um arquivo fonte CMake template.
user@machine:~/plcncli/Templates/ExeTemplate$ touch CMakeLists.txtO código CMake usado (contém placeholder
$(name)que será substituído pelo nome do projeto passado ao comandoplcncli 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) ####################################################################################### -
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.
-
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
.projfoi copiado do diretórioConsumableLibraryTemplatee 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
Typedeve 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
Namecontém o placeholder$(name), que será substituído pelo nome do projeto durante a criação. -
Crie um arquivo de descrição de template.
Para este exemplo, o arquivo
TemplateDescription.xmlfoi copiado do diretórioConsumableLibraryTemplatee 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 complcncli 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
DescriptioneExample, exibidos nas seções relevantes do sistema de ajuda doplcncli.
-
Crie um novo arquivo Templates, para informar ao PLCnext CLI sobre o novo template.
Para este exemplo, o arquivo
MinimalAcfTemplates.xmlno diretórioTemplatesfoi copiado paraCustomTemplates.xmle editado:<?xml version="1.0" encoding="utf-8"?> <Templates xmlns="https://www.phoenixcontact.com/schema/clitemplates"> <Include type="Template">ExeTemplate/TemplateDescription.xml</Include> </Templates> -
Registre os templates personalizados com o PLCnext CLI:
user@machine:~$ plcncli set setting TemplateLocations ./Templates/CustomTemplates.xml --addO caminho é relativo ao diretório de instalação do PLCnext CLI.
-
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
- Dominando Templates de Classe em C++: Um Guia Prático
- Dominando Templates em C++: Guia para Programação Genérica
- Processamento de XML em Python: Guia para Gestão de Dados Interoperáveis
- Simplifique Configuração VLAN no PLCnext Control com Comandos Linux Terminal
- Acesso Remoto Seguro gRPC com grpcurl em Dispositivos PLCnext
- Integrando Alibaba Cloud Connector com PLCnext: Guia Passo a Passo
- Acessar Seguramente Servidor Web PLCnext com IP via DHCP
- Acordar PC Remotamente com PLCnext via Wake-on-LAN
- Gerenciamento de Cluster no PLCnext: Aproveitando Kubernetes para Automação Industrial
- Monitoramento em Tempo Real do PLCnext com Dashboards Tableau