跳到正文
Learn-LAD
PLC AI 实战/让 AI 做一个梯形图应用:从需求到整机编译 0 错误 0 警告

让 AI 做一个梯形图应用:从需求到整机编译 0 错误 0 警告

一段自然语言写的输送带应用需求:智能体拆出现场 DB、控制 FB、实例 DB 与主程序 OB,导入 TIA、整机编译到 0 错误 0 警告,再读回验收。

实战 第 3 课 45 分钟 LAD 生成服务 TiaLink

学完你能:独立走完「用自然语言说需求 → 让智能体交付完整应用 → 整机编译 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。

你将学会

  • 用自然语言把应用需求说清楚:现场信号、正常/异常、复位、运行方式;
  • 让智能体自己决定怎么拆应用(DB / FB / 实例 DB / OB)、接口、块号与网络结构,不替它设计;
  • 配好两个 MCP(TiaLink + LAD 生成服务),让智能体自己完成"生成 → 校验 → 导入 → 整机编译 → 修错";
  • 看懂三类失败:需求歧义、只交块不交调用、TIA 比自检更严的规则;
  • 用整机编译和读回结论验收,而不是"看起来像"。

三关验收:任何一关没过,都不算交付
语义校验只是第一关;TIA 整机编译是最终裁决;行为与现场仍要另验

前置条件

  • Windows 机器,已安装 TIA Portal V19;
  • 新建一个空项目(例如 LadDemo):不要在正在用的工程上练。空项目里没有设备也没关系——如果工程里没有带 PLC 软件的设备,智能体会在交付时自己建一台;
  • TiaLink:在 TiaLink 页面 下载并启动,连接当前博途工程;建议启用 API Token;
  • LAD 生成服务:在 LAD 生成服务 微信登录后创建 API Key。每次校验/生成扣 1 次额度,新用户有免费额度,具体以产品页为准;
  • 一个支持 Streamable HTTP MCP 的客户端(Claude Code、Cursor、VS Code 等);
  • 记住:不要把 API Key 写进仓库、截图或工单。

步骤

第一步:配好两个 MCP,先对齐规范版本

先做两件一次性的事。TiaLink 的地址填你实际的网关地址;LAD 生成服务用公网端点:

MCP
{
  "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 已连接、项目名正确;
  • 两边的规范版本一致。

看到什么:客户端能看到 TiaLink 与 LAD 生成服务两组工具;两边的规范版本一致。不一致就停,先更新其中一端,不要带着版本偏差往下做。

第二步:你输入的全部内容(就一次)

你只发一次消息:自然语言需求 + 交付要求。需求可以换成你自己的;交付要求建议保留,它决定智能体交付到什么程度。你不需要先画 I/O 表,也不需要指定用什么块、块号多少、接口怎么分——那些是实现细节,交给智能体。

我们有一段输送带,要接到 PLC 上跑起来。 现场有启动按钮、停止按钮、急停、过载保护、接触器反馈,还有一个复位按钮;输出是电机接触器,另外要两个故障指示。 按启动按钮,电机运行并保持;按停止按钮、急停动作或者电机过载,电机就停。 电机运行后如果 2 秒内没有收到接触器的反馈信号,就报“反馈故障”、让电机停并保持;等保护恢复后,按复位按钮清掉故障。 主程序每个扫描周期都要调用它。急停和安全回路最终由硬件保证,程序里只做联锁和报警。

交付要求:

  1. 先只读工程;如果没有带 PLC 软件的设备,你自己建一台(先 dry-run 再创建),不要让我手工建。
  2. 块怎么拆、接口、块号、DB/标签、实例 DB/OB 都由你决定;交付时报告你的选择,不要为了“确认”停下来等我。
  3. 生成时从 TiaLink 读 LAD 规范,用 LAD 生成服务生成块;不要手写或改生成文件。
  4. 自己用 TiaLink 导入,并编译整个软件到 0 错误 0 警告(不是只编译一个块)。
  5. 最后读回,报告对象清单(DB/FB/实例 DB/OB)、调用关系、整机编译数字,并列出没验证的东西。
必须说到 这段需求里的对应
对象与边界 一段输送带、一个能下载运行的应用;不限定块类型/块号/接口
现场信号 启动、停止、急停、过载、反馈、复位;输出为接触器 + 两个故障指示
正常怎么跑 按启动后运行并保持
异常怎么停 停止、急停、过载、反馈故障
复位与边界 保护恢复后复位;安全回路由硬件保证
运行方式 主程序每个扫描周期都要调用

自然语言不是让 AI 猜,而是把业务事实说全,让智能体去决定实现。不要替它设计块类型、块号、接口,也不要限定"只做一个 FB"——除非你有硬约束。

工程是空的、没有带 PLC 软件的设备也没关系:智能体会在交付时自己建一台,你不需要单独做这一步。

看到什么:一条消息发出去就够了;后面不需要再补第二条。之后读工程、建 CPU、拆块、生成、导入、编译、读回,都是智能体自己的工作。

第三步:让智能体交付完整应用

智能体收到这一条消息后,自己决定块怎么拆、接口怎么定、块号是多少、用 DB 还是标签、实例 DB 和 OB 怎么建;它不会停下来问你,交付时说明选择即可。

说明:LAD 生成服务只生成块;应用需要的 DB 和实例 DB,智能体会用 TiaLink 的 SCL/DB 导入(或 TIA)创建。这是它的实现选择,不需要你写 SCL。

它把这个需求拆成了一个完整应用(这是它的选择,不是你要审的实现方案):

完整应用:现场 DB、控制 FB、实例 DB、主程序 OB
四个对象缺一个都不算完整应用:没有 OB 调用,逻辑不会运行;没有实例 DB,调用编译不过

对象 类型 编号(它选的) 作用
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 对块内局部变量的显示习惯):

Network 1 — 运行自锁
R1、R2:Start 或已运行,经 Stop/EStop/Overload 常闭与未锁存故障门控,驱动 Run

Network 2 — 运行反馈计时
R3:Run 有效时 TON 计时 DELAY,PT 绑定常量 DELAY

Network 3 — 反馈故障
R3:延时到且 RunFeedback 仍为 FALSE,置 RunFeedbackFault

Network 4 — 故障锁存
R4:Overload 动作、反馈故障或已锁存故障,经 Reset 常闭清除

主程序里只有一条调用,把 DB 的现场信号接到 FB 的输入/输出上:

Main (OB1) — 每个扫描周期调用 ConveyorControl
OB1 调用 FB ConveyorControl,实例 DB 为 ConveyorControl_DB,参数映射到 DB_Conveyor

注意三件事:

  • 定时器是块内多实例(RunTimer 声明在 FB 的 Static),实例 DB 保存状态;这是"应用能跑"的一部分,不是可选装饰。
  • 只有 FB、没有 OB 调用,逻辑不会每个周期执行;只有 FB、没有实例 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、已保存、没有未保存改动。读回不能证明行为正确——时序、现场接线、硬件互锁仍要另验(见「下一步」)。

验证清单

  • TiaLink 已连接,项目名正确;
  • 两边的规范版本一致;
  • 工程里没有设备也没关系:智能体在交付时补齐了带 PLC 软件的设备;
  • 自然语言需求覆盖现场信号、正常/异常、复位、运行方式;没有替智能体指定块类型或块号;
  • 智能体交付了完整应用:主程序每个周期调用控制逻辑,现场信号有明确来源/去向(DB 或标签都可以);
  • 如果它用了带状态的块,实例 DB/状态存储存在,且调用绑定了它;
  • 整机编译 0 错误 0 警告(贴真实数字,不写"应该");
  • 读回:对象清单、调用关系、编译数字与它的交付说明一致;
  • 已保存,没有未保存改动;
  • 记下本次校验/生成消耗的次数;
  • 写下没验证的东西(行为、时序、现场互锁),并知道下一课去哪验。

常见坑

  • 需求含糊:"自动运行""异常时停机"这种描述,智能体只能猜。用自然语言把现场信号、正常/异常、复位说全;说不全就先别生成。
  • 只要一个块,没有 OB 调用:完整应用要每个扫描周期跑。只交 FB、没有实例 DB/OB,整机编译会报 Missing instance DB,或者逻辑根本不执行。
  • 替智能体设计块类型/块号/接口:这些是实现细节。除非有硬约束(比如必须复用某个块号),否则不要预先指定;你只需要把需求说清楚、验收结果。
  • 只编译单个块就以为完成:单块 0/0 不等于应用能跑;必须编译整个软件,并确认 OB 调用。
  • 校验通过 ≠ TIA 接受:计数器数据类型、临时变量初值、实例 DB 缺失——这些都是"看起来合法、TIA 不接受"。按 TIA 报错修,不要手工改生成物。
  • 同名块覆盖的残留:覆盖旧接口后可能报"旧变量未定义";让智能体先删块再导入。
  • 编译 0/0 ≠ 行为正确:编译只证明"能装进 CPU",不证明时序对。行为验证去仿真课。
  • 安全逻辑不交给 AI:急停、安全门、联锁的最终实现必须人工评审;本课的应用练习不覆盖安全功能。
  • Key 与工程截图:API Key 只显示一次,别写进仓库或截图;本课不提供任何生成物下载。

下一步

本课工具

LAD 生成服务

把控制意图校验后确定性生成 TIA 可导入的梯形图块:MCP 调用,按次计费。

打开 LAD 生成服务

TiaLink

把 TIA Portal 接到你的智能体:导入、编译、读回核对、PLCSIM 仿真。本地运行,工程数据不出厂。

打开 TiaLink