PLCnext CLI 模板:简化 C++ 开发流程
本文适用于 PLCnext CLI 22.0.0 LTS 版本。
若您使用 C++ 编程 PLCnext Control 设备,大概率用过随 PLCnext CLI 安装的代码模板。
在 Visual Studio 和 Eclipse 中,通过 PLCnext 项目向导(随 PLCnext IDE 扩展安装)创建新项目时,必须选择所需的项目模板。
使用 PLCnext CLI 在命令行生成新 C++ 项目时,也必须指定项目模板。
三个默认项目模板为:
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 在使用该模板时执行的操作。
上述模板描述文件实现了您已熟悉的三个默认项目模板。
如何激活额外模板
随 PLCnext CLI 默认安装有一个“隐藏”项目模板,默认不可用:
minimumproject 同 acfproject,但无在全局数据空间创建端口变量的能力。
通过将 MinimalAcfTemplates.xml 文件(您可能已在 Templates 目录中注意到)添加到模板位置设置,可使该模板在 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 模板的创建。将创建一个生成 C++“Hello World!”控制台应用的 PLCnext CLI 模板。
步骤如下:
创建新 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 的项目配置信息,如项目应构建的目标列表。
本示例中,从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帮助系统的相应章节。
创建新的 Templates 文件,告知 PLCnext CLI 我们的新模板。
本示例中,将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 论坛提问。
工业技术
- 用Linux终端命令在PLCnext Control上快速配置VLAN
- 在PLCnext设备上用grpcurl安全远程访问gRPC
- 将阿里云连接器与 PLCnext 集成:分步指南
- 安全访问通过 DHCP 获取 IP 的 PLCnext Web 服务器
- 通过 Wake-on-LAN 利用 PLCnext 远程唤醒 PC
- PLCnext 集群管理:利用 Kubernetes 赋能工业自动化
- 基于 Tableau 打造 PLCnext 实时监控仪表板
- 从 PLCnext 云数据创建 Power BI 仪表板
- 在 Azure IoT Hub 中为 PLCnext Control 构建实时 Grafana 仪表板
- C++ 类模板实战指南:编写灵活的类型无关代码
- C++模板编程指南:泛型编程基石与函数/类模板实战
- Python XML 处理指南:实现跨平台数据互操作