TiaLink
把 TIA Portal 接到你的智能体:导入、编译、读回核对、PLCSIM 仿真。本地运行,工程数据不出厂。
打开 TiaLink只读一整套老工程:盘点结构、按块和网络讲清逻辑、每条结论带证据,产出一份《工程说明书》,工程零改动。
学完你能:能把一套没注释的老工程变成有证据、可核对的工程说明书,并分清「已确认 / 推断 / 无法确认」。
本课做一件接手老项目时最费时间的事:把一套没注释的博途工程读明白,并产出一份能交接的文档包。你输入一段需求,agent 只读盘点、按块和网络讲清逻辑、把硬件/网络/点表/报警/参数/HMI 映射都整理出来,每条结论给出证据,最后交付《工程说明书》和《人工核对清单》,工程零改动。
本课流程已在 TiaLink 1.1.0.0 + TIA Portal V19 上实测:对象是一套 PLC_SCADA_HMI 工程——S7-1500(CPU 1513F-1 PN)+ 两套经典 HMI + ET200SP,5 个块(OB 1 / FB 2 / DB 2,全 LAD)、2 张变量表共 51 个标签、HMI 3 个画面 40 个变量。全程只读,读完工程状态与开始时一致。
这套示例工程是开源的(MIT):rassulz/multirobot_painting_control_system。仓库里的 PLC/PLC_SCADA_HMI.zap19 就是本课用的工程,可以直接用博途 V19 打开——想复现本课,把它当练习对象即可。
这课的重点不是「让 AI 说点什么」,而是让它的每句话都能被你核对:已确认的、推断的、无法确认的,必须分开写;能自动读到的(硬件、网络、点表、参数)一条都不要漏。
口径:AI 是辅助理解,结论必须人工复核。读工程不产生修改,但给你的说明书可能含工艺/客户信息,外发前要脱敏。
http://localhost:8080/mcp;PLC/PLC_SCADA_HMI.zap19,MIT),或在示例库导入 分拣箱(Factory IO) 练手;真实使用只有一次输入:说清「只读、要哪些交付物、怎么给证据」。读设备、读硬件、导出网络、还原参数、归纳说明书都是 agent 自己做的。
在博途那台机器上启动 TiaLink、打开工程。页首状态条会自动检测;然后在客户端里加一个 Streamable HTTP MCP 服务:
先在本页顶部点「设置」填一次地址(存在本机,示例库页面也用同一个地址),下面的 URL 会跟着更新,点「复制」贴进客户端配置:
{
"mcpServers": {
"tialink": {
"type": "http",
"url": "http://localhost:8080/mcp",
"headers": { "Authorization": "Bearer <你的 TiaLink API Token>" }
}
}
}看到什么:客户端列出 TiaLink 的工具(名字以 tialink_ 开头,覆盖健康检查、读工程、硬件、导出、编译、保存等)。工具数量随版本变化,不必对数字。
把下面这段发给 agent(练习对象换成你的工程):
只读,不要修改任何对象,也不要保存工程。请把当前工程整理成一份可交接的《工程说明书》:
- 概况:设备与软件、CPU 型号/订货号/固件、HMI 类型、块清单(类型/编号/语言)、编辑语言、读取前的工程状态;
- 硬件与网络:机架与模块(订货号)、各模块 IO 地址、子网与每台设备的 IP、PROFINET IO 系统;
- 结构与调用关系:谁调用谁、实例 DB 归属;
- 完整点表:逐个列出标签(名称、类型、地址、注释),并把「未被 PLC 程序引用」的标签单独标出来;
- 报警与仿真表:每条报警/仿真位对应哪个设备、被哪些块引用;触发后的行为能确认才写;
- 参数:定时器/计数器的类型、实例名、设定值(PT/PV),从导出接线还原;
- HMI 与上位:画面清单、HMI 变量与 PLC 变量的映射、上位机/机器人接口的边界;
- 逐块说明:每个块做什么、关键网络在做什么;
- 问题清单、推断清单、无法确认清单。
每条结论标注依据(块名 + 网络号 / 硬件路径);只能推断的标注「推断」,无法确认的标注「无法确认」。不要猜。
发完这一条,你等着看结果就行。下面是它实际会做的事(本次实测过程)。
它先确认连接和项目名,然后盘点整套工程的规模——先有全局,再谈细节:
接着读硬件树和网络——这些是接手时最先要的"物理事实":
DI 8x24VDC ST_2 起始地址 Input29,正好对上 ZS-101..104 的 %I29.0–29.3——这种交叉验证能把"变量表"和"实物模块"绑在一起。然后它读接口、导出块,按网络收集证据。Main 的模式选择网络长这样(由 agent 读的同一份导出渲染,示例库同款渲染器):
把这张图和说明书里的结论对照,就是「证据绑定」的实际操作:结论说「Net1 由 PS103/HMI_PS103 选择 Auto_mode」,你可以直接在图里点着看。实测中立刻撞上老工程的三个典型形态:
Auto_mode/Manu_mode 的接口区一个参数都没有,逻辑全写在对全局变量(ZS-*、CV-*、HMI_*、SIM_*)的读写上——这决定了「改动影响面」要用变量去追,而不是用接口;Auto_mode 那个网络里有 36 个操作数;把它当「一条 rung」讲一定是错的,只能按功能段拆(传感器链、执行器链、报警/仿真、MATLAB 握手)。整张图长这样——一屏放不下,肉眼很难按时序读完:
Main 的 Network 3/4 什么都没有——老工程遗留,不影响运行但会干扰阅读,值得在说明书里单列。交付级文档和"摘要"的区别就在这里:它从导出 XML 的接线里还原出定时器/计数器的设定值,又把 51 个标签和三个块实际引用的符号做了对账:
Auto_mode 里有一个 TP 设定 5s、两个 100ms、一个 TON 1s,计数器 PV=100;Manu_mode 复用同样的 100ms/1s 与 PV=100。用途(比如 5s 对应哪一步)标成推断;HMI_Main、HMI_PID、HMI_Status、Alarm_Collection、System_Byte、check。其中 HMI_PID 值得注意:HMI 里有 PID 画面,但 PLC 程序里没有 PID 块、HMI_PID 也没被引用——PID 回路可能没实现,需要人工确认。最后它把证据整理成文档,并且把不确定的部分明确标出来:
完整产物如下(本次运行生成;展示时只做了排版,内容未改):
只读生成 · 2026-10-18 · TiaLink 1.1.0.0 + TIA Portal V19
| 站 | 模块 | 订货号 | 说明 |
|---|---|---|---|
| S7-1500/ET200MP | CPU 1513F-1 PN | 6ES7 513-1FL02-0AB0 | 固件 V2.9,F 型 |
| S7-1500/ET200MP | DI 32x24VDC HF | 6ES7 521-1BL00-0AB0 | 数字量输入 |
| S7-1500/ET200MP | DQ 32x24VDC/0.5A HF | 6ES7 522-1BL01-0AB0 | 数字量输出 |
| S7-1500/ET200MP | AI 8xU/I/RTD/TC ST | 6ES7 531-7KF00-0AB0 | 模拟量输入(程序里未用到模拟量标签) |
| ET 200SP | IM 155-6 PN ST | 6ES7 155-6AU01-0BN0 | 接口模块 |
| ET 200SP | DI 8x24VDC ST_2 | 6ES7 131-6BF01-0BA0 | 起始地址 Input29,对应 ZS-101..104(%I29.0–29.3) |
| ET 200SP | DQ 16x24VDC/0.5A ST | 6ES7 132-6BH01-0BA0 | 数字量输出 |
| ET 200SP | BA 2xRJ45 / Server module | 6ES7 193-6AR00-0AA0 / 6ES7 193-6PA00-0AA0 | 总线适配器 / 服务器模块 |
PN/IE_1(Ethernet);PLC 172.31.17.15、IO 设备 172.31.17.16、PC-System 172.31.17.99、HMI 172.31.17.25tialink_hardware / tialink_networks| 调用方 | 网络 | 被调用 | 实例 DB |
|---|---|---|---|
| Main (OB1) | Net1 | Auto_mode (FB2) | Block_1_DB (DB12) |
| Main (OB1) | Net2 | Manu_mode (FB3) | Manu_mode_DB (DB13) |
| Main (OB1) | Net3/4 | —(空网络) | — |
证据:导出 Main 的 CompileUnit;块清单的 instanceOf 字段。
Main_variables(27)
%I29.0 进料 / ZS-102 %I29.1 喷涂位 / ZS-103 %I29.2 干燥风机入口 / ZS-104 %I29.3 抓取位(Bool)%Q4.0 输送带 / RB-101 %Q0.0 喷涂臂 / RB-102 %Q0.2 搬运臂 / FN-101 %M11.3 干燥风机(Bool)%MW1 Package Counter(Int)%I0.0 启动 / PS102 %I0.1 停止 / PS103 %I0.2 自动 / PS104 %I0.3 手动 / ES101 %I0.4 急停(Bool)%M6.0 / HMI_PS102 %M6.1 / HMI_ES101 %M6.2 / HMI_PS103 %M6.3 / HMI_PS104 %M6.4(Bool)%M24.0 ConveyorFault / ALM_XA103_RB101 %M24.1 Spray ManipulatorFault / ALM_XA104_RB102 %M24.2 Pick & Place ManipulatorFault / ALM_XA102_FN101 %M24.3 FanFault(Bool)%M24.4 ConveyorBroken / SIM_RB101 %M24.5 Spray ManipulatorBroken / SIM_RB102 %M24.6 Pick & Place ManipulatorBroken / SIM_FN101 %M24.7 FanBroken(Bool)additional_variables(24)
%M7.0 / HMI_WP102_Visible %M7.1 / HMI_WP103_Visible %M7.2 / HMI_WP104_Visible %M7.3 / HMI_Main %M7.4 / HMI_PID %M7.5 / HMI_Status %M7.6 / HMI_WP101_Painted %Q1.6 / HMI_FN101_Visible1 %Q1.1 / HMI_FN101_Visible2 %Q1.2 / HMI_RB102_Visible %Q1.4(Bool)%M7.7 / HMI_PB_RB102 %M8.0 / HMI_PB_FN101 %M8.1 / HMI_PB_CV101 %M8.2(Bool)%M11.0 / Get_value2_from_Matlab %M11.1 / Send_value1_to_Matlab %M11.2 / Send_value2_to_Matlab %M11.4(Bool)%MW21(Int)/ System_Byte %MB0(Byte)/ tag3 %M4.0 / check %I2.4 / AlwaysFALSE %M0.3(Bool)未被任何 PLC 块引用(6):HMI_Main、HMI_PID、HMI_Status、Alarm_Collection、System_Byte、check。
| 标签 | 地址 | 含义(注释) | 被哪些块引用 | 触发后行为 |
|---|---|---|---|---|
| ALM_XA101_CV101 | %M24.0 | ConveyorFault | Auto_mode | 待核对 |
| ALM_XA103_RB101 | %M24.1 | Spray ManipulatorFault | Auto_mode、Manu_mode | 待核对 |
| ALM_XA104_RB102 | %M24.2 | Pick & Place ManipulatorFault | Auto_mode、Manu_mode | 待核对 |
| ALM_XA102_FN101 | %M24.3 | FanFault | Auto_mode、Manu_mode | 待核对 |
| SIM_CV101 | %M24.4 | ConveyorBroken | Auto_mode | 仿真开关,待核对 |
| SIM_RB101 | %M24.5 | Spray ManipulatorBroken | Auto_mode、Manu_mode | 仿真开关,待核对 |
| SIM_RB102 | %M24.6 | Pick & Place ManipulatorBroken | Auto_mode、Manu_mode | 仿真开关,待核对 |
| SIM_FN101 | %M24.7 | FanBroken | Auto_mode、Manu_mode | 仿真开关,待核对 |
说明:报警是"设备故障"位,SIM_* 可模拟故障;HMI 的 Error_Status 画面应当对应这些位。报出后是停机还是仅提示、在哪里复位,本轮没有逐线确认。
| 块 | 元件 | 实例 | 设定值 |
|---|---|---|---|
| Auto_mode | TP | IEC_Timer_0_DB_1 | T#5s |
| Auto_mode | TP | IEC_Timer_0_DB_3 | T#100ms |
| Auto_mode | TON | IEC_Timer_0_DB_4 | T#100ms |
| Auto_mode | TON | IEC_Timer_0_DB_2 | T#1s |
| Auto_mode | CTU | IEC_Counter_0_DB_2 | PV = 100 |
| Manu_mode | TP | IEC_Timer_0_DB_3 | T#100ms |
| Manu_mode | TON | IEC_Timer_0_DB_4 | T#100ms |
| Manu_mode | TON | IEC_Timer_0_DB_2 | T#1s |
| Manu_mode | CTU | IEC_Counter_0_DB_2 | PV = 100 |
用途推断:5s / 1s / 100ms 可能分别对应喷涂/干燥/防抖类延时;计数器 PV=100 很可能对应 QI-101 的包装计数阈值。均待逐线核对。
Main Part、PID、Error_Status(3 个);HMI 变量表 40 个amount→QI-101、CV-101、FAN→FN-101、RB-101、RB-102、ZS-101、ZS-102、ZS-103、ZS-104;其余 31 个为 HMI 内部/间接引用PID 画面,但 PLC 程序里没有 PID 块,HMI_PID 也未被 PLC 引用——PID 回路可能未实现,待人工确认Get_value*/Send_value* 在 %M11.x 与 PLC 握手;协议细节在仓库 MATLAB/ 目录ES101/HMI_ES101 急停链如何联动——必须在 TIA 中人工确认;HMI_PID),需确认是否为遗留或应由 HMI 使用MATLAB/)本次读取未修改、未编译、未保存任何对象;结束状态 dirty 与开始时一致。
dirty 状态,读之后应当还是原样(本课实测全程无写入)。正常使用不需要;如果你想在每一步停下来看,可以用这些指令:
| 想介入的点 | 发给 agent 的话 |
|---|---|
| 只盘点 | 只读。告诉我设备、块清单、变量表和 HMI 规模,不要解释逻辑。 |
| 硬件与网络 | 读出 CPU 型号/订货号、机架模块、IO 地址、子网与设备 IP。 |
| 调用关系 | 根据块清单列出调用关系与实例 DB 归属,标注依据。 |
| 完整点表 | 逐个列出所有标签(名称/类型/地址/注释),标出未被 PLC 引用的。 |
| 报警表 | 列出每条报警/仿真位的含义、被哪些块引用;行为不确定就标注。 |
| 参数 | 从导出接线还原定时器/计数器的实例与设定值。 |
| 讲一个块 | 只讲 Auto_mode 这个块:按功能段拆它的网络,每条结论给网络号。 |
| 零改动确认 | 对比读之前的工程状态,确认没有修改、没有保存。 |
dirty 明细读不到:TiaLink 只报告 dirty,不列改动;接手前要在 TIA 里人工搞清楚。把 TIA Portal 接到你的智能体:导入、编译、读回核对、PLCSIM 仿真。本地运行,工程数据不出厂。
打开 TiaLink