DSH plugin: bridge to a Siemens TIA Portal MCP server (TIA Portal Openness). Registers mcp__tia__* tools for reading and writing PLC/HMI content, compiling and diagnosing.
Overview
本插件只是"接线",它**——西门子**官方 MCP Server。从插件市场/命令安装后,你还需要自己准备一个 Openness MCP Server(见 后端怎么选)并填好路径,mcp__* 工具才会出现。 - :按下面的 安装后还需要三步 做。 - :把 这段提示词 原样发给你的 DSH 会话,剩下的交给它。 安装本身不会再让 DSH 崩溃(failOnStartupError 已默认 false);配置不对时的表现是"",而不是"起不来"。 dsh-mcp-tia 是一个 ,用来把一个本地运行的 接入 DSH,让你能在 DSH 会话里用自然语言读写博途工程(创建项目/设备、生成块与变量、编译诊断、保存)。 它只负责"接线":启动你指定的 Server 可执行文件,把它暴露的工具注册成 DSH 的 mcp__* 工具。真正驱动博途的是那个 Server,它通过西门子官方的 API 操作本地已安装的 TIA Portal。 底层使用 DSH 宿主自带的 @deepseek-ai/dsh-mcp-client,本插件只是提供一份配置(cordis.patch.yml)。 1. ——Openness 只有 Windows 实现,别的系统没有替代。 2. (V15–V21 均被社区项目覆盖)。注意版本差异: - 的 Openness 是**的:PublicAPI\V21\net48\Siemens.Engineering.Base.dll、…Step7.dll、…WinCCUnified.dll 等** DLL,**单一的 Siemens.Engineering.dll。 - **是单体 Siemens.Engineering.dll。 - 所以后端 exe 必须和你的博途主版本**(多数项目靠 --tia-major-version 选择)。 3. (Openness API 本身要求)。 4. ——组权限重登才生效。这是最常见的"一切看起来都对但没有工具/一调用就报权限错"的原因。管理员 PowerShell: 5. (V17 起有对应的安全设置项)。后端自带的 doctor 子命令会检查这一项,先跑它。 6. (见下)。本仓库**。
README
dsh-mcp-tia 插件说明
[!IMPORTANT] 装完不能直接用。 本插件只是"接线",它不含 TIA Portal,也不含任何 TIA Portal MCP Server 可执行文件——西门子没有官方 MCP Server。从插件市场/命令安装后,你还需要自己准备一个 Openness MCP Server(见 后端怎么选)并填好路径,
mcp__tia__*工具才会出现。安装本身不会再让 DSH 崩溃(
failOnStartupError已默认false);配置不对时的表现是"没有工具",而不是"起不来"。
这是什么
dsh-mcp-tia 是一个 DSH(DeepSeek Harness)桥接插件,用来把一个本地运行的 TIA Portal MCP Server 接入 DSH,让你能在 DSH 会话里用自然语言读写博途工程(创建项目/设备、生成块与变量、编译诊断、保存)。
它不是 MCP Server 本身,也不包含 TIA Portal、Openness DLL 或任何西门子软件。 它只负责"接线":启动你指定的 Server 可执行文件,把它暴露的工具注册成 DSH 的 mcp__tia__* 工具。真正驱动博途的是那个 Server,它通过西门子官方的 TIA Portal Openness API 操作本地已安装的 TIA Portal。
底层使用 DSH 宿主自带的 @deepseek-ai/dsh-mcp-client,本插件只是提供一份配置(cordis.patch.yml)。
前置条件(必须先准备好)
-
Windows——Openness 只有 Windows 实现,别的系统没有替代。
-
TIA Portal 已安装(V15–V21 均被社区项目覆盖)。注意版本差异:
- V21 的 Openness 是模块化的:
PublicAPI\V21\net48\Siemens.Engineering.Base.dll、…Step7.dll、…WinCCUnified.dll等一组 DLL,没有单一的Siemens.Engineering.dll。 - V20 及更早是单体
Siemens.Engineering.dll。 - 所以后端 exe 必须和你的博途主版本匹配(多数项目靠
--tia-major-version选择)。
- V21 的 Openness 是模块化的:
-
.NET Framework 4.8(Openness API 本身要求)。
-
当前 Windows 用户加入本地组
Siemens TIA Openness,然后注销/重登——组权限重登才生效。这是最常见的"一切看起来都对但没有工具/一调用就报权限错"的原因。管理员 PowerShell:net localgroup "Siemens TIA Openness" "%USERNAME%" /add -
博途侧允许 Openness 访问(V17 起有对应的安全设置项)。后端自带的
doctor子命令会检查这一项,先跑它。 -
一个 Openness MCP Server 可执行文件(见下)。本仓库不提供。
后端怎么选
三个维护中的开源后端,都能被这一个插件接进来(只换 command/args):
| 后端 | 支持版本 | 工具数 | command / args 要点 |
|---|---|---|---|
| heilingbrunner/tiaportal-mcp | V21 默认,旧版靠参数 | 65 只读 + 49 写(写工具要 --allow-write 才注册) |
command: …\TiaMcpServer.exe;args: --tia-major-version 21,可选 --project-path、--software-path、--export-path、--preserve-path、--with-dependencies、--allow-write。自检:TiaMcpServer.exe --doctor |
Czarnak/tia-portal-mcp(NuGet TiaMcpServer) |
仅 V21 | 7 只读 / 17 读写 | command: tia-mcp(dotnet tool install -g TiaMcpServer 装出来的全局工具);args: --access-mode read-write(默认只读)或 full。自检:tia-mcp doctor |
| bulaofen0036-coder/TIA_Portal_Openness_MCP | V20 + V21(两个独立 exe) | 224(默认只暴露 62,其余用 FindTools + CallTool 按需展开) |
command: V21 用 …\bin\Release\net48\TiaMcpServer.exe,V20 用 …\bin-v20\Release\net48\TiaMcpServer.exe;args: --tia-major-version 21,非默认安装加 --tia-portal-location ""。自检:tia.cmd doctor |
选择建议:
- 要写 SCL/LAD 代码(本插件的主要用途)→ heilingbrunner(能读写真·文本格式,见 能写梯形图吗)或 bulaofen(自带 SCL/LAD 指令库与模板,中文文档)。
- 只要小而安全的工具面 → Czarnak(工具最少、写操作有
dryRun与内容哈希守卫、带审计日志),但只支持 V21。 - 想少编译、拿现成 exe → bulaofen 的 Release 包里是预编译运行时;它的
配置MCP.bat只认 Claude/Cursor/VS Code,不认 DSH,所以在 DSH 里仍然要按本文手写这一行。
博途工程是二进制,Openness 的写入只在内存生效,必须再调保存类工具才落盘;下载到 PLC/在线模式不属于 Openness 的自动化范围,仍需人工。
安装
dsh plugin --profile desktop add github:yh01010/dsh-mcp-tia
(desktop 换成你的 profile 名。)安装后重启 DSH 生效——但注意:重启后不会自动出现工具,还要做完 安装后还需要三步。
也可以把 dsh-mcp-tia 加入 profile 的 package.json → dsh.profile.bundles 后 pnpm install,重启生效。
注意:本包不发布到 npm,只能从 GitHub 安装。
安装后还需要三步
- 拿到一个后端可执行文件(上表任选一个),放到固定目录,例如
%USERPROFILE%\.local\bin\。多数后端要求先编译一次,或用它的 Release 预编译包。 - 确认环境:用后端自带的
doctor自检 .NET Framework、Openness DLL、Siemens TIA Openness组成员身份与博途访问开关。先跑 doctor,再谈接线。 - 填真实路径并重启:按 配置 一节在
$DSH_HOME/cordis.patch.yml里覆盖command,重启 DSH,工具列表里应出现mcp__tia__*。
让 AI 帮你完成配置
不想手改配置,就把下面这段原样发给你的 DSH 会话:
请帮我把 DSH 的博途插件(dsh-mcp-tia)配置到可用状态,参考
https://github.com/yh01010/dsh-mcp-tia 的 README。
现状:插件包已装好,但 mcp__tia__* 工具没出现,因为
cordis.patch.yml 里还是占位路径。
请依次做:
1. 先确认本机 TIA Portal 的主版本和安装根目录(例如
C:\Program Files\Siemens\Automation\Portal V21)。V21 的 Openness
是模块化的 PublicAPI\V21\net48\Siemens.Engineering.Base.dll,
没有单体 Siemens.Engineering.dll,选后端时必须匹配。
2. 确认当前用户是否已在本地组 "Siemens TIA Openness" 里;不在就先
告诉我需要管理员执行 net localgroup 命令并注销重登。
3. 检查我选定的后端可执行文件是否存在;不存在就告诉我该从哪个
项目/Release 取、放到哪里,并先把它的 doctor 子命令跑通。
4. 编辑 $DSH_HOME/cordis.patch.yml,用「id 覆盖」写法(不要用 insert,
否则会出现两行同 id,serverName 冲突导致启动中止)填上真实路径:
command:
args:
5. 提醒我重启 DSH,重启后确认 mcp__tia__* 工具是否出现;先只跑只读
工具(列设备/导出块),确认无误后再决定是否打开写模式。
不要改动插件包内部的 cordis.patch.yml。
不要在没有备份的工程上执行任何写操作。
前提:会话要有该文件的写入权限。
$DSH_HOME通常在会话工作区之外,可能触发一次权限确认。
配置
本插件刻意不携带任何个人机器路径,cordis.patch.yml 里的 command/args 是占位符。你必须改成自己机器上的真实路径。
两种接法 二选一,不要同时用:
| 你的情况 | $DSH_HOME/cordis.patch.yml 里怎么写 |
|---|---|
已装了插件包(市场/dsh plugin add) |
只写 id 覆盖(下面那段 - id: mcp-tia,不要 insert)。包里的 bundle 行已经插入了这一行,覆盖它的 config 即可 |
| 没装插件包,手工接线 | 用 insert 把整行插进去(见下方折叠块) |
[!WARNING] 插件包已装、又在 home patch 里
insert同一 id 的行 → 会得到两行同 id → 两个 mcp-client 实例抢serverName: tia→ DSH 启动时报serverName "tia" is already in use by another mcp-client instance并中止。这是最容易踩的坑。
id 覆盖写法(装了插件包时用这个,不会改到仓库文件):
# $DSH_HOME/cordis.patch.yml
- id: mcp-tia
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: tia
transport: stdio
command: 'C:\Users\\.local\bin\TiaMcpServer.exe'
args:
- '--tia-major-version'
- '21'
# 确认只读可用后再加:
# - '--allow-write'
toolCallTimeoutMs: 180000
failOnStartupError: false
关键配置项:
| 字段 | 含义 | 默认 |
|---|---|---|
command |
后端可执行文件 | 占位符(必填) |
serverName |
工具名前缀,profile 内须唯一 | tia |
args |
后端自己的命令行参数(各后端不同) | --tia-major-version 21 |
toolCallTimeoutMs |
单次工具调用超时(ms)。博途冷启动、编译、批量导入都可能超过 60 秒,故调大 | 60000 |
failOnStartupError |
启动失败时立即抛错,而不是静默缺少工具。开启会让 DSH 起不来(每次启动都中止),只在路径已验证后再开 | false |
reconnect |
断线重连策略 | 关闭 |
env / cwd |
传给后端进程的环境变量 / 工作目录 | 空 |
路径含空格:在 YAML 单引号字符串里直接写整串即可,例如 'D:\Program Files\your\tia\TiaMcpServer.exe'(注意本包内示例均用占位路径,真机路径只写在 home patch 里)。
能写梯形图吗(LAD/梯形图)
能——而且是文本写法。 但也不要手写 SimaticML FlgNet XML:这是后端写死的规则,GetAuthoringGuide('lad') 原文:
NEVER hand-write FlgNet XML for ladder logic — UId bookkeeping and entity escaping make it fail constantly.
可靠路径是 S7DCL 梯形图文本(SIMATIC SD,在 S7-1500 / V21 上编译验证过):
AI 写 .s7dcl 梯形图文本(+ 可选 .s7res 承载中文文本)
→ ImportFromDocuments / ImportBlocksFromDocuments
→ CompileSoftware → SaveProject
S7DCL 梯形图长什么样
{ S7_Optimized := "TRUE"; S7_PreferredLanguage := "LAD"; S7_Version := "0.1" }
FUNCTION "Name" : Void
VAR_INPUT Start : Bool; END_VAR
VAR_OUTPUT Run : Bool; END_VAR
{ S7_Language := "LAD" }
NETWORK
RUNG wire#powerrail
Contact( #Start )
Coil( #Run )
END_RUNG
END_NETWORK
END_FUNCTION
| 元件 | 写法 |
|---|---|
| 常开 / 常闭 / 取反 | Contact(op) / I_Contact(op) / Not() |
| 线圈 | Coil(op) / S_Coil(op) 置位 / R_Coil(op) 复位 |
| 边沿 | P_Trig(mem) / N_Trig(mem) —— 一个参数;P_Contact(signal, mem) / N_Contact(...) —— 两个参数。两者不可互换,参数给少了导入直接失败 |
| 比较框 | 前置 { S7_Templates := "SrcType := Int" },再 GT_Contact(in1 := , in2 := )(也有 LT_ / EQ_ / NE_ / LE_) |
| 数学 / 传送框 | Move(in := , out1 => )、Sub(in1 := , in2 := , out => )(Add / Mul / Div / Neg 同形) |
| 区间框(LAD 独有) | InRange(min := , in := , max := ) / OutRange(...) |
| IEC 定时器 | 静态变量 tmr : TON_TIME; + { S7_Templates := "time_type := Time" } + #tmr.TON(pt := T#5s, et => ),输出用 Contact(#tmr.Q) 读(块必须是 FUNCTION_BLOCK) |
| 调用 FC | rung 里写 "FC_Name"() |
| 操作数 | #局部变量、"全局变量"、"DB".成员 |
| 并联 / 多输出 | rung 内联 wire#w1 分叉,后续 rung 用 END_RUNG wire#w1 汇回该节点 |
三个最容易踩的坑:
- 每个 NETWORK 前面都必须有它自己的
{ S7_Language := "LAD" }。漏了会报Syntax error 'NETWORK' expecting END_FUNCTION_BLOCK(真实导出的 10147 个网络里,每一个都带这个 pragma)。 - 通用指令需要
{ S7_Templates := "..." },且模板名因指令而异(SrcType用于比较/数学、DestType用于 Convert、time_type用于 IEC 定时器、date_type、str_type)。写错时错误信息会列出Allowed Template Names:,照抄那串,别猜。 - 编码是头号杀手:
.s7dcl/.s7res一律 UTF-8 带 BOM;.scl只在纯 ASCII 时才可以不带 BOM,含中文要么加 BOM 要么注释全用 ASCII——否则会被当 GBK 读,得到乱码 + 假的语法错误。
一个块里混用 LAD + SCL
块头保持 S7_PreferredLanguage := "LAD",每个 NETWORK 各带自己的 { S7_Language := "SCL" },SCL 网络里写普通 SCL 语句(没有 RUNG)。这是"梯形图块里做算术"的官方做法。
读懂已有的 LAD
用 DescribeBlockLogic,不要把块导出来手工追线。它把每个 rung 还原成可读表达式(串联 ·、并联 +、常闭显示为 /操作数),列出线圈与 MOVE/比较/定时器框,并且会标出接在字面常量上的触点(⟨恒断·禁用本行⟩——常开触点接 FALSE 会静默废掉整行,肉眼几乎看不出来)。
实操建议
- 写 LAD/SCL 之前先
GetAuthoringGuide('lad' | 'scl' | 'db' | 'hmi' | 'errors')——后端反复强调 “Most quality problems come from skipping this”。 - 某个元件不确定写法:先对一个真实 LAD 块跑
ExportAsDocuments,抄它导出的.s7dcl结构(SD 比 XML 小约 9 倍且可读)。 - 只需要"调用一个 FC"的网络,可以直接用
BuildFlgNetCallXml/ComposePlcLadFcBlockXml,它们替你生成 XML。 - 写完必须
CompileSoftware(或CompileAndDiagnosePlc),再SaveProject——不会自动保存。 - 语言在建块时就定死:Openness 不会把 SCL 自动翻译成 LAD。
- F-LAD / 安全程序:
PublicAPI不暴露 F-CPU 编译,要在 TIA UI 里手工触发;安全块与安全变量也拒绝多数修改。
各后端的 LAD 路径:
| 后端 | LAD 怎么写 | 备注 |
|---|---|---|
| bulaofen | 推荐 S7DCL 文本 → ImportFromDocuments;也支持 LAD XML 导入(BuildFlgNetCallXml 等替你生成),自带 docs/lad-instruction-library.md 与 GetAuthoringGuide('lad') |
LAD 资料与护栏最全 |
| heilingbrunner | ImportXmlBlock 导 LAD XML;或 V20+ 的 .s7dcl/.s7res |
单 exe;文档记录了 .s7res 必须对所有条目有 en-US 标签、否则可能失败的 Openness 已知问题 |
| Czarnak | 只能 XML(format=source 仅对 SCL 语言块、DB、UDT 可用) |
工具少、守卫严 |
安装后验证
-
重启 DSH 后,看工具列表里是否出现
mcp__tia__*。 -
若没有,先手动确认后端 exe 存在、且能独立启动并自检:
Test-Path 'C:\Users\\.local\bin\TiaMcpServer.exe' & 'C:\Users\\.local\bin\TiaMcpServer.exe' --doctor后端能独立启动但工具仍不出现,说明问题在 DSH 接线(patch/配置),不在后端。
-
接上后先只做只读:列设备、列块、导出块,确认 AI 看到的工程结构和你的一致,再考虑开写模式。
-
装了
dsh-mcp-panel的话,可以在设置页看这个 MCP 的连接状态、已注册工具、错误与重连计数。
排障
| 现象 | 可能原因 |
|---|---|
看不到 mcp__tia__* 工具 |
最常见:占位路径还没换成真实路径(刚装完就是这个状态)。其余:exe 路径错、后端启动即崩、patch 没生效 |
| 一调用就报权限/组错误 | 当前用户不在 Siemens TIA Openness 本地组,或加了组但没注销重登;也可能是博途侧未允许 Openness 访问。跑后端 doctor 确认 |
| DSH 因该插件无法启动 | ① home patch 里 insert 了与插件包重复的 mcp-tia 行 → serverName 冲突;删掉重复的那条 insert。② 你自己把 failOnStartupError 开成了 true 且路径错;设回 false 或改对路径 |
| 工具调用超时 | 博途冷启动/编译/批量导入超过 toolCallTimeoutMs(调大它;部分后端另有"预热"脚本可让后续调用快很多) |
| 导出的块报"不一致"错误 | 博途拒绝导出未编译通过的块。先编译,再导出 |
| 写入"成功"但工程没变 | Openness 的修改只在内存,必须调用保存类工具才落盘 |
| 工具太多、模型被淹没 | 选默认只暴露少量工具的后端(Czarnak 17 / bulaofen 默认 62 / heilingbrunner 只读 65),或在后端参数里限制工具面 |
安全提醒
以下操作必须人工确认后再执行,且先备份工程:
- 写入任何东西到生产工程(先只读跑通,再开写模式)
- 修改硬件地址、网络参数、通信设置
- 删除设备、块、变量表、库
- 修改安全相关对象或 Know-how 保护对象
- 下载到 PLC/HMI、进入在线模式——不属于本插件范围,也不在 Openness 的自动化能力里
推荐在 PLCSIM(S7-PLCSIM / PLCSIM Advanced)的离线工程上先验证整条链路。
移除
dsh plugin --profile desktop remove dsh-mcp-tia
(或从 dsh.profile.bundles 移除后 pnpm install),重启生效。想临时停用,可在 profile 的 cordis.patch.yml 里给 mcp-tia 行加 disabled: true。
许可证
MIT。本插件与西门子(Siemens AG)无隶属关系;TIA Portal、SIMATIC、STEP 7、WinCC 是西门子商标。Openness DLL 与博途本体不随本包分发,需自行安装并遵守其许可条款。
说明来源
- 西门子官方:TIA Portal Openness API 文档
- 三个后端各自的 README(工具清单、
doctor、写模式开关、已知限制) - 社区汇总:TIA Openness / MCP 开源项目清单
Install
This server does not publish a one-line install command.
Open the repository installation guide