公司动态
用博途Openness API实现PLC批量组态自动化,告别复制粘贴
简介基于TIA博途与Openness API的C#自动化程序生成资源包面向工业自动化开发者与PLC编程工程师解决重复性工程组态与程序编写效率低下的问题。资源围绕西门子博途Openness接口演示如何通过C#代码批量生成、读取和修改PLC项目数据适合需要搭建自动化工程流程或定制代码生成工具的中高级开发者。包内共272个文件压缩后5.48MB核心内容包含44个C#源码文件、73个SSK密钥/签名文件、34个XML配置、19个DLL动态库以及工程解决方案、资源文件、Excel表格等覆盖从项目结构、核心逻辑到依赖引用的完整开发链条。已有1436人学习下载。通过源码与配套工程可掌握Openness API调用方式、程序集引用配置、XML与Excel数据交互等关键技巧并能基于现有框架扩展出批量生成、参数化出图等实用功能有效提升博途环境下的开发效率。 如果你在博途里连续建过三十个阀门DB每个DB里还得带上十六个BOOL、八个REAL再配上对应的FC和FB调用你就能理解什么叫真正的重复劳动。这也是为什么我宁愿花一个晚上写脚本也不愿意再花一个白天复制粘贴。今天想聊的就是怎么利用博途自带的Openness API把这种纯手工活变成一条命令的事。这个方案适合所有被PLC标准化和批量组态折磨的工程师——不管你是做水处理、汽车产线还是物流仓储只要你的程序里有大量结构相同、地址不同的块Openness基本都能帮你省下百分之八十的时间。文章不会给你一本API手册我会把我从踩坑到跑通的完整路径复述一遍尤其是那些帮助文档里根本不会写的地方。1. 从复制粘贴一百遍说起Openness到底能帮忙干什么1.1 一个夜班建三十个阀门块的教训前两年我接手过一个水处理项目光电动阀门就三十多个。控制逻辑其实大同小异开反馈、关反馈、远程允许、故障报警、开命令、关命令再带上模拟量开度反馈和手自动切换。每套逻辑对应一个DB、一个FC外加触摸屏上的一组变量。刚开始我还老老实实在博途里一个个建建完DB建FC改完名字改地址复制完LAD段还得盯着交叉引用检查有没有连错。第三个阀门建完的时候我心里已经有点烦了第十个建完我开始怀疑人生到第十五个我停下来认真想了一个问题这种工作为什么不能交给程序做后来我查到了博途的Openness API——这是TIA Portal对外开放的一组.NET接口装在Windows系统里用C#或者VB.NET就能调用。它的核心作用就是让外部程序能够打开博途项目创建块、修改变量、编译程序、保存项目等于把你在博途图形界面里点的那些按钮全部变成可以编程调用的方法。1.2 Openness的能力边界我先把Openness能干什么列一个清单方便你判断自己的场景适不适合上自动化创建、删除、重命名、复制PLC块包括DB、FC、FB、OB和UDT读写全局DB里的变量批量修改变量的名称、数据类型、起始地址和注释导出块为XML文件也能把XML文件导入到项目中生成新的块调用编译功能并在编译后获取错误和警告列表遍历整个设备树拿到PLC、HMI、驱动等硬件对象在PLC变量表PLC Tags里批量添加和修改变量创建监视表、强制表执行项目的保存和备份它不能干什么不能帮你设计控制逻辑不能跨厂商操作其他品牌的PLC更不能在没有安装对应版本博途的电脑上运行。还有一点要明确——Openness只是博途的自动化接口它本身不能替代工程师做思考它擅长的是把明确、规则化、重复度高的操作批量执行。如果你的逻辑每一套都不一样、完全没有规律那自动化的收益就很低但如果你的程序里大量存在结构相同、只有地址和编号不同的块那Openness就是为这个场景量身定做的。1.3 为什么多数工程师觉得它门槛高很多同行一听Openness就说这不就是搞软件的人玩的东西吗我一开始也这么想真正上手之后才发现它需要的编程基础其实非常少。会写一点C#懂得用for循环遍历一批数据会处理字符串和数组基本就够了。真正的门槛不是编程而是信息太少。西门子的Openness帮助文档是全英文的而且写法相当机械光看懂方法签名不难难的是把它跟你的实际需求对上号。再加上博途版本迭代频繁网上搜到的示例可能还是V14时代的拿到V18/V21上根本跑不通。这篇文章里我尽量把版本差异也讲清楚至少让你少走几趟弯路。2. 跑通第一个Openness脚本环境准备与工程目录结构2.1 版本对照从v16到v21最容易踩的坑Openness的一大特性是版本严格绑定。你用V18的DLL去打开V16的项目报错几乎是必然的反过来用V16的DLL打开V21的项目更是天方夜谭。我整理了一下常用版本的对应关系博途版本项目文件后缀Openness程序集路径中标识备注V16.ap16PublicAPI\V16项目文件还是XML格式V17.ap17PublicAPI\V17项目文件改为压缩包格式V18.ap18PublicAPI\V18接口相对稳定V21.ap21PublicAPI\V21新一代版本界面和接口均有调整最容易被忽略的一点是安装博途的时候Openness组件不是默认安装的。如果你在安装过程中没有勾选Openness相关选件机器上就找不到Siemens.Engineering.dll这个文件代码写再多也没用。建议在安装界面里搜索Openness关键词确认勾选后再继续。另外强调一点Openness的DLL通常在C:\Program Files\Siemens\Automation\Portal V版本号\PublicAPI\对应版本号目录下文件名固定为Siemens.Engineering.dll。如果操作HMI相关功能同级目录下还有Siemens.Engineering.Hmi.dll需要的时候一并引用。2.2 新建C#项目并引用Openness程序集环境准备好之后打开Visual Studio新建一个控制台应用或者WPF应用都可以。框架建议选择.NET Framework 4.6.2以上版本太老的框架可能跟新版本博途的Openness程序集不兼容。项目建好后在解决方案资源管理器里右键引用选择添加引用再通过浏览定位到刚才说的Siemens.Engineering.dll文件点确定。代码顶部加上以下命名空间using Siemens.Engineering; using Siemens.Engineering.SW; using Siemens.Engineering.SW.Blocks;这三个命名空间覆盖了最常用的功能TiaPortal类的入口、软件对象的访问、块操作相关的接口。后面用到HMI相关功能时再加入Siemens.Engineering.Hmi命名空间。很多教程到这里就让你直接写代码了但我想多说一句引用路径要特别注意不要复制粘贴网上老教程里的路径一定要去你自己机器上确认实际安装目录。不同版本博途的安装路径结构略有差异尤其是升级安装过补丁包的机器路径里可能带上SP版本号写错了引用会直接失败。2.3 TiaPortalMode的选择有界面还是无界面第一次使用Openness第一行代码通常是这样TiaPortal tiaPortal new TiaPortal(TiaPortalMode.WithUserInterface);这个构造函数的参数有两种模式WithUserInterface和WithoutUserInterface。字面意思很好理解一个带博途界面一个不带界面。但真正用下来我强烈建议第一次调试时选择WithUserInterface。原因很简单WithoutUserInterface模式虽然是无头模式不弹出博途主窗口但在项目打开、迁移、或者遇到弹窗确认时它经常会卡在某个模态对话框上。一旦卡住你连手动点确定的机会都没有只能杀掉进程重来。WithUserInterface模式至少你能看到博途窗口正在干什么遇到异常可以人工介入。执行自动化脚本时博途窗口会在你眼前不断跳动闪烁这是正常的。如果你觉得受不了可以把窗口最小化但不要尝试用后台线程方式完全隐藏它——后面我会单独讲这个问题。3. 打开项目、定位PLC搞定设备树的遍历逻辑3.1 OpenProject之前先做好项目副本Openness打开项目的方法很简单但我要先说一个比方法本身更重要的习惯操作之前先复制项目目录。TIA项目在Openness的批处理下任何一步写错都可能让整个项目结构损坏尤其是批量删除块、批量改地址这种操作补救起来相当麻烦。我现在的标准流程是在Windows文件管理器里复制整个项目文件夹改个名字加上_backup后缀再让脚本去操作原项目。为什么不用博途自带的备份功能一是Openness脚本执行时你往往不在电脑前二是文件级复制比博途内部备份快得多也省事。项目副本的完整路径就是OpenProject方法的入参Project project tiaPortal.Projects.Open(D:\MyProject\MyProject.ap18);注意这里的路径指向的是项目文件夹不是内部的某个文件。关闭项目用project.Close()退出博途实例用tiaPortal.Exit()。3.2 GetDevicesAndContainers与设备树遍历打开项目之后下一步是找到你要操作的PLC。很多初学者一上来就用project.Devices遍历设备然后判断设备类型是不是PLC。这种做法能跑但有个明显的局限它只能拿到设备层面的对象拿不到设备内部的软件容器。真正稳定、完整的方式是foreach (IDeviceContainer container in project.GetDevicesAndContainers()) { if (container is PlcSoftware) { PlcSoftware plcSoftware (PlcSoftware)container; // 找到PLC软件后做后续操作 } }GetDevicesAndContainers()是Project对象提供的一个遍历方法它会以扁平化的方式返回设备树里的各种对象包括PLC软件、HMI软件、设备项等。用这个方式你不用自己去递归设备树省去了一堆类型判断和层级跳转的代码。而且它在西门子文档里被明确推荐兼容性比自行遍历设备项好得多。3.3 从PlcSoftware到BlockGroup的定位拿到PlcSoftware对象之后就能访问到它的BlockGroup属性这个属性对应博途PLC程序里的程序块分组。如果你需要把生成的块统一放在某个组里比如ValveLogic这个分组可以这样PlcBlockGroup rootGroup plcSoftware.BlockGroup; PlcBlockGroup valveGroup rootGroup.Groups.CreateFrom(ValveLogic);CreateFrom(ValveLogic)方法会创建一个新的块分组如果这个分组已经存在会抛出异常。所以脚本设计时最好先遍历已有的分组如果存在就直接引用不存在再创建避免运行到一半因为命名冲突中断。另一个容易踩坑的地方是GroupNames和BlockNames这两个API。它们返回的不是对象而是字符串数组表示某个分组下的子分组名称或块名称。很多博客示例直接把返回值当成对象列表用实际上是错的。我在实际开发中就因此栽过跟头写个简单判断if (rootGroup.Groups.GroupNames.Contains(ValveLogic)) { valveGroup rootGroup.Groups.Find(ValveLogic); } else { valveGroup rootGroup.Groups.CreateFrom(ValveLogic); }这样就能安全地复用已经存在的分组脚本跑第二次、第三次也不会出问题。4. 从模板到成品自动生成块的核心流程4.1 直接CreateFrom还是模板XML导入定位到目标分组后就要真正开始创建程序块了。这一步有两种思路我分别说一下适用场景。第一种是直接用API创建空块然后在代码里逐条添加变量声明。这种方式适合创建结构简单、以全局DB为主的块比如一个空DB加上若干变量。优点是你全部用代码控制灵活度高缺点是如果创建的块是FBD或LAD逻辑块Openness的标准API没有提供直接写入梯形图逻辑节点的方法你很难用代码把一段逻辑塞进去。第二种是模板XML导入法。具体做法是先在博途里手工建好一个模板块这个块内部包含了完整逻辑、变量、注释然后通过Openness或博途自带的导出功能把它导出成一个XML文件。后面批量生成时用代码复制这个XML修改其中的块名、变量名和地址再导入到目标分组中。以我熟悉的阀门控制为例我的模板FC里画好了完整的LAD逻辑包含开命令、关命令、反馈、报警等触点。批量生成时我只需要复制模板XML把里面的Valve_Template字符串替换成Valve_001、Valve_002这样编号再把IO地址段替换成对应的实际地址最后导入回去。这种方法对逻辑块特别友好因为它完整保留了图形化逻辑结构。4.2 用XML模板批量生成阀门逻辑块下面给你一段简化但能跑的C#思路展示了从XML模板到批量生成块的核心代码模式string templatePath D:\Templates\Valve_Template.xml; string targetPath D:\Temp\Valve_001.xml; string projectPath D:\MyProject\MyProject.ap18; TiaPortal tiaPortal new TiaPortal(TiaPortalMode.WithUserInterface); Project project tiaPortal.Projects.Open(projectPath); // 第一步从模板复制XML并替换关键文本 string xmlContent File.ReadAllText(templatePath); xmlContent xmlContent.Replace(Valve_Template, Valve_001); xmlContent xmlContent.Replace(I0.0, I10.0); xmlContent xmlContent.Replace(Q0.0, Q10.0); File.WriteAllText(targetPath, xmlContent); // 第二步找到PLC软件定位到目标分组 PlcSoftware plcSoftware FindPlcSoftware(project); PlcBlockGroup valveGroup plcSoftware.BlockGroup.Groups.CreateFrom(ValveLogic); // 第三步导入XML生成新块 valveGroup.Blocks.Import(targetPath); project.Save();这一段是最核心的循环骨架。你只需要把泛型部分抽出来在外面套一层遍历30个阀门清单的循环就能一次性生成几十个块。阀门编号和IO地址的对应关系通常可以从Excel清单或者IO表里导出成CSV再用C#读进来做替换。这样你的程序块编号、IO地址、注释内容全部由数据源驱动完全不需要人工干预。有个细节值得注意XML文件里的块名一般会出现多次有的是块本身的名称有的是内部逻辑块的名称还有的是注释里的名称。你在替换时不能搞全部替换这么简单粗暴最好先查看模板XML里Valve_Template出现了几处、分别是什么上下文再决定是全部替换还是针对性替换。我刚开始做的时候把注释里提到模板型号的字符串也替换成了实际阀门编号结果博途里一片混乱后来只能回滚项目重来。4.3 编译与保存Compile的返回值和处理节奏生成的块导入之后不会立刻出现在PLC程序编辑器的正确位置必须经过一次编译才会被博途识别为合法的程序块。编译操作其实很简单var compileResults block.Compile(); foreach (var result in compileResults) { // 每个result里包含State、Messages等属性 // State表示编译状态Success、Warning、Error等 }编译结果的State如果是Success说明这个块可以正常使用如果有Warning通常不影响下载但建议检查一下如果有Error那就得看具体消息内容定位是XML导入时地址冲突还是缺少引用。我强烈建议你采取生成一个、编译一个、检查一个的节奏而不是全部生成完毕后统一编译。原因很简单如果30个块一起编译报错信息叠加在一起你根本分不清哪个错误对应哪个块。逐个编译时哪一块出问题立刻就能定位脚本还能针对性地跳过异常、继续执行后续块。虽然整体耗时会多几十秒但排查问题的时间能省下几个小时。最后不要忘记保存project.Save()。Openness的保存是整项目保存耗时较长如果块数量多可能要等一两分钟。这期间不要去手动操作博途界面否则容易造成项目文件锁定冲突。5. 回归工程落地速度、备份、和那些绕不开的坑5.1 自动化前的备份与一致性检查我前面提到过项目副本这里再把它放大一点说。Openness脚本在调试阶段你无法预见所有的边界情况最常见的就是地址重复或者引用了不存在的DB。一旦出现这种问题项目打开之后逻辑就可能报错此时如果没有副本靠手动回滚会非常痛苦。我现在团队里的标准做法是三层防护第一层运行脚本前用文件复制方式做整个项目目录的备份第二层在TIA Portal里设置项目自动保存时间间隔调整到15分钟第三层脚本本身写日志每一批生成的块名、块数量、编译状态都记录到文本文件里。这样做的好处是即使脚本运行到一半崩溃我也能根据日志知道它处理到哪个环节恢复起来效率高很多。5.2 模态窗口、UI线程与执行速度Openness处理过程中会弹出模态窗口这是所有自动化脚本都要面对的坎。最常见的场景是打开项目时弹出版本迁移确认窗口或者编译过程中弹出变量冲突提示窗口。如果你用的是后台任务方式运行脚本模态窗口一弹出来整个线程就卡住了脚本看起来像死了一样。我的解决方案在开头已经提过使用TiaPortalMode.WithUserInterface让博途主窗口正常显示。脚本的逻辑部分放到一个独立任务里执行但窗口消息循环保持正常这样弹出的任何确认框你都能看得见、点得掉。如果你完全不想看到博途窗口也尽量不要在自动化过程中去最小化它因为很多模态窗口是跟随主窗口的窗口状态异常也可能导致处理异常。执行速度方面建议合理控制循环次数。一次性处理几百个块时博途的界面更新和内部对象管理会消耗大量内存项目文件会越变越大。每处理完50个块左右调用一次project.Save()释放内存比全部处理完再统一保存要稳定得多。5.3 生成之后需要人工复核的检查清单即使脚本跑通了也不意味着可以当甩手掌柜。自动化生成出来的块我认为至少要人工复核以下几项检查项说明检查方式块命名规则生成的块名是否符合项目命名规范导出块列表批量比对IO地址冲突是否存在重复地址或重叠的地址区间在博途交叉引用里查重DB变量偏移全局DB中变量偏移是否合理编译警告里的offset冲突注释完整性注释是否跟着模板正确替换抽查几个块的注释信息编译状态全部块编译是否通过查看编译结果汇总最后再分享一个小技巧每生成一批块就随手在博途里做一次编译别等全部写完再统一编译。我就因为这个吃过亏几十个错误一起出现的时候你会觉得排查它们比当初手动建块还要痛苦。自动化不是让你完全放手而是把重复劳动压缩到可以接受的程度省下来的时间还是用来做真正需要脑子的逻辑设计比较划算。本文还有配套的精品资源点击获取