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

    #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文件位置在此处

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ //练习 10.19 用stable_partition重写前一题的程序,与stable_sort类似,在划分后的序列中维持原有元素的顺序。

C Primer(第5版) 练习 10.19 练习 10.19 用stable_partition重写前一题的程序,与stable_sort类似,在划分后的序列中维持原有元素的顺序。 环境:Linux Ubuntu(云服务器) 工具:vim …

【buuctf-gakki】

binwalk 查看图片,发现有 rar 文件,提取后如上图所示(flag.txt为已经解压后出来的)其中这个 rar 需要用 archpr爆破一下 打开后一个 flag.txt 一堆杂乱无章的字符,需要用到 python 脚本进行词频统计,我们…

专家教你学汽车美容护理,汽车美容师职业技能教学

一、教程描述 本套汽车美容教程,大小2.52G,61个文件。 二、教程目录 01-大家跟我学汽车美容(共30课时) 02-汽车内外饰物的安装(共15课时) 03-汽车必需设施的安装(共13课时) 04…

测开新手:pytest+requests+allure自动化测试接入Jenkins学习

最近在这整理知识,发现在pytest的知识文档缺少系统性,这里整理一下,方便后续回忆。 在python中,大家比较熟悉的两个框架是unittest和pytest: Unittest是Python标准库中自带的单元测试框架,Unittest有时候…

图论 - Trie树(字符串统计、最大异或对)

文章目录 前言Part 1:Trie字符串统计1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 Part 2:最大异或对1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 前言 本篇博客将介绍Trie树的常见应用,包括:Trie…

实验室记账项目(java+Mysql+jdbc)

前言: 因为自己学习能力有限和特殊情况必须要找一个项目来做,但是上网搜的那些项目有两种(一种是技术太多,自己能力不够;一种是技术太少,项目太简单)导致都不适合本人,本人现有技术只…

店务管理系统:都有哪些功能,是否是高效管理店面的神器

hello,我是贝格前端工场,直接给大家介绍了各类通用的B端管理系统,受到了大家的欢迎。本次开始介绍针对具体行业的管理系统该如何设计和开发,这次分享——店务管理系统,欢迎大家持续关注、点赞,如有系统定制…

使用python实现一个SCP小工具

源码地址: ssh_scp 工具截图: 一个简易的scp文件上传下载小工具,用来上传或下载一些小文件。 目前只适用于windows, 使用方法: 前提: 工具同级目录,创建一个ssh_commands.json文件。用来存储配…

网络攻防之CVE-2020-15778漏洞的复现及修复详细过程

目录 漏洞描述 实验环境 漏洞复现 漏洞修复 漏洞扩展 漏洞描述 (1)漏洞编号:CVE-2020-15778 (2)CVE官网对该漏洞的解释 (3)漏洞简介:2020年6月9日,研究人员Chinmay Pandya在Openssh中发现了一个漏洞,于7月18日公开。OpenSSH的8.3p1中的scp允许在scp.c远程功能中注入命…

Sqli-labs靶场第14关详解[Sqli-labs-less-14]

Sqli-labs-Less-14 #手工注入 post传参了 根据题目看,像一个登录页面,尝试使用布尔型盲注测试能否登录网站 1. Username输入a" 测试是否会有报错,burp抓包 报错:syntax to use near "a"" and password&q…

【Java文件报错】Cannot resolve symbol ‘println‘ 【及解决】

一、问题描述 在Java源代码文件中,使用 System.out.println() 语句进行输出,编译器提示“Cannot resolve symbol ‘println’(无法解释关键字)”, println飘红。报错代码及报错截图如下所示。 import java.io.*;public class St…

【Java】面向对象之多态超级详解!!

文章目录 前言一、多态1.1 多态的概念1.2 多态的实现条件1.3 重写1.3.1方法重写的规则1.3.2重写和重载的区别 1.4 向上转型和向下转型1.4.1向上转型1.4.2向下转型 1.5 多态的优缺点1.5.1 使用多态的好处1.5.2 使用多态的缺陷 结语 前言 为了深入了解JAVA的面向对象的特性&…

TypeScript 哲学 - 2、Narrowing

四种类型守卫 1、truthiness narrowing 2、 3、 4、 control flow analysis

内网渗透-DC-9靶机渗透

攻击机:kali 192.168.236.137 目标机:dc-9 192.168.236.138 一、信息收集 1.使用arp-scan -l和nmap进行主机发现和端口信息收集 nmap -sS -T5 --min-rate 10000 192.168.236.138 -sC -p- 发现22端口被阻塞 2.whatweb收集一下cms指纹信息 what http…

maven项目导入mysql依赖

最近在B站跟着狂神学习Mybatis,学到P2就卡住了,搭建的maven项目一直无法导入依赖,在网上查找了很多相关的解决方法,project structure不知道点进去多少回,始终无法解决,后来把responsity文件夹删除重置了一…

vos3000外呼系统如何修改话机注册端口

本文以vos3000为例,其他产品替换对应产品名称即可 修改配置文件地址 /home/kunshi/mbx3000/etc/softswitch.conf H323_RAS_PORT1719 H323 注册端口,可以用逗号(,)分隔多个端口 H323_RC4_RAS_PORT3719 H323 加密注册端口&#x…

Unity(第二十三部)导航

你可以使用 unity官方提供的 unity导航组件或第三方 unity导航组件,以实现游戏中角色或其他物体的导航。 unity导航组件通常具有多种导航模式,如飞行模式、步行模式、车辆模式等,可以根据不同的需求选择合适的模式。同时,unity导…

Vue.js+SpringBoot开发社区买菜系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 数据中心模块2.1.2 菜品分类模块2.1.3 菜品档案模块2.1.4 菜品订单模块2.1.5 菜品收藏模块2.1.6 收货地址模块 2.2 可行性分析2.3 用例分析2.4 实体类设计2.4.1 菜品分类模块2.4.2 菜品档案模块2.4.3…

c语言数据结构(5)——栈

欢迎来到博主的专栏——C语言数据结构 博主id:代码小豪 文章目录 栈栈的顺序存储结构栈的插入空栈的初始化栈的删除判断空栈读取栈顶元素数据 实现顺序栈的所有代码栈的链式存储结构链式栈的初始化链式栈的入栈操作链式栈的出栈操作 实现链式栈的所有代码 栈 栈是…

麒麟银河操作系统V10部署ffmpeg(也能用于Linux系统)

麒麟银河操作系统V10部署ffmpeg(也能用于Linux系统) 部署ffmpeg用来处理视频的各种操作 想使用ffmpeg,要先安装nasm,yasm,x264之后,否则会报错 nkvers 查看麒麟操作系统版本 cat /proc/version #查看linux版本信息 uname -a …