LAD 生成服务
把控制意图校验后确定性生成 TIA 可导入的梯形图块:MCP 调用,按次计费。
打开 LAD 生成服务一段自然语言写的输送带应用需求:智能体拆出现场 DB、控制 FB、实例 DB 与主程序 OB,导入 TIA、整机编译到 0 错误 0 警告,再读回验收。
学完你能:独立走完「用自然语言说需求 → 让智能体交付完整应用 → 整机编译 0/0 → 读回验收」,并说清哪些环节不能交给 AI。
本课用一段自然语言写成的「输送带工位」需求,完整做一个能跑的应用:说需求 → 智能体拆应用并交付 → 通过 TiaLink 导入博途 → 整机编译到 0 错误 0 警告 → 读回验收。
和《写一段 SCL》不同:那次交付的是一段代码,这次交付的是一个应用——现场信号、控制逻辑、实例 DB、主程序调用,缺一个都不算完成。你不需要看懂智能体内部用了什么中间格式,也不需要替它决定用 FB 还是 FC、块号是多少、接口长什么样、用 DB 还是标签——你要管的是两件事:需求说清楚,整机验到位。
本课流程已在 TIA Portal V19 + S7-1500(CPU 1516-3 PN/DP)+ TiaLink + LAD 生成服务 上实测跑通:最终整机编译 0 错误 0 警告,读回对象与调用关系一致。真实项目不会每次都这么顺——本课把同类块上实测撞到的失败也写进了「实际过程」和「常见坑」。这恰好是本课最想教的:AI 做的应用能不能用,由整机编译和读回核对说了算,不由 AI 自称。
口径:AI 是辅助,改动必须人工复核。安全功能、联锁与急停逻辑不交给 AI。
LadDemo):不要在正在用的工程上练。空项目里没有设备也没关系——如果工程里没有带 PLC 软件的设备,智能体会在交付时自己建一台;先做两件一次性的事。TiaLink 的地址填你实际的网关地址;LAD 生成服务用公网端点:
{
"mcpServers": {
"tialink": {
"type": "http",
"url": "http://localhost:8080/mcp",
"headers": { "Authorization": "Bearer <你的 TiaLink API Token>" }
},
"lad": {
"type": "http",
"url": "https://tia.hubwiz.com/lad/mcp",
"headers": { "Authorization": "Bearer <你的 LAD 生成服务 API Key>" }
}
}
}配好后让智能体做一次健康检查和版本对齐:TiaLink 报告它携带的 LAD 规范身份,LAD 生成服务报告它判分所用的身份;两边一致,才说明"智能体读到的规则"和"判分的规则"是同一份。
看到什么:客户端能看到 TiaLink 与 LAD 生成服务两组工具;两边的规范版本一致。不一致就停,先更新其中一端,不要带着版本偏差往下做。
你只发一次消息:自然语言需求 + 交付要求。需求可以换成你自己的;交付要求建议保留,它决定智能体交付到什么程度。你不需要先画 I/O 表,也不需要指定用什么块、块号多少、接口怎么分——那些是实现细节,交给智能体。
我们有一段输送带,要接到 PLC 上跑起来。 现场有启动按钮、停止按钮、急停、过载保护、接触器反馈,还有一个复位按钮;输出是电机接触器,另外要两个故障指示。 按启动按钮,电机运行并保持;按停止按钮、急停动作或者电机过载,电机就停。 电机运行后如果 2 秒内没有收到接触器的反馈信号,就报“反馈故障”、让电机停并保持;等保护恢复后,按复位按钮清掉故障。 主程序每个扫描周期都要调用它。急停和安全回路最终由硬件保证,程序里只做联锁和报警。
交付要求:
- 先只读工程;如果没有带 PLC 软件的设备,你自己建一台(先 dry-run 再创建),不要让我手工建。
- 块怎么拆、接口、块号、DB/标签、实例 DB/OB 都由你决定;交付时报告你的选择,不要为了“确认”停下来等我。
- 生成时从 TiaLink 读 LAD 规范,用 LAD 生成服务生成块;不要手写或改生成文件。
- 自己用 TiaLink 导入,并编译整个软件到 0 错误 0 警告(不是只编译一个块)。
- 最后读回,报告对象清单(DB/FB/实例 DB/OB)、调用关系、整机编译数字,并列出没验证的东西。
| 必须说到 | 这段需求里的对应 |
|---|---|
| 对象与边界 | 一段输送带、一个能下载运行的应用;不限定块类型/块号/接口 |
| 现场信号 | 启动、停止、急停、过载、反馈、复位;输出为接触器 + 两个故障指示 |
| 正常怎么跑 | 按启动后运行并保持 |
| 异常怎么停 | 停止、急停、过载、反馈故障 |
| 复位与边界 | 保护恢复后复位;安全回路由硬件保证 |
| 运行方式 | 主程序每个扫描周期都要调用 |
自然语言不是让 AI 猜,而是把业务事实说全,让智能体去决定实现。不要替它设计块类型、块号、接口,也不要限定"只做一个 FB"——除非你有硬约束。
工程是空的、没有带 PLC 软件的设备也没关系:智能体会在交付时自己建一台,你不需要单独做这一步。
看到什么:一条消息发出去就够了;后面不需要再补第二条。之后读工程、建 CPU、拆块、生成、导入、编译、读回,都是智能体自己的工作。
智能体收到这一条消息后,自己决定块怎么拆、接口怎么定、块号是多少、用 DB 还是标签、实例 DB 和 OB 怎么建;它不会停下来问你,交付时说明选择即可。
说明:LAD 生成服务只生成块;应用需要的 DB 和实例 DB,智能体会用 TiaLink 的 SCL/DB 导入(或 TIA)创建。这是它的实现选择,不需要你写 SCL。
它把这个需求拆成了一个完整应用(这是它的选择,不是你要审的实现方案):
| 对象 | 类型 | 编号(它选的) | 作用 |
|---|---|---|---|
DB_Conveyor |
全局 DB | 10 | 装现场信号:6 个输入 + 3 个输出 |
ConveyorControl |
FB | 1000 | 控制逻辑,4 个网络 |
ConveyorControl_DB |
实例 DB | 1 | FB 的实例,保存定时器和锁存状态 |
Main |
OB | 1 | 每个扫描周期调用 FB |
DB_Conveyor 里的现场信号:
| 成员 | 类型 | 方向 |
|---|---|---|
Start / Stop / EStop / Overload / Reset / RunFeedback |
Bool | 输入 |
Run / Fault / RunFeedbackFault |
Bool | 输出 |
控制逻辑的 4 个网络(# 前缀是 TIA 对块内局部变量的显示习惯):
主程序里只有一条调用,把 DB 的现场信号接到 FB 的输入/输出上:
注意三件事:
RunTimer 声明在 FB 的 Static),实例 DB 保存状态;这是"应用能跑"的一部分,不是可选装饰。看到什么:四个对象、一张对象表、一张现场信号表、4 张逻辑图 + 1 张调用图。这些是它的选择,不是要你审的实现方案;你只需要确认结果能对上需求。
让智能体编译整个软件(不是只编译一个块)。真实过程里第一次并不顺:
编译:Main (OB1) Network 1: Missing instance DB.
原因:OB 调用了 FB,但 FB 的实例 DB 还没建。智能体建好 ConveyorControl_DB(FB 的实例 DB)、重新导入、再编译:
编译:Main (OB1): Block was successfully compiled.
DB_Conveyor (DB10): Block was successfully compiled.
ConveyorControl (FB1000): Block was successfully compiled.
ConveyorControl_DB (DB1): Block was successfully compiled.
Compiling finished (errors: 0; warnings: 0)
这就是"完整应用"和"一个块"的区别:块本身合法,不代表应用能跑。同类块上还实测撞到过另外两类失败:
1) 计数器缺数据类型
TIA 导入报:CTU 缺少 value_type
处理:让智能体在生成时补上计数器的数据类型,再重新生成、重新导入。
2) 临时变量带了初值
导入报:Scratch: The Openness import failed: 该值无法更改。
处理:临时变量不能有初值;去掉后重新生成。
这里有一条重要分工:校验通过 ≠ TIA 接受。智能体的自检管语义,TIA 的导入/整机编译管它自己的规则,后者更严。遇到 TIA 报错,把报错原文贴回给智能体,让它按 TIA 的规则修并重新生成;不要手工去改生成文件,也不要跟校验器"争论"。最多 3 轮,修不好就停下来重新看需求。
如果同名块被覆盖后报"旧变量未定义",那是旧接口的残留代码;让智能体先删块、再导入。这也是 TIA 规则,不是你的需求问题。
看到什么:整机编译 errors: 0; warnings: 0。如果有警告,也逐条判断是"必须改"还是"可以接受"。
最后一步不是"AI 说好了",而是你自己看证据:
DB_Conveyor);带状态的块有没有绑定实例 DB;整机编译数字;本课的读回结论:
| 核对项 | 期望 | 读回 |
|---|---|---|
| 对象 | 全局 DB / FB / 实例 DB / OB 四个都在 | 一致 |
Main |
每个周期调用 ConveyorControl |
一致 |
| 实例 DB | ConveyorControl_DB |
一致 |
| 参数映射 | 现场信号来自 DB_Conveyor |
一致 |
| 整机编译 | 0 错误 / 0 警告 | 0 / 0 |
看到什么:四个对象都在、调用关系对得上、整机编译 0/0、已保存、没有未保存改动。读回不能证明行为正确——时序、现场接线、硬件互锁仍要另验(见「下一步」)。
Missing instance DB,或者逻辑根本不执行。把控制意图校验后确定性生成 TIA 可导入的梯形图块:MCP 调用,按次计费。
打开 LAD 生成服务把 TIA Portal 接到你的智能体:导入、编译、读回核对、PLCSIM 仿真。本地运行,工程数据不出厂。
打开 TiaLink