TIA Portal Openness导出导入FC

对于100+ FC的批量导出/导入,Scripter(选项2)是最低摩擦的路径,因为它不需要Visual Studio项目或签名。

TIA Portal Openness导出导入FC
AI模型价格对比 | AI工具导航 | ONNX模型库 | Vibe Coding教程 | PLC在线仿真器 | Tripo 3D | Meshy AI | ElevenLabs | KlingAI | ArtSpace | Phot.AI | InVideo

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 - 工程对象模型:TiaPortalProjectPlcSoftwarePlcBlockCompositionPlcBlockPlcBlockGroup
  • Siemens.Engineering.Hmi.dll - HMI特定扩展点(FC导出/导入不需要)。

所有Openness调用必须在拥有TIA Portal进程的同一工作站上执行;不支持跨机器自动化。主机进程可以是:

  1. 链接到V18 Siemens.Engineering.dll的编译C#/VB .NET应用程序。
  2. TIA Portal Scripter工具 - 嵌入TIA中的轻量级IDE,直接对实时项目树运行VBScript风格代码。
  3. 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 = trueExportOptions.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项目内部:

  1. 在TIA Portal V18中打开项目。
  2. 启动Scripter(附加菜单 → TIA Portal Openness Scripter)。
  3. 编写引用Openness对象的脚本(Scripter自动导入Siemens.Engineering)。
  4. 在当前活动项目的上下文中运行脚本 - 不需要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中没有等效项。

已解决的缓解程序

  1. V17项目和V18项目导出相同的FC。
  2. 在差异工具中打开两个XML,识别每个V18独有构造(命名空间版本、多实例引用部分、DocumentInfo版本戳)。
  3. 剥离V18独有元素,降级Namespace属性,并将V17导出的<DocumentInfo>块复制到V18派生的XML。
  4. 如果存在,删除独立的<Namespace />自关闭标签。在许多V18 XML中,此标签在文件顶部附近重复,这就是触发line-34/position-4错误消息的原因。
  5. 重新尝试对V17项目进行导入。

此过程仅限降级。没有支持的方式将V17块XML升级到V18 - 必须从V18重新导出。支持的迁移路径是TIA Portal项目菜单中的IDE内"升级项目"工作流。

7、批量编辑模式:从一个FC生成100个变体

激励场景 - 复制一个FC,修改它,重新导入100个变体 - 通过将Scripter与模板传递相结合来解决。管道是:

  1. 导出模板FC_Template.Export(xml, ExportOptions.WithDefaults)
  2. 修改XML:任何XML工具(LINQ-to-XML、XmlDocument或Python脚本)迭代参数列表并替换每个实例的值。
  3. 导入变体:对每个生成的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、诊断和验证

批量导入后,运行以下检查以确认往返完整性:

  1. 编译:在TIA Portal UI中,右键单击PLC → "编译 → 全部"。成功编译证明XML已解析且生成的SCL/ST语法有效。
  2. 交叉引用:打开"交叉引用"视图(项目树 → PLC → 右键单击 → 交叉引用)。每个导入的FC应显示来自原始项目的调用者,除非有意断开连接。
  3. 块一致性:从Scripter遍历每个导入的块并调用GetAttributes - 与源XML的非零CRC表示静默重新序列化(罕见,但当块使用导入器被迫标准化的构造时会发生)。
  4. 下载测试:在非生产S7-1500中,执行完整下载。成功编译后的下载失败表示导入引入的问题(通常是多实例DB的初始值被剥离)。

原文链接: TIA Portal Openness V18 Exporting and Importing FCs

汇智网翻译整理,转载请标明出处。