【博图TIA-Api】通过Excel自动新建文件夹和导入FB块

2024-03-03 02:04

本文主要是介绍【博图TIA-Api】通过Excel自动新建文件夹和导入FB块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【博图TIA-Api】通过Excel自动新建文件夹和导入FB块

  • 说明
  • 思路
  • 准备
    • 获取Excel表格内文件名和FB块名等信息
    • 新建文件夹部分
      • 筛分获取的文件夹数据,去掉重复内容
      • 创建文件夹
    • 导入FB块
      • 导出FB块的xml文件
      • 查找需要放置的文件夹
      • 导入块

说明

续上一篇文章,这次是根据Excel表格在程序内新建文件夹和导入FB块。

思路

  • 调用TIA的Api接口
  • 实现方式为C#的“Windows 窗体应用(.NET Framework),(默认PC已经装了Visual Studio)
  • 文件夹名和FB块名存在Excel文件中,导入时需要选择文档
  • 西门子子接口使用文档(中文的) 点击链接进入
  • 注意如果文件夹已经存在就不能新建。
  • FB块如果存在可以覆盖,方便快速修改。

准备

该文章已提过的准备事项就不再重复,只提及未重复的。链接: 【博图TIA-Api】通过Excel自动快速导入IO变量

获取Excel表格内文件名和FB块名等信息

上述链接可查看。

新建文件夹部分

筛分获取的文件夹数据,去掉重复内容

注意这里并不是去除程序内的重复文件夹,只是对Excel文件内读取的文件名去重。

public static void CreatNewFileGroup(string filepath, PlcSoftware plcsoftware, bool enabled)
{if (!enabled){return;}string[] result = new string[300];int i;int j = 1;bool Mid;string[,] strings = new string[1000, 15];strings = ManualImport.ManualReadExcelFile(filepath);//筛选出所有组名for (i = 1; strings[i, 1] != null; i++){Mid = false;//有重复的就不加入数组foreach (string strmid in result){if (strmid == strings[i, 1]){Mid = true;break;}}//没重复的添加进数组if (!Mid){result[j] = strings[i, 1];j++;}Mid = true;}//调用文件夹新建程序for (i = 1; result[i] != null; i++){ManualImport.CreateBlockGroup(plcsoftware, result[i]);}
}

创建文件夹

注意由于PLC内文件夹可能会有很多层级,我这里默认是三个层级,如果层级更多可以按照这样写。[]

在这里插入图片描述

public static void CreateBlockGroup(PlcSoftware plcsoftware, string FileName)
{//测试用string[] strings = new string[20];int i, j;PlcBlockGroup userblock1, userblock2, userblock3, userblock4;PlcBlockGroup finallyblock;PlcBlockSystemGroup systemGroup = plcsoftware.BlockGroup;//测试用于查看块组名字--程序块#region 已屏蔽//string NameBlock =systemGroup.Name;#endregion//获取程序块下三个大文件夹,第0个是程序块文件夹最下面的一个,也就是需要的#region 获取 根目录i = 0;j = 0;foreach (PlcBlockGroup blockgroup in systemGroup.Groups){strings[i] = blockgroup.Name;if (strings[i] == "根目录名"){j = i;}i = i + 1;}userblock1 = systemGroup.Groups[j];#endregion#region 获取 层级一i = 0;j = 0;foreach (PlcBlockGroup blockgroup in userblock1.Groups){strings[i] = blockgroup.Name;if (strings[i] == "层级一名"){j = i;}i = i + 1;}userblock2 = userblock1.Groups[j];#endregion#region 获取 层级二i = 0;j = 0;foreach (PlcBlockGroup blockgroup in userblock2.Groups){strings[i] = blockgroup.Name;if (strings[i] == "层级二名"){j = i;}i = i + 1;}userblock3 = userblock2.Groups[j];#endregion#region 获取 层级三i = 0;j = 0;foreach (PlcBlockGroup blockgroup in userblock3.Groups){strings[i] = blockgroup.Name;if (strings[i] == "层级三名"){j = i;}i = i + 1;}userblock4 = userblock3.Groups[j];#endregionfinallyblock = userblock4;//确保文件夹不重复j = 0;foreach (PlcBlockGroup blockgroup in finallyblock.Groups){strings[i] = blockgroup.Name;if (strings[i] == FileName){//代表文件夹已经存在j = 100;}i = i + 1;}if (j == 100){return;}else{PlcBlockUserGroupComposition groupComposition = finallyblock.Groups;//新建文件夹名PlcBlockUserGroup myCreatedGroup = groupComposition.Create(FileName);}}

导入FB块

导出FB块的xml文件

注意一般这个功能适合哪些重复的FB块导入,比如说一些标准块。

导出FB块的xml文件可以从版本控制接口导出。
在这里插入图片描述
在这里插入图片描述

查找需要放置的文件夹

这里就以之前的三个层级位置举例。
这里需要返回需要的文件夹变量PlcBlockGroup

 public static PlcBlockGroup FindMovementFB(string BlockGroupName, PlcSoftware plcsoftware){string[] strings = new string[20];int i, j;PlcBlockGroup userblock1, userblock2, userblock3, userblock4, userblock5;PlcBlockGroup finallyblock;PlcBlockSystemGroup systemGroup = plcsoftware.BlockGroup;//测试用于查看块组名字--程序块#region 已屏蔽//string NameBlock =systemGroup.Name;#endregion//获取程序块下三个大文件夹,第0个是程序块文件夹最下面的一个,也就是需要的OEM#region 获取 根目录i = 0;j = 0;foreach (PlcBlockGroup blockgroup in systemGroup.Groups){strings[i] = blockgroup.Name;if (strings[i] == "根目录名"){j = i;}i = i + 1;}userblock1 = systemGroup.Groups[j];#endregion#region 获取 层级一i = 0;j = 0;foreach (PlcBlockGroup blockgroup in userblock1.Groups){strings[i] = blockgroup.Name;if (strings[i] == "层级一名"){j = i;}i = i + 1;}userblock2 = userblock1.Groups[j];#endregion#region 获取 层级二i = 0;j = 0;foreach (PlcBlockGroup blockgroup in userblock2.Groups){strings[i] = blockgroup.Name;if (strings[i] == "层级二名"){j = i;}i = i + 1;}userblock3 = userblock2.Groups[j];#endregion#region 获取 层级三i = 0;j = 0;foreach (PlcBlockGroup blockgroup in userblock3.Groups){strings[i] = blockgroup.Name;if (strings[i] == "层级三名"){j = i;}i = i + 1;}userblock4 = userblock3.Groups[j];#endregioni = 0;j = 0;foreach (PlcBlockGroup blockgroup in userblock4.Groups){strings[i] = blockgroup.Name;if (strings[i] == BlockGroupName){j = i;}i = i + 1;if (i >= 30){break;}}userblock5 = userblock4.Groups[j];#region 获取需要放置的文件夹#endregionfinallyblock = userblock5;//返回需要的PlcBlockGroupreturn finallyblock;}

导入块

这里的xml文件默认放在改程序的根目录。

public static void InputMovementFB(string filepath, string Xmlpath, PlcSoftware plcsoftware, bool enabled)
{if (!enabled){return;}string[] result = new string[300];int i;int j = 1;bool Mid;string[,] strings = new string[1000, 18];//读取Excel表格内容strings = ManualImport.ManualReadExcelFile(filepath);XmlDocument xmlDoc = new XmlDocument();//加载xml文件,文件xmlDoc.Load(Xmlpath);bool mid1, mid2, mid3;for (i = 1; strings[i, 1] != null; i++){#region 修改FB块名字//查找要修改的节点XmlNode Name = xmlDoc.SelectSingleNode("Document/SW.Blocks.FB/AttributeList");//取出所有的子节点XmlNodeList xnl = Name.ChildNodes;mid1 = false;mid2 = false;//取出PLC变量表名字foreach (XmlNode xmlNode in xnl){//将节点转换一下类型XmlElement xmlElement = (XmlElement)xmlNode;//判断该子节点是否是要查找的节点if (xmlElement.Name == "Name"){//设置新值xmlElement.InnerText = "NO" + strings[i,2]+"MB"+ strings[i,5]+"_"+ strings[i,3];mid1 = true;}//判断该子节点是否是要查找的节点if (xmlElement.Name == "Number"){                        //设置新值xmlElement.InnerText = Convert.ToString(600+(Convert.ToInt32(strings[i, 2])-1)*20+Convert.ToInt32(strings[i, 5]));mid2 = true;}if (mid1 && mid2){break;}}#endregion//保存修改的Xml文件内容xmlDoc.Save(Xmlpath);FindMovementFB(strings[i, 1], plcsoftware).Blocks.Import(new FileInfo(Xmlpath), ImportOptions.Override); ;}}

注意这里修改的xml文件位置在此处

在这里插入图片描述

这篇关于【博图TIA-Api】通过Excel自动新建文件夹和导入FB块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/768116

相关文章

浅析Python中的绝对导入与相对导入

《浅析Python中的绝对导入与相对导入》这篇文章主要为大家详细介绍了Python中的绝对导入与相对导入的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1 Imports快速介绍2 import语句的语法2.1 基本使用2.2 导入声明的样式3 绝对import和相对i

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Java实战之利用POI生成Excel图表

《Java实战之利用POI生成Excel图表》ApachePOI是Java生态中处理Office文档的核心工具,这篇文章主要为大家详细介绍了如何在Excel中创建折线图,柱状图,饼图等常见图表,需要的... 目录一、环境配置与依赖管理二、数据源准备与工作表构建三、图表生成核心步骤1. 折线图(Line Ch

Python3脚本实现Excel与TXT的智能转换

《Python3脚本实现Excel与TXT的智能转换》在数据处理的日常工作中,我们经常需要将Excel中的结构化数据转换为其他格式,本文将使用Python3实现Excel与TXT的智能转换,需要的可以... 目录场景应用:为什么需要这种转换技术解析:代码实现详解核心代码展示改进点说明实战演练:从Excel到

linux如何复制文件夹并重命名

《linux如何复制文件夹并重命名》在Linux系统中,复制文件夹并重命名可以通过使用“cp”和“mv”命令来实现,使用“cp-r”命令可以递归复制整个文件夹及其子文件夹和文件,而使用“mv”命令可以... 目录linux复制文件夹并重命名我们需要使用“cp”命令来复制文件夹我们还可以结合使用“mv”命令总

Java中实现订单超时自动取消功能(最新推荐)

《Java中实现订单超时自动取消功能(最新推荐)》本文介绍了Java中实现订单超时自动取消功能的几种方法,包括定时任务、JDK延迟队列、Redis过期监听、Redisson分布式延迟队列、Rocket... 目录1、定时任务2、JDK延迟队列 DelayQueue(1)定义实现Delayed接口的实体类 (

Python重命名文件并移动到对应文件夹

《Python重命名文件并移动到对应文件夹》在日常的文件管理和处理过程中,我们可能会遇到需要将文件整理到不同文件夹中的需求,下面我们就来看看如何使用Python实现重命名文件并移动到对应文件夹吧... 目录检查并删除空文件夹1. 基本需求2. 实现代码解析3. 代码解释4. 代码执行结果5. 总结方法补充在

Python自动化办公之合并多个Excel

《Python自动化办公之合并多个Excel》在日常的办公自动化工作中,尤其是处理大量数据时,合并多个Excel表格是一个常见且繁琐的任务,下面小编就来为大家介绍一下如何使用Python轻松实现合... 目录为什么选择 python 自动化目标使用 Python 合并多个 Excel 文件安装所需库示例代码

shell脚本自动删除30天以前的文件(最新推荐)

《shell脚本自动删除30天以前的文件(最新推荐)》该文章介绍了如何使用Shell脚本自动删除指定目录下30天以前的文件,并通过crontab设置定时任务,此外,还提供了如何使用Shell脚本删除E... 目录shell脚本自动删除30天以前的文件linux按照日期定时删除elasticsearch索引s

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.