Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Промышленные технологии

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:

В этой статье описывается, как активировать и использовать дополнительные шаблоны проектов, устанавливаемые с 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++.

Процедура:

  1. Создайте директорию для нового шаблона проекта PLCnext CLI.

    В Linux:

    user@machine:~/plcncli/Templates$ mkdir ExeTemplate && cd ExeTemplate
  2. Создайте файл с шаблонным C++ кодом, который будет отправной точкой для каждого нового проекта этого типа.

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

    Используемый в примере C++ код:

    #include <iostream>
    int main() {
      std::cout << "Hello World!" << std::endl;
      return 0;
    }
  3. Создайте исходный файл шаблона 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.

  4. Опционально: добавьте файл README в новую директорию шаблона, который также можно использовать для создания README в каждом новом проекте, создаваемом из этого шаблона.

  5. Создайте файл конфигурации проекта 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), который будет подставлен именем проекта при создании каждого нового проекта.

  6. Создайте файл описания шаблона.

    Для этого примера файл 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.
  7. Создайте новый файл 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>
  8. Зарегистрируйте пользовательские шаблоны в PLCnext CLI:

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

    Путь относителен к директории установки PLCnext CLI.

  9. Попробуйте в действии!

    Следующий список команд 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.

Промышленные технологии

  1. Шаблоны классов в C++: практическое руководство
  2. Шаблоны в C++: руководство по обобщённому программированию
  3. Обработка XML в Python: руководство по управлению взаимодействующими данными
  4. Оптимизация настройки VLAN на PLCnext Control с командами Linux терминала
  5. Безопасный удаленный gRPC доступ с grpcurl на устройствах PLCnext
  6. Интеграция Alibaba Cloud Connector с PLCnext: Пошаговое руководство
  7. Безопасный доступ к веб-серверу PLCnext с IP по DHCP
  8. Удаленная активация ПК через PLCnext с Wake-on-LAN
  9. Управление кластерами на PLCnext: Использование Kubernetes для промышленной автоматизации
  10. Мониторинг PLCnext в реальном времени с дашбордами Tableau