TIA Portal Openness导出导入FC
TIA Portal Openness是西门子官方的.NET API,将TIA Portal(V15及更高版本)的工程数据暴露给外部自动化脚本。使用Openness V18,你可以从C#或Visual Basic项目驱动无头TIA Portal实例,将块(FC、FB、OB、DB)、监控表、PLC标签表和UDT作为SIMATIC ML XML文件导出和导入。典型用例包括:
- 将一个FC批量编辑为100多个变体(原始工程问题中的典型场景)。
- 从模板系统或外部CAD/ECU数据生成PLC代码。
- 跨项目分支执行与供应商无关的块代码差异/合并。
- 大型机器构建器工作流中PLC代码的持续集成式回归。
Openness是一个编程接口。它与TIA Portal项目树中的"生成源"(XML导出)功能不同;后者是一次性的、GUI驱动的XML导出。相比之下,Openness Scripter是一个捆绑的脚本主机,可以在没有Visual Studio许可证的情况下运行VBScript风格的代码。
1、前提条件
| 组件 | 所需版本 | 备注 |
|---|---|---|
| TIA Portal | V18.0或V18.5 | Step 7 Basic / Professional,或TIA Portal Multiuser |
| TIA Portal Openness | V18(与TIA版本匹配) | TIA安装程序中的可选附加组件;包含Siemens.Engineering.dll |
| .NET Framework | 4.8 | Openness V18仍面向.NET Framework,而非.NET 6/7 |
| Visual Studio | 2019/2022 Community或更高版本 | 编译自定义C# Openness工具所需;Scripter不需要VS |
| Openness Scripter | V18(从西门子支持下载) | 针对打开的TIA项目运行.sct脚本的独立工具 |
| Windows | 10 64位/Server 2019/2022 | Openness仅限Windows |
安装后,验证Openness程序集是否在全局程序集缓存中注册:
C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Siemens.Engineering\
并且注册表分支HKLM\SOFTWARE\Siemens\Automation\Openness\[VERSION]包含PublicKey条目。如果缺少V18注册表项,说明在TIA安装程序中未选择Openness V18 - 重新运行安装程序并修改安装。
2、TIA Portal Openness API架构
API存在于两个主要程序集中:
Siemens.Engineering.dll- 工程对象模型:TiaPortal、Project、PlcSoftware、PlcBlockComposition、PlcBlock、PlcBlockGroup。Siemens.Engineering.Hmi.dll- HMI特定扩展点(FC导出/导入不需要)。
所有Openness调用必须在拥有TIA Portal进程的同一工作站上执行;不支持跨机器自动化。主机进程可以是:
- 链接到V18
Siemens.Engineering.dll的编译C#/VB .NET应用程序。 - TIA Portal Scripter工具 - 嵌入TIA中的轻量级IDE,直接对实时项目树运行VBScript风格代码。
- UI驱动的Openness会话(由用户点击附加功能区选项卡启动)。此模式较慢,是驱动具有单独许可用户的TIA Portal实例的唯一合法方式。
对于100+ FC的批量导出/导入,Scripter(选项2)是最低摩擦的路径,因为它不需要Visual Studio项目或签名。
4、将FC导出为XML(SIMATIC ML)
官方文档入口点是"导出块"章节。相关的C#序列是:
using Siemens.Engineering;
using Siemens.Engineering.SW;
using Siemens.Engineering.SW.Blocks;
TiaPortal tia = new TiaPortal(TiaPortalMode.WithUserInterface);
Project project = tia.Projects.Open(new FileInfo(@"C:\Projects\Plant\Plant.ap18"));
PlcSoftware plc = project.Devices[0].GetService<PlcSoftware>();
PlcBlock fc = plc.BlockGroup.Blocks.Find("FC1");
FileInfo targetXml = new FileInfo(@"C:\Export\FC1.xml");
fc.Export(targetXml, ExportOptions.WithDefaults);
tia.Dispose();
ExportOptions接受标志WithDefaults(只读、已签名)或自定义ExportOptions实例,该实例配置为ExportOptions.IncludeReadOnly = true和ExportOptions.ExportPassword = "..."用于知识保护块。对于100+ FC的批量操作,迭代PlcBlockComposition并对块列表调度Parallel.ForEach - 但将并行度限制为Environment.ProcessorCount / 2;Openness会序列化大多数内部锁。
导出的XML使用SIMATIC ML(西门子标记语言)模式。根元素携带一个Namespace属性,标识生成文件的TIA Portal版本(例如V18的http://www.siemens.com/automation/Openness/SW/Interface/v4)。此命名空间用于阻止跨版本导入。
4、从XML导入FC
导入是镜像操作。参考:TIA Portal Openness v21文档。最小导入调用是:
PlcBlockGroup group = plc.BlockGroup;
foreach (FileInfo xml in Directory.EnumerateFiles(@"C:\Import", "*.xml"))
{
group.Blocks.Import(xml, ImportOptions.Override);
}
ImportOptions中的标志:
| 标志 | 行为 |
|---|---|
| Override | 覆盖同名块;保留调用层次结构和实例DB引用 |
| None | 冲突时出错;块未导入 |
| PreserveKnowHowProtection | 如果XML中存在,保留KHP信封 |
对于约100个文件的批量导入,在单个TiaPortal进程中运行,并将每个导入包装在try/catch (EngineeringException)中 - 部分失败容忍度至关重要,因为单个格式错误的XML在某些TIA版本中会中止循环。
5、使用TIA Portal Openness Scripter
Scripter是在没有Visual Studio项目的情况下运行导出/导入代码的最有效方式。它作为可选附加组件提供,可从西门子支持下载。从TIA Portal项目内部:
- 在TIA Portal V18中打开项目。
- 启动Scripter(附加菜单 → TIA Portal Openness Scripter)。
- 编写引用Openness对象的脚本(Scripter自动导入
Siemens.Engineering)。 - 在当前活动项目的上下文中运行脚本 - 不需要
Projects.Open调用。
示例Scripter脚本(VBScript风格语法),导出第一个PLC中的所有FC并重新导入已编辑XML的目录:
'--- Scripter:从第一个PLC导出所有FC ---
Dim plc As PlcSoftware = Project.Devices(0).GetService(Of PlcSoftware)()
Dim group As PlcBlockGroup = plc.BlockGroup
For Each b As PlcBlock In group.Blocks
If TypeOf b Is PlcFC Then
Dim xml As IO.FileInfo = New IO.FileInfo("C:\Export\" & b.Name & ".xml")
b.Export(xml, ExportOptions.WithDefaults)
End If
Next
'--- Scripter:将编辑后的XML重新导入 ---
For Each f As IO.FileInfo In New IO.DirectoryInfo("C:\Import").GetFiles("*.xml")
group.Blocks.Import(f, ImportOptions.Override)
Next
Scripter将脚本保存在%USERPROFILE%\AppData\Roaming\Siemens\Automation\Openness\Scripter\中。脚本是纯文本,与项目其余工件一起进行版本控制。
6、跨版本兼容性和SIMATIC ML命名空间
SIMATIC ML是特定于版本的。从TIA V18导出块并将其导入到TIA V17(或更早)项目将失败。经典错误消息是:
Error when calling method 'Import' of type 'Siemens.Engineering.SW.Blocks.PlcBlockComposition'.
The 'Namespace' attribute at the 'SW.Blocks.FB' object at line number 34 at line position 4 with Simatic ML ID 0 is not supported.
根本原因:XML根携带命名空间URI,如http://www.siemens.com/automation/Openness/SW/Interface/v4(V18),而V17模式解析器无法识别。简单地将v4替换为v3是不够的 - V18块可能包含语言构造(特别是多实例UDT的REF_TO和某些AT覆盖),这些在V17中没有等效项。
已解决的缓解程序
- 从V17项目和V18项目导出相同的FC。
- 在差异工具中打开两个XML,识别每个V18独有构造(命名空间版本、多实例引用部分、
DocumentInfo版本戳)。 - 剥离V18独有元素,降级
Namespace属性,并将V17导出的<DocumentInfo>块复制到V18派生的XML。 - 如果存在,删除独立的
<Namespace />自关闭标签。在许多V18 XML中,此标签在文件顶部附近重复,这就是触发line-34/position-4错误消息的原因。 - 重新尝试对V17项目进行导入。
此过程仅限降级。没有支持的方式将V17块XML升级到V18 - 必须从V18重新导出。支持的迁移路径是TIA Portal项目菜单中的IDE内"升级项目"工作流。
7、批量编辑模式:从一个FC生成100个变体
激励场景 - 复制一个FC,修改它,重新导入100个变体 - 通过将Scripter与模板传递相结合来解决。管道是:
- 导出模板:
FC_Template.Export(xml, ExportOptions.WithDefaults)。 - 修改XML:任何XML工具(LINQ-to-XML、
XmlDocument或Python脚本)迭代参数列表并替换每个实例的值。 - 导入变体:对每个生成的XML循环
group.Blocks.Import(xml_i, ImportOptions.Override),为每个块分配唯一名称(例如FC_Pump_01...FC_Pump_100)。
一个在导入期间重命名块的C#助手(Openness导入使用XML中嵌入的块名,因此在导入前对XML中的<Name>元素进行sed式替换是规范方法):
string xml = File.ReadAllText("FC_Template.xml");
for (int i = 1; i <= 100; i++)
{
string variant = xml
.Replace("<Name>FC_Template</Name>", $"<Name>FC_Pump_{i:D2}</Name>")
.Replace("\"Pump01\"", $"\"Pump{i:D2}\"");
File.WriteAllText($"C:\\Import\\FC_Pump_{i:D2}.xml", variant);
}
在通过Openness运行批量导入之前,在TIA UI中导入第一个文件以验证重命名 - 这将模板端XML错误与Openness端管道隔离。
8、故障排除矩阵
| 症状 | 根本原因 | 修复 |
|---|---|---|
| The 'Namespace' attribute ... Simatic ML ID 0 is not supported | XML由较新TIA导出,导入目标是较旧TIA | 剥离V18独有XML,降级命名空间,复制V17 DocumentInfo(见第6节) |
| Could not load file or assembly 'Siemens.Engineering, Version=18.0.0.0' | 项目针对V18构建,但工作站上的TIA是V17 | 安装匹配的Openness附加组件或将编译重新定向到已安装的TIA版本 |
| 导出返回0字节文件 | 块受知识保护,未提供密码 | 提供ExportOptions.ExportPassword |
| 脚本在第一次调用时抛出EngineeringTargetInvocationException | 项目由另一个用户/进程在TIA UI中打开 | 关闭TIA UI,或使用TiaPortalMode.WithUserInterface并在同一会话中运行 |
| Scripter在启动时崩溃,出现COM异常0x80040154 | Scripter附加组件未安装 | 运行TIA安装程序 → 修改 → "Openness V18 Scripter" |
| GetService()返回null | 目标设备不是SIMATIC PLC(HMI、驱动器等) | 按DeviceType筛选设备或迭代SubDevice |
| XML文件包含自关闭标签 | V18导出冗余命名空间声明 | 在导入到V17/V16之前手动删除标签 |
9、诊断和验证
批量导入后,运行以下检查以确认往返完整性:
- 编译:在TIA Portal UI中,右键单击PLC → "编译 → 全部"。成功编译证明XML已解析且生成的SCL/ST语法有效。
- 交叉引用:打开"交叉引用"视图(项目树 → PLC → 右键单击 → 交叉引用)。每个导入的FC应显示来自原始项目的调用者,除非有意断开连接。
- 块一致性:从Scripter遍历每个导入的块并调用
GetAttributes- 与源XML的非零CRC表示静默重新序列化(罕见,但当块使用导入器被迫标准化的构造时会发生)。 - 下载测试:在非生产S7-1500中,执行完整下载。成功编译后的下载失败表示导入引入的问题(通常是多实例DB的初始值被剥离)。
原文链接: TIA Portal Openness V18 Exporting and Importing FCs
汇智网翻译整理,转载请标明出处。