TiaLink
把 TIA Portal 接到你的智能体:导入、编译、读回核对、PLCSIM 仿真。本地运行,工程数据不出厂。
打开 TiaLink动手前先做变更影响分析:找出所有引用(块/网络/HMI)、对照硬件通道、给出方案与 dryRun 预检,最后再决定是否执行。
学完你能:能在改一个变量/IO 之前拿到有证据的影响清单和执行方案,并知道哪些风险编译查不出来。
上一课《读懂一套没注释的博途老工程》解决"看懂";这一课解决"敢改"。老工程没人敢动,往往不是不会改,而是不知道会波及谁。本课让 agent 在动手之前做一次变更影响分析,产出有证据的影响清单、风险清单和执行方案,最后用 dryRun 预检一遍。
本课用同一套开源示例工程 PLC_SCADA_HMI(MIT)实测,改动候选:
把
ZS-101(Infeed Sensor)的地址从%I29.0改到%I29.4。
实测结论(全部只读):引用点只有 Auto_mode 6 处 + Manu_mode 2 处,全是读,块里没有绝对地址;HMI 侧是符号访问;目标 %I29.4 是同一模块的空闲通道;修改后的点表 dryRun 预检通过(overwrite Main_variables,27 个标签)。本次没有执行改动——影响分析阶段工程零改动。
核心观点:影响分析不是"搜一下变量名",必须覆盖 块/网络、读写方向、HMI/上位、硬件通道、符号还是绝对地址。其中"编译查不出的部分"才是最危险的。
http://localhost:8080/mcp;PLC/PLC_SCADA_HMI.zap19),也可以在示例库导入 分拣箱(Factory IO) 练手;dirty),先记下基线。真实使用只有一次输入:说清"别改,先告诉我影响谁",以及报告要覆盖哪些面。扫描引用、查 HMI、对硬件、做预检都是 agent 自己完成的。
在博途那台机器上启动 TiaLink、打开工程。页首状态条会自动检测;然后在客户端里加一个 Streamable HTTP MCP 服务:
先在本页顶部点「设置」填一次地址(存在本机,示例库页面也用同一个地址),下面的 URL 会跟着更新,点「复制」贴进客户端配置:
{
"mcpServers": {
"tialink": {
"type": "http",
"url": "http://localhost:8080/mcp",
"headers": { "Authorization": "Bearer <你的 TiaLink API Token>" }
}
}
}看到什么:客户端列出 TiaLink 的工具(名字以 tialink_ 开头,覆盖健康检查、读工程、导出、编译、保存等)。工具数量随版本变化,不必对数字。
把下面这段发给 agent(改动换成你的):
只读,不要修改任何对象,也不要保存工程。请先做变更影响分析:我打算把
ZS-101(Infeed Sensor)的地址从%I29.0改到%I29.4,告诉我:
- 所有引用点:哪些块、哪个网络、引用了几处、是读还是写;块里有没有绝对地址访问;
- HMI/上位侧:有没有引用,是符号还是绝对地址;
- 硬件对照:现在的地址属于哪个模块/哪个通道,目标地址有没有真实通道,I 区哪些地址空闲;
- 风险清单:编译能查出来的、编译查不出来的,分开列;
- 变更方案:需要改哪些对象、按什么顺序执行、每步怎么验证、怎么回退;
- 用 dryRun 预检这个方案,不要真的导入。
每条结论给出依据(块名 + 网络号 / 模块路径 / 导出字段);只能推断的标注「推断」,无法确认的标注「无法确认」。不要猜。
发完这一条,你等着看结果就行。下面是它实际会做的事(本次实测过程)。
它导出块和点表,按符号找引用点,并区分读/写、符号/绝对地址:
ZS-101 只被两个 FB 读(Contact / PContact),Main 不读;没有任何写入——如果是写点(线圈、DB 写入),风险等级完全不同;%I29.x 绝对地址出现 0 次,所以块一行都不用改,只改点表;如果有块用绝对地址,改地址就必须同步改块,这才叫"影响面";AddressAccessMode=Symbolic):地址变更会自动跟随;但 HMI 画面/注释里若写死了地址文字,仍需人工同步——这属于"编译查不出"的部分。软件全绿不代表现场能用——它把地址占用和硬件通道对了一遍:
%I29.0 属于 ET200SP 的 DI 8x24VDC ST_2(Input29,8 通道 I29.0–I29.7);当前 I29.0–3 被 ZS-101..104 占用,目标 %I29.4 空闲可用;ZS-101 改到本工程没有通道的 I30.0,编译照样 0 错误 0 警告,但现场永远读不到信号;I29.4 端子(或确认原接线含义),这只有人或图纸能确认。最后它把方案整理出来,并用 dryRun 预检了一遍(不落任何改动):
{action: "overwrite", kind: "tagTable", tagCount: 27}——改动会覆盖整个 Main_variables 点表(27 个标签),而不是"只改一个地址";这正是预检要告诉你的:执行时被覆盖的对象范围;完整产物如下(本次运行生成;展示时只做了排版,内容未改):
只读生成 · 2026-10-18 · TiaLink 1.1.0.0 + TIA Portal V19 · 工程 PLC_SCADA_HMI
ZS-101(Bool,%I29.0,注释 Infeed Sensor)%I29.0 → %I29.4| 块 | 网络 | 引用处数 | 接入指令 | 方向 |
|---|---|---|---|---|
| Auto_mode (FB2) | Network 1 “Auto” | 6 | Contact / PContact | 读 |
| Manu_mode (FB3) | Network 1 “Manu” | 2 | Contact / PContact | 读 |
| Main (OB1) | — | 0 | — | — |
%I29.x 出现 0 次 → 全符号访问 → 块不需要修改Main_variables:ZS-101 的 LogicalAddress=%I29.0 —— 唯一需要改的对象ZS-101:AddressAccessMode=Symbolic → 随符号自动跟随Get/Send_value*,不涉及 ZS-101;KUKA 侧在工程外%I29.0:ET 200SP DI 8x24VDC ST_2(6ES7 131-6BF01-0BA0),Input29,通道 I29.0–I29.7I0.0–0.4(按钮)、I2.4(check)、I29.0–3(ZS-101..104);I29.4–29.7 空闲%I29.4:同模块空闲通道,可用I30.0)也 0 错误 0 警告,但现场无信号I29.4 端子接线(把原 %I29.0 的进料传感器接到 I29.4,或确认新用途)A. 编译能查出:无。地址修改不产生语法/一致性错误(若改名或改类型才会)。
B. 编译查不出(需人工/其他手段):
执行顺序(建议):
Main_variables 点表,将 ZS-101 的 LogicalAddress 改为 %I29.4ZS-101=%I29.4回退:把点表改回 %I29.0 重新导入即可;因为块未改,回退只涉及点表一个对象。
{
"dryRun": true,
"objects": [
{ "name": "Main_variables", "kind": "tagTable", "action": "overwrite", "tagCount": 27, "overwritten": true }
]
}
注意:导入会覆盖整个点表(27 个标签),而不是“只改一个地址”——这是预检要告诉你的覆盖范围。
本报告生成过程未修改工程;dryRun 不落任何改动;工程 dirty 与开始时一致。
正常使用不需要;如果你想在每一步停下来看,可以用这些指令:
| 想介入的点 | 发给 agent 的话 |
|---|---|
| 只看引用 | 只读。列出这个变量的所有引用点:块、网络、次数、读写方向、符号还是绝对地址。 |
| 看 HMI | 查 HMI/上位侧有没有引用,是符号还是绝对地址,给出依据。 |
| 硬件对照 | 现在的地址属哪个模块/通道?目标地址有没有真实通道?I 区哪些空闲? |
| 风险清单 | 分成"编译能查出"和"编译查不出"两类。 |
| 预检 | 用 dryRun 预检这个变更,列出会覆盖哪些对象、多少个,不要真导入。 |
| 执行 | 按方案执行:导入 → 编译 → 读回 → 报告结果;先不要保存。 |
dirty 基线与执行前一致(除本次改动)、保存经过确认。ZS-101 和 ZS-104 只差一位,扫描要用精确匹配并复核。把 TIA Portal 接到你的智能体:导入、编译、读回核对、PLCSIM 仿真。本地运行,工程数据不出厂。
打开 TiaLink