从我做自动化项目那年开始,TIA Portal 就成了每天都在用的工具。后来接触的项目越来越大,几十台变频器、上千个 IO 点、标准控制逻辑重复出现,每天花在“拖拽组态”上的时间越来越多,我终于开始注意到 TIA Portal Openness 这个接口。它可以让我用 C# 代码去操控博图工程,自动生成 PLC 变量、程序块、HMI 组态,甚至整套工程框架。
这篇内容我想把七天内从零打通 Openness 的完整过程拆开讲一遍。适合刚接触 PLC 编程、又有点编程基础的人,也适合在工厂自动化、非标设备行业里天天和博图打交道、想摆脱重复劳动的工程师。它不是什么高深理论,就是一套“每天练一块,七天能出活”的路线。核心是三个关键词:环境配置、连接博图、自动生成工程代码。
1. 七天路线:搞懂 Openness 到底在解决什么问题
1.1 一个痛点逼出来的接口
先说说 Openness 解决的是什么问题。用过博图的人都知道,一个项目从零开始做,大量时间都消耗在重复操作上:新建 PLC 变量表、逐个输入地址、复制同样结构的 FB、改几十份相似但参数不同的 DB。这些东西本身没有技术含量,但错一个地址就要返工,极其磨人。
Openness 是西门子官方提供的 .NET 开放接口,它把 TIA Portal 内部的对象模型暴露给外部程序。你可以用 C# 或 VB.NET 启动一个博图实例,打开工程,遍历设备树,创建、修改、删除 PLC 程序块,甚至导出和导入整个项目的 XML。这意味着那些重复动作可以写成脚本,一键执行。
一开始我以为是多么高深的东西,其实理解起来很简单。TIA Portal 打开工程时,左边那个树形目录里所有对象——PLC、变量表、FB、FC、DB、HMI 画面——在 Openness 里都有对应的类。你用代码访问这些类,就等于在操作界面上点鼠标。
1.2 七天怎么安排
七天学习不能贪多。环境装好、能跑通、能生成一个块,就算过关。我的建议路线是:
- 第 1 天:安装配置 TIA Portal 与 Openness 组件,写一个“启动博图、打开项目”的最小程序。
- 第 2 天:熟悉 Openness 对象树结构,学会遍历 PLC、变量表、程序块。
- 第 3 天:练习通过 API 创建 PLC 变量和简单 DB 块。
- 第 4 天:吃透 XML 导入导出机制,这是自动生成工程代码的根基。
- 第 5 天:做一个数据驱动的批量生成实验,比如从 CSV 读取参数、生成多个背景 DB。
- 第 6 天:综合练习,把 Excel 表里的 IO 清单自动生成变量表和符号表。
- 第 7 天:做一个完整的“从参数表到 PLC 工程代码”的小工具,七天闭环。
重点不在于把所有 API 背熟,而在于掌握“用代码操作博图”的思维方式。一旦理解了 Openness 的本质是“把项目当成一棵对象树,把块当作可导入导出的 XML 文件”,后面所有功能都是顺水推舟。
2. 环境配置:TIA Portal、Openness DLL 与第一次握手
2.1 版本选择:别用太老也别盲目追新
Openness 从 TIA Portal V13 SP1 开始提供,但实践中真正稳定好用是从 V15.1 开始的。版本选择有三个原则:第一,工控现场用的版本优先,因为你要处理的实际工程是什么版本,Openness 就必须匹配哪个版本,不能跨大版本操作;第二,电脑系统要满足要求,V15 到 V17 基本需要 Windows 10 专业版或企业版,V18、V19、V20 对系统版本要求更高;第三,建议使用 Professional 版而不是 Basic 版,因为有些 Openness 对象访问能力依赖授权等级。
我自己的主力组合是 Windows 10 + TIA Portal V16 + Visual Studio 2019。这个组合稳定性很好,社区里资料也最多,网上搜“博图 v16 安装教程”“博图 v17 软件安装教程”能搜到大量经验,踩坑也好找答案。如果你已经装了博图但没选 Openness 组件,可以在控制面板里右键 TIA Portal 选择“修改”,勾选 Openness 相关组件补装,不用完全卸载重装。
2.2 找到并引用 Siemens.Engineering.dll
安装完成后,Openness 的程序集会放在博图安装目录的 PublicAPI 文件夹下。以 V16 为例,默认路径是:
C:\Program Files\Siemens\Automation\Portal V16\PublicAPI\V16\Siemens.Engineering.dll在 Visual Studio 中新建一个控制台应用(.NET Framework,不是 .NET Core,这一点非常重要,因为 Openness 官方只支持 .NET Framework),然后在“添加引用”里浏览到上述路径,找到Siemens.Engineering.dll和Siemens.Engineering.HW.dll、Siemens.Engineering.SW.dll这些扩展程序集,全部添加进去。引用成功后,代码里就能using Siemens.Engineering;了。
注意:Openness 调用要求进程以 64 位运行。在 VS 里右键项目属性,把“平台目标”设置为 x64,否则运行时大概率会报 BadImageFormatException。
2.3 第一个程序:启动博图、打开项目
连接博图的开胃菜,是让代码以无界面模式启动一个 TIA Portal 实例。所谓无界面模式,就是后台跑一个博图进程,不做任何显示,专门用来被外部程序调用。示例代码:
using System; using Siemens.Engineering; using Siemens.Engineering.HW; class Program { static void Main(string[] args) { TiaPortal tiaPortal = null; try { // 无界面模式启动博图 tiaPortal = new TiaPortal(TiaPortalMode.WithoutUserInterface); Console.WriteLine("TIA Portal 已启动"); // 打开已有工程 string projectPath = @"D:\WorkDemo\MyPlcProject.ap16"; Project project = tiaPortal.Projects.Open(projectPath); Console.WriteLine("工程已打开:" + project.Name); // 遍历设备 foreach (Device device in project.Devices) { Console.WriteLine("设备:" + device.Name); } project.Save(); project.Close(); } catch (Exception ex) { Console.WriteLine("错误:" + ex.Message); } finally { tiaPortal?.Dispose(); } } }这个程序跑通,意味着你的环境没问题,代码也有权限访问博图了。第一次运行时 Windows 会弹 UAC 授权,必须允许;如果程序是在服务或非交互会话里运行的,还会遇到权限边界问题,所以前期一定要以本机管理员身份在桌面上运行。
还有一个隐藏限制需要注意:Openness 和博图必须在同一个 Windows 用户账户下运行。跨用户启动会报“无法连接 TIA Portal 实例”之类的错误。另外杀毒软件和防火墙也可能拦截博图进程间通信,特别是 V19 安装时提示的端口 5111,其实就和 Openness 的实例通信有关,我在后面专门讲排查。
3. 核心原理:对象树、XML 导入导出与自动生成工程代码的实现机制
3.1 博图项目就是一棵对象树
要在 Openness 里游刃有余,必须理解它背后那棵对象树。博图界面左侧的项目树,和 Openness 的对象模型是一一对应的关系:
- Project:整个工程
- Project.Devices:设备列表,下面挂着 PLC、HMI、驱动器等
- Device.DeviceItems:设备下的具体项,比如 CPU、信号板
- DeviceItem 下可以拿到 Software 对象,比如 PlcSoftware、HmiSoftware
- PlcSoftware 下面有 BlockGroup、TagTable、PlcType 等
- BlockGroup 下挂着 PlcBlock(FB、FC、OB、DB 的统称)
理解了这棵树,你就能用代码从任意节点出发,找到你想要操作的对象。比如要遍历所有 PLC 程序块,基本套路是:
foreach (Device device in project.Devices) { DeviceItem cpuItem = device.DeviceItems[0]; Software software = cpuItem.GetService<Software>(); if (software is PlcSoftware plcSw) { foreach (PlcBlock block in plcSw.BlockGroup.Blocks) { Console.WriteLine(block.Name); } } }这个“先找到 PlcSoftware,再往下找块”的模式,是后面所有自动化的基础。遇到找不到对象的报错,八成是树路径不对,比如设备树下有多层 DeviceItem,需要用名称或类型进一步索引。