前言¶
想用模型改動 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)。
放行需要四道全過:
- 引擎狀態文件
%LOCALAPPDATA%\tia-mcp-v16\state.json裏mode=isolated - 裏面的
pid進程還活着 - 狀態未過期(
maxStateAgeMinutes,默認 480) - 狀態裏的
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_hmi0 錯 → 落盤確認);寫保護守衛 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。