PLCnext CLI Templates: Ускорение разработки на C++
Данная статья относится к PLCnext CLI версии 22.0.0 LTS.
Если вы программируете устройства PLCnext Control на C++, вы, вероятно, использовали шаблоны кода, устанавливаемые вместе с PLCnext CLI.
В Visual Studio и Eclipse при создании нового проекта с помощью мастера проектов PLCnext (устанавливаемого с расширением PLCnext IDE) необходимо выбрать шаблон проекта.
При генерации нового C++ проекта в командной строке с помощью PLCnext CLI также нужно указать шаблон проекта.
Три шаблона проектов по умолчанию:
project — шаблон для пользовательских программ. Управляются PLM (Program Library Manager).
acfproject — шаблон для компонентной разработки платформы. Полученный компонент управляется ACF (Application Component Framework).
consumablelibrary — шаблон, создающий библиотеку, которую могут использовать другие проекты.
Эту информацию можно увидеть, выполнив команду plcncli new. Подробнее об этих типах проектов можно узнать в PLCnext Info Center:
- Разграничение ACF и PLM
- Создание и использование общих библиотек
В этой статье описывается, как активировать и использовать дополнительные шаблоны проектов, устанавливаемые с PLCnext CLI, а также как создавать и использовать собственные шаблоны проектов.
Но сначала посмотрим, как работает система шаблонов PLCnext CLI.
Система шаблонов PLCnext CLI
PLCnext CLI включает настройку по умолчанию TemplateLocations, указывающую, где искать шаблоны кода. Значение этой настройки можно посмотреть командой:
user@machine:~$ plcncli get setting TemplateLocations
{
"setting": {
"TemplateLocations": "./Templates/Templates.xml"
}
}
Путь к XML-файлу относителен к пути установки plcncli.
Если перейти в директорию ./Templates, можно увидеть файл Templates.xml и несколько поддиректорий.
Просмотр содержимого 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>
Видно, что есть ссылки на файлы TemplateDescription.xml различных типов в поддиректориях Templates. Они содержат инструкции, говорящие PLCnext CLI, что делать при использовании этого шаблона.
Показанные выше файлы описания шаблонов реализуют три стандартных шаблона проектов, с которыми вы уже знакомы.
Как активировать дополнительные шаблоны
Существует один «скрытый» шаблон проекта, устанавливаемый по умолчанию с PLCnext CLI, но недоступный по умолчанию:
minimumproject — то же, что acfproject, но без возможности создания порт-переменных в глобальном пространстве данных.
Мы можем сделать этот шаблон доступным для PLCnext CLI, добавив файл MinimalAcfTemplates.xml (который вы, возможно, уже заметили в директории Templates) в настройку template locations:
user@machine:~$ plcncli set setting TemplateLocations ./Templates/MinimalAcfTemplates.xml --add
Новый XML-файл теперь добавлен в местоположения шаблонов:
user@machine:~$ plcncli get setting TemplateLocations
{
"setting": {
"TemplateLocations": "./Templates/Templates.xml;./Templates/MinimalAcfTemplates.xml"
}
}
... и при выполнении команды plcncli new в списке вариантов теперь появляется minimumproject. Этот шаблон теперь можно использовать для создания нового C++ проекта из командной строки.
Примечание: Добавление шаблона проекта в PLCnext CLI не добавляет его автоматически в мастера проектов Visual Studio или Eclipse.
Как создать свой собственный шаблон PLCnext CLI
Создание пользовательских шаблонов PLCnext CLI будет продемонстрировано на простом примере. Будет создан шаблон PLCnext CLI, генерирующий консольное приложение «Hello World!» на C++.
Процедура:
-
Создайте директорию для нового шаблона проекта PLCnext CLI.
В Linux:
user@machine:~/plcncli/Templates$ mkdir ExeTemplate && cd ExeTemplate -
Создайте файл с шаблонным C++ кодом, который будет отправной точкой для каждого нового проекта этого типа.
user@machine:~/plcncli/Templates/ExeTemplate$ touch Main.cppИспользуемый в примере C++ код:
#include <iostream> int main() { std::cout << "Hello World!" << std::endl; return 0; } -
Создайте исходный файл шаблона CMake.
user@machine:~/plcncli/Templates/ExeTemplate$ touch CMakeLists.txtИспользуемый в примере CMake код:
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) #######################################################################################Обратите внимание, что CMake код включает плейсхолдер
$(name), который будет заменен именем проекта, переданным командеplcncli new. -
Опционально: добавьте файл README в новую директорию шаблона, который также можно использовать для создания README в каждом новом проекте, создаваемом из этого шаблона.
-
Создайте файл конфигурации проекта PLCnext CLI.
Этот файл используется для хранения информации о конфигурации проекта для PLCnext CLI, например, списка целей, для которых проект должен быть собран.
Для этого примера файл
.projбыл скопирован из директорииConsumableLibraryTemplateи отредактирован для получения следующего:<?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>Поле
Typeдолжно содержать уникальное имя этого шаблона проекта, которое также будет включено в файл описания шаблона на следующем шаге.Поле
Nameсодержит плейсхолдер$(name), который будет подставлен именем проекта при создании каждого нового проекта. -
Создайте файл описания шаблона.
Для этого примера файл
TemplateDescription.xmlбыл скопирован из директорииConsumableLibraryTemplateи отредактирован:<?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>Поля в описании шаблона включают:
name="exeproject": позволяет создавать проекты из этого шаблона командойplcncli new exeproject.File name="A" template="B" path="C": создает файл в новом проекте в указанном пути на основе указанного шаблонного файла. Имя файла также может включать плейсхолдеры вроде$(name), которые будут подставлены именем проекта при создании каждого нового проекта.- Поля
DescriptionиExample, отображаемые в соответствующих разделах справкиplcncli.
-
Создайте новый файл Templates, который будет использоваться для сообщения PLCnext CLI о наших новых шаблонах.
Для этого примера файл
MinimalAcfTemplates.xmlв директорииTemplatesбыл скопирован в файлCustomTemplates.xmlи отредактирован:<?xml version="1.0" encoding="utf-8"?> <Templates xmlns="https://www.phoenixcontact.com/schema/clitemplates"> <Include type="Template">ExeTemplate/TemplateDescription.xml</Include> </Templates> -
Зарегистрируйте пользовательские шаблоны в PLCnext CLI:
user@machine:~$ plcncli set setting TemplateLocations ./Templates/CustomTemplates.xml --addПуть относителен к директории установки PLCnext CLI.
-
Попробуйте в действии!
Следующий список команд bash демонстрирует возможности нового шаблона:
plcncli new # Справка включает новый шаблон и описание plcncli new exeproject --help # Показывает пример использования этого шаблона plcncli new exeproject --name "HelloWorld" # Создает новый проект на основе шаблона cd HelloWorld plcncli set target -n AXCF2152 -v 2022 --add # Устанавливает цель сборки plcncli build # Собирает проект с кодом шаблона по умолчанию scp bin/AXCF2152_22.0.3.129/Release/HelloWorld admin@192.168.1.10:~ # Копирует исполняемый файл на устройство ssh admin@192.168.1.10 ./HelloWorld # Запускает исполняемый файл!
Участие в разработке
В будущем планируется, что вклад в проект PLCnext CLI Templates на Github станет возможным. Пока что вы можете открыть issue с идеями для новых шаблонов или с примерами созданных вами шаблонов.
Вопросы или комментарии?
Оставьте комментарий ниже или задайте вопросы на форуме PLCnext Community.
Промышленные технологии
- Шаблоны классов в C++: практическое руководство
- Шаблоны в C++: руководство по обобщённому программированию
- Обработка XML в Python: руководство по управлению взаимодействующими данными
- Оптимизация настройки VLAN на PLCnext Control с командами Linux терминала
- Безопасный удаленный gRPC доступ с grpcurl на устройствах PLCnext
- Интеграция Alibaba Cloud Connector с PLCnext: Пошаговое руководство
- Безопасный доступ к веб-серверу PLCnext с IP по DHCP
- Удаленная активация ПК через PLCnext с Wake-on-LAN
- Управление кластерами на PLCnext: Использование Kubernetes для промышленной автоматизации
- Мониторинг PLCnext в реальном времени с дашбордами Tableau