Modelos de CLI PLCnext
Este artigo se aplica ao PLCnext CLI versão 22.0.0 LTS.
Se você programa os dispositivos PLCnext Control usando C++, provavelmente já usou modelos de código que são instalados com o PLCnext CLI.
No Visual Studio e Eclipse, você deve escolher o modelo de projeto que deseja usar ao criar um novo projeto com o assistente de projeto PLCnext (instalado com a extensão PLCnext IDE).
Ao gerar um novo projeto C++ na linha de comando com a PLCnext CLI, você também deve especificar um modelo de projeto.
Os três modelos de projeto padrão são:
project The project is a template for user programs.
They are managed by the PLM (Program Library Manager).
acfproject The acfproject is a template for component based platform development.
The resulting component will be managed by the ACF
(Application Component Framework).
consumablelibrary The consumable library is a template, that creates a library
which can be used by other projects.
As informações acima podem ser vistas executando o
plcncli new
comando. Mais informações sobre estes tipos de projetos podem ser encontradas no PLCnext Info Center:- Delimitação de ACF e PLM
- Criando e usando bibliotecas compartilhadas
Este artigo descreve como ativar e usar modelos de projeto adicionais que são instalados com o PLCnext CLI e como criar e usar seu próprio modelo de projeto.
Mas antes, vejamos como funciona o sistema PLCnext CLI Template.
O sistema PLCnext CLI Template
O PLCnext CLI inclui uma configuração padrão chamada
TemplateLocations
, que informa onde encontrar modelos de código. Você pode ver o valor dessa configuração com o seguinte comando:user@machine:~$ plcncli get setting TemplateLocations
{
"setting": {
"TemplateLocations": "./Templates/Templates.xml"
}
}
O caminho para o arquivo xml é relativo ao
plcncli
caminho de instalação. Se você navegar até o
./Templates
diretório, você verá o Templates.xml
arquivo e vários subdiretórios. Listando o conteúdo do
Templates.xml
Arquivo ... user@machine:~/plcncli/Templates$ cat Templates.xml
<?xml version="1.0" encoding="utf-8"?>
<Templates xmlns="http://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ê pode ver que há referências a
TemplateDescription.xml
arquivos de vários tipos nos diretórios abaixo do Templates
diretório. Eles contêm instruções que informam ao PLCnext CLI o que fazer quando esse modelo é usado. Os arquivos de descrição de modelo mostrados acima implementam os três modelos de projeto padrão com os quais você já está familiarizado.
Como ativar modelos adicionais
Existe um modelo de projeto "oculto" instalado por padrão com o PLCnext CLI, que não está disponível por padrão:
minimumproject This is the same as acfproject, but without the capability to create
Port variables in the Global Data Space.
Podemos disponibilizar este template para o PLCnext CLI adicionando o
MinimalAcfTemplates.xml
arquivo - que você já deve ter notado no Templates
diretório - para a configuração de locais do modelo:user@machine:~$ plcncli set setting TemplateLocations ./Templates/MinimalAcfTemplates.xml --add
O novo arquivo XML agora foi adicionado aos locais do modelo:
user@machine:~$ plcncli get setting TemplateLocations
{
"setting": {
"TemplateLocations": "./Templates/Templates.xml;./Templates/MinimalAcfTemplates.xml"
}
}
... e quando o
plcncli new
comando é executado, minimumproject
agora aparece na lista de opções. Este modelo agora pode ser usado para criar um novo projeto C++ a partir da linha de comando. Observação: Adicionar um modelo de projeto à CLI do PLCnext não adiciona automaticamente o modelo de projeto aos assistentes de projeto do Visual Studio ou Eclipse.
Como criar seu próprio template PLCnext CLI
A criação de templates personalizados PLCnext CLI será demonstrada através de um exemplo simples. Será criado um template PLCnext CLI que gera um "Hello World!" aplicativo de console em C++.
O procedimento é o seguinte:
-
Crie um diretório para o novo modelo de projeto PLCnext CLI.
No Linux:
user@machine:~/plcncli/Templates$ mkdir ExeTemplate && cd ExeTemplate
-
Crie um arquivo contendo código C++ de modelo, que pode ser usado como ponto de partida para cada novo projeto desse tipo.
user@machine:~/plcncli/Templates/ExeTemplate$ touch Main.cpp
O código C++ usado neste exemplo é:
#include int main() { std::cout << "Hello World!" << std::endl; return 0; }
-
Crie um arquivo de origem cmake de modelo.
user@machine:~/plcncli/Templates/ExeTemplate$ touch CMakeLists.txt
O código CMake usado neste exemplo é:
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 $) ####################################################################################### ################# 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) #######################################################################################
Observe que o código CMake inclui o espaço reservado$(name)
, que será substituído pelo nome do projeto que é passado para oplcncli new
comando.
-
Opcional:Inclua um arquivo README no novo diretório de modelo, que também pode ser usado para criar um arquivo README em cada novo projeto criado a partir desse modelo.
-
Crie um arquivo de configuração do projeto PLCnext CLI.
Este arquivo é usado para armazenar informações de configuração do projeto para o PLCnext CLI, ex. a lista de alvos para os quais o projeto deve ser construído.
Para este exemplo, o.proj
o arquivo foi copiado doConsumableLibraryTemplate
diretório e editado para produzir o seguinte:
<?xml version="1.0" encoding="utf-8"?> <ProjectSettings xmlns="http://www.phoenixcontact.com/schema/cliproject"> <Type>exeproject</Type> <Version>0.1</Version> <Name>$(name)</Name> </ProjectSettings>
OType
O campo deve conter o nome exclusivo deste modelo de projeto, que também será incluído no arquivo de descrição do modelo na próxima etapa.
OName
campo contém o espaço reservado$(name)
, que será substituído pelo nome do projeto durante a criação de cada novo projeto.
-
Crie um arquivo de descrição de modelo.
Para este exemplo, oTemplateDescription.xml
o arquivo foi copiado doConsumableLibraryTemplate
diretório e editado para produzir o seguinte:
<?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="http://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>
Os campos na descrição do modelo incluem:
name="exeproject"
:permite que projetos sejam criados a partir deste modelo usando o comandoplcncli new exeproject
.File name="A" template="B" path="C"
:cria um arquivo no novo projeto, no caminho especificado, com base no arquivo de modelo especificado. O nome do arquivo também pode incluir espaços reservados como$(name)
, que será substituído pelo nome do projeto durante a criação de cada novo projeto.Description
eExample
campos, que são exibidos nas seções relevantes doplcncli
sistema de ajuda.
-
Crie um novo arquivo de Templates, que será usado para informar ao PLCnext CLI sobre nosso(s) novo(s) template(s).
Para este exemplo, oMinimalAcfTemplates.xml
arquivo noTemplates
diretório foi copiado para um arquivo chamadoCustomTemplates.xml
, e esse arquivo foi editado para produzir o seguinte:
<?xml version="1.0" encoding="utf-8"?> <Templates xmlns="http://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 --add
O caminho é relativo ao diretório de instalação do PLCnext CLI.
-
Experimente!
A seguinte lista de comandos bash demonstra os recursos do novo modelo:
plcncli new # The help text includes the new template and description plcncli new exeproject --help # Displays the example showing how to use this template plcncli new exeproject --name "HelloWorld" # Creates a new project based on the template cd HelloWorld plcncli set target -n AXCF2152 -v 2022 --add # Sets the build target plcncli build # Builds the project with the default template code scp bin/AXCF2152_22.0.3.129/Release/HelloWorld [email protected]:~ # Copies the executable to the device ssh [email protected] ./HelloWorld # Runs the executable!
Contribuir
No futuro, está previsto que contribuições para o projeto PLCnext CLI Templates no Github sejam possíveis. Até lá, você pode abrir um problema com ideias para novos modelos ou com exemplos de modelos que você mesmo criou.
Perguntas ou comentários?
Poste um comentário abaixo ou faça perguntas no Fórum da Comunidade PLCnext.
Tecnologia industrial