PLCnext CLIテンプレートでC++開発を効率化
この記事はPLCnext CLIバージョン22.0.0 LTSに適用されます。
PLCnext ControlデバイスをC++でプログラミングしている場合、PLCnext CLIとともにインストールされるコードテンプレートを使用したことがあるでしょう。
Visual StudioとEclipseでは、PLCnext IDE拡張機能とともにインストールされるPLCnextプロジェクトウィザードで新しいプロジェクトを作成する際に、使用するプロジェクトテンプレートを選択する必要があります。
PLCnext CLIでコマンドラインから新しいC++プロジェクトを生成する場合も、プロジェクトテンプレートを指定する必要があります。
デフォルトの3つのプロジェクトテンプレートは以下の通りです:
project ユーザープログラムのテンプレート。PLM(プログラムライブラリマネージャー)によって管理されます。
acfproject コンポーネントベースのプラットフォーム開発用テンプレート。結果のコンポーネントはACF(アプリケーションコンポーネントフレームワーク)によって管理されます。
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>
……Templatesディレクトリ以下の各ディレクトリにあるさまざまなタイプのTemplateDescription.xmlファイルへの参照がわかります。これらには、そのテンプレートが使用されたときにPLCnext CLIが何をするかを指示する命令が含まれています。
上記のテンプレート記述ファイルは、すでに慣れ親しんでいる3つのデフォルトプロジェクトテンプレートを実装しています。
追加テンプレートを有効化する方法
PLCnext CLIとともにデフォルトでインストールされる「隠れた」プロジェクトテンプレートが1つあり、これはデフォルトでは使用できません:
minimumproject acfprojectと同じですが、グローバルデータスペースでのポート変数の作成機能がありません。
Templatesディレクトリにすでに存在しているMinimalAcfTemplates.xmlファイルをテンプレートロケーション設定に追加することで、このテンプレートをPLCnext CLIで使用できるようにします:
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テンプレートの作成を、シンプルな例で実演します。「Hello World!」コンソールアプリケーションをC++で生成するPLCnext CLIテンプレートを作成します。
手順は以下の通りです:
新しいPLCnext CLIプロジェクトテンプレート用のディレクトリを作成します。
Linuxの場合:user@machine:~/plcncli/Templates$ mkdir ExeTemplate && cd ExeTemplateテンプレートC++コードを含むファイルを作成します。これは、このタイプの新しいプロジェクトの出発点として使用できます。
この例で使用するC++コードは:user@machine:~/plcncli/Templates/ExeTemplate$ touch Main.cpp#include <iostream> int main() { std::cout << "Hello World!" << std::endl; return 0; }テンプレートCMakeソースファイルを作成します。
この例で使用するCMakeコードは:user@machine:~/plcncli/Templates/ExeTemplate$ touch CMakeLists.txtcmake_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}/src) ####################################################################################### ################# 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のプロジェクト設定情報(プロジェクトがビルドされるターゲットのリストなど)を格納するために使用します。
この例では、ConsumableLibraryTemplateディレクトリから.projファイルをコピーし、編集して以下のようにしました:<?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)が含まれ、新しいプロジェクトの作成時にプロジェクト名で置き換えられます。テンプレート記述ファイルを作成します。
この例では、ConsumableLibraryTemplateディレクトリからTemplateDescription.xmlファイルをコピーし、編集して以下のようにしました:<?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ヘルプシステムの関連セクションに表示されます。
PLCnext CLIに新しいテンプレートを知らせるための新しいTemplatesファイルを作成します。
この例では、Templatesディレクトリ内のMinimalAcfTemplates.xmlファイルを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 # 実行ファイルを実行!
貢献
将来的には、Github上のPLCnext CLI Templatesプロジェクトへの貢献が可能になる予定です。それまでは、新しいテンプレートのアイデアや、自分で作成したテンプレートの例をIssueとして投稿できます。
質問やコメント?
以下にコメントを投稿するか、PLCnext Community Forumで質問してください。
産業技術
- PLCnext ControlでLinuxターミナルコマンドを使いVLAN設定を効率化
- PLCnextデバイスでgrpcurlを用いた安全なリモートgRPCアクセス
- PLCnextとAlibaba Cloud Connectorの連携:ステップバイステップガイド
- DHCPで割り当てられたIPを持つPLCnext Webサーバーに安全にアクセス
- PLCnextでWake-on-LANを使用してPCをリモート起動
- PLCnextでのクラスタ管理:産業オートメーションにおけるKubernetesの活用
- TableauダッシュボードでPLCnextをリアルタイム監視
- PLCnextクラウドデータからPower BIダッシュボードを作成
- C++クラステンプレート完全ガイド:実践的なジェネリックプログラミング
- C++テンプレート完全ガイド:ジェネリックプログラミングの基礎
- Python XML処理:相互運用可能なデータ管理ガイド