亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 工业技术

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:

本文介绍如何激活和使用随 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 模板。

步骤如下:

  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 的项目配置信息,如项目应构建的目标列表。
    本示例中,从 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),创建每个新项目时将替换为项目名称。

  6. 创建模板描述文件。
    本示例中,从 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 帮助系统的相应章节。
  7. 创建新的 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> 
  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 # 运行可执行文件! 

贡献

未来计划支持在 GitHub 上向 PLCnext CLI Templates 项目贡献代码。在此之前,您可提交 Issue 提出新模板想法,或分享您创建的模板示例。

疑问或评论?

在下方评论,或在 PLCnext Community 论坛提问。


工业技术

  1. 用Linux终端命令在PLCnext Control上快速配置VLAN
  2. 在PLCnext设备上用grpcurl安全远程访问gRPC
  3. 将阿里云连接器与 PLCnext 集成:分步指南
  4. 安全访问通过 DHCP 获取 IP 的 PLCnext Web 服务器
  5. 通过 Wake-on-LAN 利用 PLCnext 远程唤醒 PC
  6. PLCnext 集群管理:利用 Kubernetes 赋能工业自动化
  7. 基于 Tableau 打造 PLCnext 实时监控仪表板
  8. 从 PLCnext 云数据创建 Power BI 仪表板
  9. 在 Azure IoT Hub 中为 PLCnext Control 构建实时 Grafana 仪表板
  10. C++ 类模板实战指南:编写灵活的类型无关代码
  11. C++模板编程指南:泛型编程基石与函数/类模板实战
  12. Python XML 处理指南:实现跨平台数据互操作