dsh-tia-mcp-plugin:把西门子 TIA Portal 接进 DeepSeek Harness

前言

想用模型改动 PLC 工程,常规做法是在宿主进程里手动起 Openness 引擎、再自行拼 MCP 工具层。问题在于博途 V16 与 V20/V21 的 Openness 程序集并不兼容,一个 exe 无法跨版本,手动方案往往要为每个版本各维护一套进程和命名。下面介绍的插件 leiyiqi070630-arch/dsh-tia-mcp-plugin 把这件事收敛成一个 bundle:一个插件同时挂 V21 与 V16 两台 Openness MCP 引擎,模型侧直接得到 mcp__tia-portal__* / mcp__tia-portal-v16__* 工具,可以建工程、加硬件、生成 PLC/HMI、编译诊断、回读校验、保存。

先说清楚定位:这是非官方项目,与 Siemens AG 无关,Siemens / TIA Portal / SIMATIC / STEP 7 / WinCC 均为其商标。

这个插件解决什么问题

一句话:把 Siemens TIA Portal(博途) 接进 DeepSeek Harness(dsh),让模型侧拿到博途 Openness 能力。维护者 leiyiqi070630-arch,分类属于工作流,仓库代码为 MIT。它是 dsh「一切皆插件」生态里的社区插件,配套目录页是独立站点,与 DeepSeek / 幻方没有官方从属关系。

为什么是两台引擎

V16 与 V20/V21 的 Openness 程序集不兼容:V16 是单体 Siemens.Engineering.dll,V20+ 拆成 Siemens.Engineering.Base/Step7/...,IL 层绑定不同,一个 exe 不可能跨版本。所以插件是两台独立进程、两个 serverName,工具名天然不冲突。

V21 引擎 V16 引擎
来源 TIA Portal Openness MCP(MIT,交付 zip) 2phenix/tia-mcp-v16 + 本地补丁
工具数 240(默认列 67,其余走 FindTools/CallTool) 24
工具名 mcp__tia-portal__* mcp__tia-portal-v16__*
连接方式 ConnectIsolated(独立无头实例)/ Connect(受 dsh 守卫拦截) connect_isolated(本地补丁新增)/ 或 attach 已运行的 V16
HMI Unified + Classic 仅 Classic(Basic/Comfort/Advanced)
上下文成本 约 61 KB schema 约 9.5 KB schema

安装

前提:Windows、DeepSeek Harness(带 plugin_manager)、要驱动的博途版本已安装且 Openness 用户组已授权。

# 1) V21 引擎:从你自己的交付 zip 提取(校验 MANIFEST 里的 sha256)
pwsh -File .\scripts\bootstrap-v21.ps1 -ZipPath 'C:\path\to\TIA_MCP_..._v2.7.8.1_20261102.zip'

# 2) V16 引擎:克隆上游 → 打补丁 → 本地编译(需要 .NET SDK 8+ 与 TIA V16)
pwsh -File .\scripts\build-v16.ps1

# 3) 展开配置(把 __PLUGIN_DIR__ 换成本机绝对路径)
pwsh -File .\scripts\install.ps1

然后在 dsh 会话里执行 bundle 安装:

plugin_manager action=install_bundle target=<本仓库的绝对路径>

替换已安装版本:先 remove_bundle,再 install_bundle(新模块要重启 dsh 才加载)。只想要其中一台引擎:把 cordis.patch.yml 里对应的 insert 行删掉即可。

在中国大陆安装(GitHub 镜像)

直连 github.com 常年超时,README 给出的公开镜像是 2026-11-05 实测可通 的(git ls-remote 往返):

镜像 用法前缀 实测耗时
gh-proxy.com https://gh-proxy.com/ + 原始 GitHub URL 0.9 s
ghfast.top https://ghfast.top/ + 原始 GitHub URL 1.5 s
gitclone.com https://gitclone.com/github.com/<owner>/<repo>.git 2.5 s
ghproxy.net https://ghproxy.net/ + 原始 GitHub URL 7.9 s

README 注明 kkgithub.com 实测不通。不想手动挑镜像,可以用仓库自带的自动安装脚本,它会依次探测官方与上面四个镜像,用第一个能通的克隆,然后自动跑 install.ps1:

pwsh -File .\scripts\quick-install.ps1 -V21Zip 'D:\downloads\TIA_MCP_..._v2.7.8.1_20261102.zip'

也可以让所有 GitHub 地址自动走镜像,配一次之后 git clone https://github.com/... 都会自动改写:

git config --global url."https://ghfast.top/https://github.com/".insteadOf "https://github.com/"

下载 Release 附件同样可以套镜像前缀:

curl.exe -L -o dsh-tia-mcp-plugin.zip https://ghfast.top/https://github.com/leiyiqi070630-arch/dsh-tia-mcp-plugin/releases/download/v2.7.8-5/dsh-tia-mcp-plugin-2.7.8-5.zip

镜像是第三方服务,只负责搬运代码。不放心就核对 commit:git -C "$env:USERPROFILE\dsh-tia-mcp-plugin" log -1 --format=%H 与仓库页面显示的 commit 比对。更多排查(SSL 握手失败、吊销检查、代理)见仓库的 docs/CN-MIRRORS.md。

配置要点

cordis.patch.yml(由 install.ps1 从模板生成)里需要按机器改的只有三处:

command: '__PLUGIN_DIR__\runtime\v21\TiaMcpServer.exe'   # 引擎位置
args: [--tia-major-version, '21']                        # 装多版本时必填
env:  { TiaPortalLocation: 'C:\Program Files\Siemens\Automation\Portal V21' }
env:  { TIA_OPENNESS_DIR:  'C:\Program Files\Siemens\Automation\Portal V16\PublicAPI\V16' }

V16 写保护(插件自带,宿主侧)

V16 那台引擎默认 attach 你在界面里开着的工程,而且工具名里没有 Connect,dsh 的 tia-collision-guard 管不到它。插件因此注册了自己的守卫,只拦 10 个写入类工具(set_attribute、import_*、compile、compile_hmi、save_project)。

放行需要四道全过:

  1. 引擎状态文件 %LOCALAPPDATA%\tia-mcp-v16\state.json 里 mode=isolated
  2. 里面的 pid 进程还活着
  3. 状态未过期(maxStateAgeMinutes,默认 480)
  4. 状态里的 exe 等于本插件这台引擎(防止别的宿主写的 isolated 被误信)

任一条不满足就拒绝,并给出两条路径:先 connect_isolated(带工程副本),或显式设 TIA_V16_ALLOW_WRITE=1。只读工具永远放行。守卫自己的状态写在 %LOCALAPPDATA%\tia-mcp-v16\guard-status.json,不用触发拒绝也能确认它加载了。

典型用法:推荐使用顺序

mcp__tia-portal__Bootstrap / mcp__tia-portal-v16__tia_status     # 先看环境与实例归属
.connect_isolated(工程副本路径)                                    # 起独立无头实例,不碰已开窗口
只读核对 → 写入 → compile → save_project → disconnect              # 一次连接做完一批事

隔离不是免费的:起一个无头 V16 实例实测约 50 秒,README 提醒不要在一个块里连一次做一件事。

大对象怎么过手(V16)

V16 引擎原版把所有 export_* 结果截断在 60,000 字符,HMI 屏幕动辄 190 KB,导出即废。补丁加了两件事:export_* 可选 outPath,写文件并返回 {file, bytes, preview},不再截断;import_* 可选 file,直接读磁盘 XML,xml 与 file 二选一。于是 200 KB 的屏幕 XML 不需要走一遍对话上下文。

验证状态

细节见仓库 docs/VERIFICATION.md。摘要如下:

  • 已验证(本机实测,全部在隔离实例 + 工程副本上):V21 全链路(建工程 → 加 CPU → 变量表 → S7DCL 梯形图 → 编译 0 错 0 警 → XML 回读);V16 全链路(隔离打开副本 → import_scl → compile → export_block_xml → save_project → 重开确认落盘);V16 HMI 往返(屏幕 193 KB 导出写盘 → 回灌 → compile_hmi 0 错 → 落盘确认);写保护守卫 13 条单测路径。
  • 未验证:真实工程上的 HMI 编译前置(运行系统密码 / 起始画面)、下载到实体 PLC 或 PLCSIM、在线写值、V16 的 set_attribute 正常路径、符号链接型 HMI 导入的崩溃预检。README 明确:编译通过 ≠ 运行验证,空白工程通过 ≠ 现场验证。

训练资料与仓库自检

vendor/tia-openness-mcp/ 是 V21 引擎交付包里的中文训练营(00–13 课 + 练习与参考答案 + 16 份离线校验证据),另有 docs/、手册/、templates/、manifest/tools-list.json(全量工具签名)与自检脚本(Check-S7DCL.ps1、Check-LadReadback.ps1、audit/*.ps1)。引擎自带的 GetTrainingLesson(path=...) 读的是同一套内容,这里是离线副本,没装引擎的机器也能翻语法、模板和禁忌表。

仓库结构要点:

cordis.patch.yml.template   bundle patch 模板(三条行:V21 / V16 / 写保护守卫)
index.js                    宿主侧 V16 写保护守卫
patches/v16-local.patch     给上游 2phenix/tia-mcp-v16 的补丁(不重分发其源码)
scripts/                    bootstrap-v21 / build-v16 / install / validate.mjs(仓库自检)
MANIFEST.json               期望的引擎 SHA256 与文件版本

本地自检用下面的命令(CI 也跑同一个脚本,零依赖):

node scripts/validate.mjs

适用场景与注意

适合已经在 Windows 上使用 dsh、需要让模型参与博途工程搭建或批量改动,并且愿意在隔离实例与工程副本上操作的开发者。

需要注意几点:插件以当前 dsh 进程权限运行,安装前应检查源码与许可证;本仓库代码为 MIT,第三方引擎见 THIRD_PARTY_NOTICES.md(V21 引擎 MIT;V16 上游无 LICENSE,故只发布补丁、不重分发);仓库不包含引擎二进制,需要自行按上面三步准备。

结尾

这个插件的价值在于把「博途版本不兼容」这一长期痛点封装成一台插件 + 两台引擎的固定结构,并针对 V16 的 attach 风险补了一层宿主侧写保护。目录页:https://www.skillhub.cn/plugins/leiyiqi070630-arch/dsh-tia-mcp-plugin;仓库:https://github.com/leiyiqi070630-arch/dsh-tia-mcp-plugin。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜