openness访问不到TIA已打开的项目工程
**问题概述**
- 目标:在 TIA Portal V18 中,通过 `openness/TiaBridge.exe` 实现“识别并附着到任意已打开项目”的能力(`attachAnyOpen`),以及对后台/前台实例进行可靠枚举与项目状态检测。
- 当前症状:
- UI模式下枚举到的实例为 0 或 `hasProject=false`,无法识别 UI 中已打开的项目。
- 后台模式成功打开 `.ap18` 项目后,随后枚举后台实例仍为 0,无法确认会话持久存在。
**环境信息**
- 操作系统与终端:Windows,PowerShell5。
- 工程与工作目录:`f:\AI项目开发\yuanxing\modaoyuanxing\modaoyuanxing`。
- 公共 API 路径:`C:\Program Files\Siemens\Automation\Portal V18\PublicAPI\V18\Siemens.Engineering.dll`。
- TIA 版本:`engineeringVersion=18.0.0.0`。
- 测试项目样本:`F:\BaiduNetdiskDownload\西门子课程录制\1200tcp客户端\1200tcp客户端.ap18`(此前未被打开)。
**已进行的操作与命令**
- 实例枚举(限定 V18):
- `TiaBridge.exe --preferMode Background --preferVersion 18 --listInstances` → 输出到 `bridge_list_instances_bg_v18.json`。
- `TiaBridge.exe --preferVersion 18 --withUI --listInstances` → 输出到 `bridge_list_instances_ui_v18.json`。
- 进程与附着:
- 历史 UI 进程 PID=22696:`TiaBridge.exe --pid 22696` → `bridge_attach_22696.json` 显示“no open project”;再次尝试 → `bridge_attach_22696_try.json` 显示“Failed to resolve TIA process object”。
- 枚举系统中“Portal/Broker”相关进程,实际仅发现 Windows 系统 `RuntimeBroker`/`SgrmBroker`,未发现 `Siemens.Automation.Portal` 或 `Siemens.Automation.Portal.Broker.exe`。
- 管理员权限实验:
- 以管理员权限重复枚举/后台打开,结果一致,即枚举返回 `count=0`。
- 后台模式打开新样本:
- `TiaBridge.exe --preferVersion 18 --open --path "...ap18"` → 成功(`success=true`),但随后的后台枚举仍为 `count=0`。
- 新增联动命令(保持会话):
- 更新 `Tools/TiaBridge` 增加 `--holdSeconds`(保持会话稳定)与优化释放策略,重新编译。
- UI模式打开并保持5秒:`& Tools\TiaBridge\bin\Release\net472\TiaBridge.exe --preferVersion 18 --withUI --open --path "...ap18" --holdSeconds 5 | Tee-Object -FilePath bridge_open_ui_hold.json` → 输出“Project opened”。
**实验现象(关键输出文件)**
- `openness\bridge_open_all.json`:`{"success":true,"message":"No open projects detected","count":1,"instances":[{"mode":"WithUserInterface","hasProject":false}]}`。
- `openness\bridge_attach_22696.json`:`{"success":true,"message":"Attached to 22696 (no open project)",...}`。
- `openness\bridge_attach_22696_try.json`:`{"success":false,"message":"Failed to resolve TIA process object for PID 22696",...}`。
- `openness\bridge_list_instances_ui_v18.json`:`{"success":true,"count":0,"instances":[]}`。
- `openness\bridge_open_bg_admin.json` / `openness\bridge_open_bg_new.json`:均为 `{"count":0,"instances":[]}`。
- `bridge_open_ui_hold.json`:`{"success":true,"message":"Project opened","projectName":"1200tcp客户端","projectPath":"...ap18"}`。
**原因分析(初步)**
- 会话隔离与代理(V17/V18):
- TIA Portal V17/V18 在 UI 模式下引入 Sandbox/Broker IPC 机制,UI 进程不直接暴露 COM/IPC 通道;第三方(我们的 `TiaBridge.exe`)无法像旧版本那样通过 PublicAPI 直接枚举 `Projects` 或解析 UI 进程对象。
- 现象对应:UI模式枚举返回 `hasProject=false` 或 `count=0`,附着到历史 PID 也无法解析为有效 TIA 进程。
- 枚举与附着入口失效:
- 通过反射 `Siemens.Engineering.TiaPortal.GetProcesses()` 的枚举在 V18 UI 模式下可能返回空集合或不可附着对象,导致项目检测失败。
- 会话保持与后台行为:
- 后台打开项目虽返回成功,但后台实例可能非持久(被立即释放或由代理进程接管);因此立即枚举依旧为空。
- 权限影响较小:
- 管理员与普通权限实验结果无差异,表明问题核心在会话隔离与代理机制,而非权限不足。
**我们已实施的代码调整**
- `Tools/TiaBridge/Program.cs`:
- 新增 `--holdSeconds`:在 `--open` 流程后保持会话 N 秒,帮助 UI 稳定与人工观察,可配置。
- 优化释放策略:
- 若附着到现有 UI,仅释放当前桥接的引用(不影响 UI)。
- 若新建无界面实例,主动释放以避免后台常驻。
- 若新建带界面实例,默认不释放,保持 UI 打开,便于后续枚举/附着测试。
- 保留并强化诊断命令:`--listInstances`、`--countOpenProjects`、`--attachAnyOpen`。
- 构建:`dotnet build Tools\TiaBridge\TiaBridge.csproj -c Release` 成功,`TiaBridge.exe` 产物路径:`Tools\TiaBridge\bin\Release\net472\TiaBridge.exe`。
**复现步骤(供官方验证)**
- 安装并启用 TIA Portal V18 PublicAPI,确保 `Siemens.Engineering.dll` 与 `Siemens.Engineering.Hmi.dll` 可加载。
- 在 UI 中手动打开一个 `.ap18` 项目。
- 执行:`openness\TiaBridge.exe --preferVersion 18 --withUI --countOpenProjects` 或 `--listInstances` → 通常返回 `count=0` 或 `hasProject=false`。
- 执行:`Tools\TiaBridge\bin\Release\net472\TiaBridge.exe --preferVersion 18 --withUI --open --path <ap18> --holdSeconds 5` → 输出 `"Project opened"`;随后再执行枚举命令,仍无法识别为“已打开项目”。
**请求西门子官方支持的具体问题**
- UI模式的正确枚举/附着方法:
- 在 V17/V18 的 UI 会话隔离与 Broker 代理下,第三方进程应如何发现并附着到当前 UI 中的项目?是否存在替代 `TiaPortal.GetProcesses()` 的官方接口或推荐流程?
- 是否需要通过 `Siemens.Automation.Portal.Broker.exe` 提供的令牌/会话句柄来访问 `Projects`?请提供示例或文档指引。
- 后台模式的持久枚举:
- 使用 `Projects.Open` 打开项目后,后台实例是否应当出现在可枚举集合中?若不会被枚举,官方建议的会话保持与状态检测方法是什么?
- 进程定位与安全策略:
- 在 UI 模式下,如何稳定识别 `Siemens.Automation.Portal` 或 `Siemens.Automation.Portal.Broker.exe` 的 PID,并通过官方途径映射到 `TiaPortal` 对象?
- V17/V18 的安全策略是否默认禁止跨进程读取 UI 会话的 `Projects` 状态?是否需要额外授权、白名单或配置项启用观察能力?
**建议的后续方向**
- 若 UI模式不提供直接枚举能力:
- 将关键操作迁移到后台模式,并通过“桥接的持久会话”完成工程加载与操作;
- 或在 UI 内通过官方支持的插件/脚本向外上报已打开项目状态,第三方仅消费该状态。
- 与官方联调:
- 明确 V17/V18 与旧版本在会话可见性上的差异,获得推荐的可兼容调用路径与示例代码。
**附件与日志(可供支持人员参考)**
- `openness\bridge_open_all.json`
- `openness\bridge_attach_22696.json`
- `openness\bridge_attach_22696_try.json`
- `openness\bridge_list_instances_ui_v18.json`
- `openness\bridge_open_bg_admin.json`
- `openness\bridge_open_bg_new.json`
- `bridge_open_ui_hold.json`
openness问题支持.zip