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

news2024/11/15 15:25:38

【博图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];

    #endregion

    finallyblock = 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];

     #endregion
     i = 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 获取需要放置的文件夹

     #endregion
     finallyblock = userblock5;
     //返回需要的PlcBlockGroup
     return 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文件位置在此处

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1483967.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python爬虫——Urllib库-3

目录 ajax的get请求 获取豆瓣电影第一页的数据并保存到本地 获取豆瓣电影前十页的数据 ajax的post请求 总结 ajax的get请求 获取豆瓣电影第一页的数据并保存到本地 首先可以在浏览器找到发送数据的接口 那么我们的url就可以在header中找到了 再加上UA这个header 进行请…

【Easyx】easyx从入门到精通 — 初步入门

easyx 初步入门 1 安装easyx图形库2 如何使用Easyx3 效果初试4 基本图形绘制4.1 绘制点4.2 绘制直线4.3 绘制圆形4.4 绘制矩形4.5 绘制椭圆4.6 绘制圆角矩形4.7 绘制扇形 Thanks♪(・ω・)ノ谢谢阅读!!!下一篇…

mTSL: netty单向/双向TLS连接

创建证书 不管是单向tls还是双向tls(mTLS),都需要创建证书。 创建证书可以使用openssl或者keytool,openssl 参考 mTLS: openssl创建CA证书 单向/双向tls需要使用到的相关文件: 文件单向tls双向tlsServer端Client端备注ca.key----需要保管好&#xff0…

Linux高负载排查最佳实践

在Linux系统中,经常会因为负载过高导致各种性能问题。那么如何进行排查,其实是有迹可循,而且模式固定。 本次就来分享一下,CPU占用过高、磁盘IO占用过高的排查方法。 还是那句话,以最佳实践入手,真传一句话…

mysql 常用命令练习

管理表格从表中查询数据从多个表查询修改数据sql变量类型 管理表格 创建一个包含三列的新表 CREATE TABLE products (id INT,name VARCHAR(255) NOT NULL,price INT DEFAULT 0,PRIMARY KEY(id) // 自增 ); 从数据库中删除表 DROP TABLE product; 向表中添加新列 ALTER TAB…

使用Xftp连接CentOS 7进行文件的传输

一、查看虚拟机IP地址 在虚拟机中打开终端输入 ifconfig : 我的虚拟机IP为192.168.23.131 二、打开XFtp 7连接虚拟机 其余设置为默认,点击连接后输入你的用户名和密码: 输入密码后弹出如下界面表示连接成功~ 三、传输文件 传输文件只需用鼠…

【Linux杂货铺】调试工具gdb的使用

目录 🌈前言🌈 📁背景介绍 📁 使用 list [行号] / [函数名] run/r break/b [行号] / [函数名] info break disable break enable break delete break [断点编号] next/n step/s continue/c finish print/p [变量…

Leetcode438. 找到字符串中所有字母异位词 -hot100

题目&#xff1a; 代码(首刷看解析 2024年3月2日&#xff09;&#xff1a; 感觉自己这个ac率根本不可能找得到实习 class Solution { public:vector<int> findAnagrams(string s, string p) {int plen p.size(), slen s.size();if (slen < plen) return {};vector…

LeetCode 热题 100 | 图论(一)

目录 1 200. 岛屿数量 2 994. 腐烂的橘子 2.1 智障遍历法 2.2 仿层序遍历法 菜鸟做题&#xff0c;语言是 C 1 200. 岛屿数量 解题思路&#xff1a; 遍历二维数组&#xff0c;寻找 “1”&#xff08;若找到则岛屿数量 1&#xff09;寻找与当前 “1” 直接或间接连接在…

sqlserver保存微信Emoji表情

首先将数据库字段&#xff0c;设置类型为 nvarchar(200)一个emoji表情&#xff0c;占4字节就可以了&#xff0c;web前端展示不用改任何东西&#xff0c;直接提交数据保存&#xff1b;回显也会没有问题&#xff0c;C#代码不用做任何处理&#xff1b; 不哭不闹要睡觉&#x1f31…

基于springboot+vue的抗疫物资管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

2023人机交互期末复习

考试题型及分值分布 1、选择题&#xff08;10题、20分&#xff09; 2、填空题&#xff08;10题、20分&#xff09; 3、判断题&#xff08;可选、5题、10分&#xff09; 4、解答题&#xff08;5~6题、30分&#xff09; 5、分析计算题&#xff08;1~2题、20分&#xff09; 注意&…

maven的私服

什么是maven的私服就是把自己写的工具类共享给别人这样大家都能用到你写的工具类不用重复写提示效率 maven的上传与下载示意图 1.什么是发行版本&#xff1f;发行版本指定的是功能稳定可以共大家使用的版本 2.什么是快照版本&#xff1f;快照版本指定的是指正在开发的版本 3…

[计算机网络]--五种IO模型和select

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、五种IO…

.idea文件详解

.idea文件的作用&#xff1a; .idea文件夹是存储IntelliJ IDEA项目的配置信息&#xff0c;主要内容有IntelliJ IDEA项目本身的一些编译配置、文件编码信息、jar包的数据源和相关的插件配置信息。一般用git做版本控制的时候会把.idea文件夹排除&#xff0c;因为这个文件下保存的…

qt+opencv 获取图像灰度值并以QTableView展现

思路如下&#xff1a; 先用opencv方法打开并以灰度图像的方式读取一张图片&#xff0c;然后获取整张图所有像素点的灰度值&#xff0c;将这些值存入容器中。然后因为图像为8192*4096的尺寸&#xff0c;像素点灰度值数据量较大。因此采用QTableView加自定义QAbstractTableModel的…

测试需求平台8-Arco组件实现产品增改需求

✍此系列为整理分享已完结入门搭建《TPM提测平台》系列的迭代版&#xff0c;拥抱Vue3.0将前端框架替换成字节最新开源的arco.design&#xff0c;其中约60%重构和20%新增内容&#xff0c;定位为从 0-1手把手实现简单的测试平台开发教程&#xff0c;内容将囊括基础、扩展和实战&a…

栈(顺序栈)实现Language C

###王道考研的学习领悟&#xff0c;个人喜好讲解清晰 何为栈&#xff1f; 定义:栈&#xff08;stack&#xff09;是只允许在一端进行插入或删除的线性表。 其重要术语&#xff1a;栈顶&#xff0c;栈底&#xff0c;空栈。 我们只需要把这个图看明白了&#xff0c;理解起来就…

nest.js使用nest-winston日志一

nest-winston文档 nest-winston - npm 参考&#xff1a;nestjs中winston日志模块使用 - 浮的blog - SegmentFault 思否 安装 cnpm install --save nest-winston winstoncnpm install winston-daily-rotate-file 在main.ts中 import { NestFactory } from nestjs/core; im…

JVM类加载机制以及双亲委派模型的介绍

目录 1.类加载介绍 2.具体步骤 2.1加载 2.2验证 2.3准备 2.4解析 2.5初始化 3.加载过程中的策略-双亲委派模型 1.类加载介绍 类加载,指的是Java进程在运行的时候,把.class文件从硬盘读取到内存,并进行一系列校验解析的过程. .class文件>类对象.硬盘>内村 类加载…