用 TiaLink 为遗留的博途 PLC 项目生成文档
我劝你先别写那份说明。三页纸讲不清一套老程序,五张表可以,还能被抽查。
你要交接一套跑了十几年的程序。设备还在跑,程序没人敢碰,注释是 M10.3、DB12.DBW4 这种缩写,写它的人已经不在了。
这时候最想干的事,是写三页纸,讲清楚它在干什么,签个名,交出去。
我劝你先别。
不是写得不好。是这么写出来的东西,接手的人没法拿它做任何事。
一、三页说明答不了的问题
交接的时候,真正卡住人的从来不是"这套程序在干什么",是几件特别具体的事:
- 现场这根线,接的是哪个点?
- 我要动这个块,还有谁会跟着遭殃?
- 这个 DB 里的字,是谁写进去的?
三页说明一个都答不了。它能给你的只有一句"本程序实现上料、夹紧、加工、下料的顺序控制"。你要是真照着这句话去改程序,那是你胆子大。
另一种写法也很常见:把博途手册抄一遍,配几张截图。讲的是 PLC 能做什么,不是这台设备在做什么。截图更麻烦——程序改一行,全部作废,还搜不到东西。
这两种写法都缺同一样东西:每一行都能翻回工程里指出来。
二、五张表,各回答一个问题
要说清一套老程序,就五张表。不是凑数,是五个不同的问题。
| 表 | 它回答什么 | 最容易出错的地方 |
|---|---|---|
| IO 表 | 现场这根线,进的是哪个点? | 同一个地址,硬件组态和变量表里叫法不一样 |
| 块清单 | 一共多少块,哪一层在最外面? | 有 FB 从来没被调用过(以前做实验留下的) |
| 接口表 | 这个块要什么、给什么? | 形参注释空着,实参传的是临时变量 |
| 调用关系 | 改这个块,谁会跟着受影响? | 调用它的不止 OB1,还有一个中断 OB |
| 变量与 UDT 表 | 这个 DB 成员从哪来、到哪去? | UDT 套 UDT,真正的物理量在第三层 |
五张里最实用的是 IO 表——现场接线、停电复现、查点,都靠它。最容易糊弄的是接口表,因为字段多,看着填满就行,其实最容易填错。
最容易翻车的是调用关系。你以为只有 OB1 在调那个块,翻一下发现还有个中断 OB 也在调,改完之后平时不报错,一到特定工况就出问题。
五张表凑齐,"项目里有什么"才算说完了。缺哪张,那次交接就一定有人替你猜。
三、AI 最爱干的事,是替你把话说圆
让模型读一段梯形图再解释,它会给你一段很顺的话。我第一次看到这种东西时还挺高兴——"急停延时复位"这种词都用上了,看着挺懂行。
后来我盯着那句看了半天,发现它是编的。
❌ FB12 实现急停延时复位,确保安全门关闭后设备才能启动。
✅ FB12 读 I0.0、I0.1,写 Q0.2;被 OB1 第 3 段调用;块内没有置位。
第一句读着顺,但它自己补了一条因果链。更要命的是,"急停延时复位"意味着安全功能——安全功能本来就不该写在这段标准程序里,该在安全继电器或者安全 PLC 里。模型看见"急停"两个字,顺手就把整套安全逻辑补上了。
第二句干巴巴的,但每一句都能在工程里指出来:哪个输入、哪个输出、谁在调、有没有置位。这就是区别。
所以规则只有一句:注释是空的块,只写它读了什么、写了什么、被谁调用。想下业务结论,另起一页,标题就叫"我的推测",让人签字。
四、每行加一栏,问题就解决一半
知道"要能指回去"以后,做法特别笨:每行多写一格,写清楚这条是从哪儿看到的。
| 结论 | 在哪看到的 | 工程里的原文 |
|---|---|---|
| FB12 由 OB1 调用 | 调用关系 › OB1 | CALL FB12 在 OB1 第 3 段 |
| I0.0 是数字量输入 | 硬件树 › 槽 4 | DI 16×24VDC,起始地址 0 |
| M10.3 被两处写 | 交叉引用 › M10.3 | 写:FB12 第 7 网络;FB20 第 2 网络 |
(上面是格式示例,不是哪个工程的数据。)
就这么一格,把一份"读后感"变成了能抽查的东西。谁不信,翻到那一行,自己看。
两个地方别偷懒。
读不到就写"未读到"。 它本身就是个结论:可能是块被加密,可能是库里的块,也可能接口本来就是空的。留白最糟——下一个人分不清是"确实没有"还是"你漏了"。
名字对不上是常态。 硬件组态里一个名,变量表里一个名,程序里又一个名。三列都留着,现场才追得下去。
五、动笔之前,先把工程存一份
文档还有一栏,几乎所有人都会漏:它对应哪一天的工程。
三个月后有人问"这份还准吗",你能给出的确定答案只有一句——"能对上某年某月某日存的那份"。所以顺序要反过来:
- 把块和工程导出,存到一处,记下路径、大小、sha256、时间;
- 记下博途版本(V19 / V20 / V21 的对象模型不完全一样);
- 文档开头写一句"依据 <时间> 的存档"。
这么干还有个附带好处:写的过程中谁动了工程,最后核对时哈希对不上,你当场就知道。
六、这段话可以直接复制
真正省时间的不是"帮我写文档"这四个字,是把五张表、出处、不许猜这三件事一次说清。下面这段可以直接发过去:
只读,不要改工程。工程 <名>,按顺序做五张表:
IO 表、块清单、接口表、调用关系、变量与 UDT 表。
要求:
1) 每行写三格:结论 | 在哪看到的 | 工程里的原文;
读不到就写"未读到",不许推测、不许补全;
2) 注释是空的块,只写读了什么、写了什么、被谁调用,不写业务含义;
3) 五张表做完,另外列三节:没有被谁调用的块、引用了却找不到定义的符号、
块类型分布与总数;
4) 最后写清楚五张表各有多少行、存档路径和 sha256、博途版本。
第 3 条别省。"没有被调用的块"和"引用了却找不到定义的符号",往往比五张表本身更有用——前者是以前留下的雷,后者决定这次交接能不能收尾。
七、交出去之前,自己核四遍
AI 做的表看着整齐,错的地方很隐蔽。四遍都对着工程原件核,别对着文档自查。
- 块数对不对。 表里的块数,跟块目录里的条数一致才算过。差一个就重读那一块,别手补。
- 接口有没有漏。 抽三个块,逐项比对读回来的结果。漏了字段就重读,别照着截图补。
- 调用关系闭不闭合。 每一个被调用的块,都要能在调用者里找到。找不到,要么是动态调用,要么是根本没定义,单独写一句说明。
- 存档能不能复现。 同一组参数再导一次,sha256 一致才算过。不一致说明工程被人动过,存档重做。
第二条最容易翻车。接口表字段多,模型特别容易把静态变量和临时变量写进同一列——这两者活着的时间完全不一样,混在一起,后面做影响分析会得出相反的结论。
八、先把做不到的说清楚
这几句话最好开工前就跟接手的人说清,免得对方按"厂家手册"的预期来收。
能给的:五张表、导出的文件和哈希(可以拿两个版本比差在哪)、"改这个块会影响谁"这类查询结果。
给不了的:逐条网络的注释式说明(那得人一段段读)、带图排版的手册和符号表报表(那是博途插件的活)、安全功能的结论(安全逻辑本来就不在这段程序里)。
还有一点挺重要:这套活全程只读,不需要授权写入。你可以先拿一套老工程把五张表跑出来,看看质量,再决定要不要让 AI 碰改程序的事——真要让它写,先看AI 改博途程序的写保护与边界。
九、先装技能包
技能叫 tialink-tia-portal。只装这一个,一条命令:
npx skills add https://github.com/tia-forge/tiaforge-plugins --skill tialink-tia-portal
它自己认客户端:Claude Code、Cursor、Codex、GitHub Copilot、Windsurf、Gemini、Cline、AMP、Antigravity、OpenClaw、CodeBuddy,还有 pi——都在名单里,脚本会往各自的技能目录放。pi 收到的是 ~/.agents/skills/,它启动时正好扫这个目录,不用再改配置。
技能页在 skills.sh 上的 tialink 博途技能,内容跟着仓库里的 SKILL.md 走。
WorkBuddy 和 DSH 不在这个名单里,要单独装。
WorkBuddy:技能 → 技能市场 → SkillHub 分栏,搜「博途」或「TIA Portal」。市场里找不到的话,下这个压缩包(10 KB),在桌面端「上传技能」里传上去: https://github.com/tia-forge/tiaforge-plugins/raw/main/zip/tialink-tia-portal-1.0.9.zip
DSH:从界面装就行,不用碰命令行。打开 DSH,左上角【插件】→ 输入 dsh-tiaforge → 点安装 → 完全退出 DSH 再打开(服务连接是启动时建立的,不重开不生效)。DSH 没有"只装一个技能"的入口,装进去是整包五个,tialink 是其中一个。
pi 如果想把配套的几个服务一起配好,也有一条整包的装法:pi install npm:pi-tiaforge,装完 /skill: 补全里能看到五个。
装完先别让它写文档。让它读一遍工程、把块清单报出来,块数对得上,再往下走。想看它从空工程一路跑到仿真是什么样,可以照Claude Code 接博途的完整链路走一遍。
十、技能之外,还得有个网关
这点容易被跳过:技能只教它怎么做,真正读工程的是跑在博途同机上的那个 TiaLink 网关。 没有它,技能装得再对,第一步「打开工程」就会失败。
顺序是这样的:
- 准备机器。 Windows 64 位,博途 V19 / V20 / V21 已装已授权。跑网关的那个 Windows 账号要加进本地
Siemens TIA Openness用户组——没有这一步,Openness 一律报授权错误;加完记得注销重登,组权限要重开会话才生效。 - 装网关。 先把它拷到最终目录(比如
C:\Program Files\TiaLink\)再运行,Openness 的白名单是按路径登记哈希的;跑一次自带的修复工具;用普通用户启动,别用管理员。 - 起博途,再起网关。 顺序反了连不上。网关起来后在浏览器打开
http://localhost:8080/,在那里配一个令牌。 - 把地址和令牌填进客户端。 地址必须以
/mcp结尾(http://192.168.x.x:8080/mcp),令牌放在请求头Authorization: Bearer <令牌>里。只会 stdio 的客户端不用折腾,用现成的转发:TIALINK_URL=… TIALINK_TOKEN=… npx tialink-mcp。 - 先自测,别急着让它干活。 在客户端那台机器上跑:
curl -sS -o /dev/null -w "%{http_code}\n" http://<网关IP>:8080/mcp
返回 4xx 也算通(网络到了,只是缺令牌);Connection refused 或者超时,才是网关没起来或者端口不对。
一个能省很多试错的事实:没授权也能读。 读工程、读块、读硬件树都不用授权,只有写入才需要。也就是说上面那个"跑一遍五张表看质量"的动作,在没买授权的情况下就能做完。
网关跟博途装同一台 Windows 上,下载和授权都在 TiaLink 博途 MCP 网关 这一页。
十一、明天先做三步
- 存档,数块。 导出、记哈希、数清有多少块、哪几种类型。这一步不用理解任何一段程序,但它决定后面所有核对有没有基准。
- 挑五个最常被问到的块,把接口补齐。 不用一次做全项目。先把"新人一定会问"的那几个做扎实,顺手把格式定下来。
- 把"我的推测"单独写一页,让人签字。 猜的东西不是不能写,是不能混在事实里。签字栏空着,这份文档就还不算交出去。
来源与口径:五张表、出处格式和四项核对来自 TiaLink 技能包(tialink-tia-portal)的"逆向文档"一节,CC BY 4.0;文中示例行只用于演示格式,不含任何真实工程数据。AI 整理出的文档必须人工复核后才能用于交接和生产。
本文由汇智网原创整理,转载请注明出处。
这是「AI × 工业 / PLC」专题的一部分。完整地图见:AI × 工业 / PLC 完全指南