跳到正文
Learn-LAD
PLC AI 实战/用 AI 改造示例库里的第一个例子

用 AI 改造示例库里的第一个例子

从示例页一键导入「按钮翻转输出」,让 AI 加一个使能输入:改点表、串一个触点、编译 0/0、读回验证,全程可核对。

入门 第 2 课 20 分钟 TiaLink

学完你能:能把示例库的现成逻辑当起稿,让 AI 完成一次真实改造,并用编译和结构读回证明改对了。

概述

上一课《写一段 SCL》是从零写;这一课练工程里更高频的活:拿现成逻辑改。示例库的 60 个示例就是最好的起稿素材——挑一个接近你需求的,导入自己的工程,让 agent 改一处,再编译、读回、验证。

本课用示例库里最简单的入门例子 按钮翻转输出(单按钮翻转,LAD 4 个网络)实测,改造需求是加一个使能输入:

Enable(Bool,%I0.1):Enable=0 时输出 Motor 强制断开;Enable=1 时保持原有"按一下翻转"逻辑。

实测过程(新空项目):agent 建 S7-1200(1214C)→ 从示例页导入示例(点表 + Main)→ 基线编译 0/0 → 改造:点表加 1 个标签、Network 2 电源轨后串 1 个触点 → 导入 → 编译 0/0 → 读回结构验证 Motor = Enable AND (Tag_1 OR Motor) AND NOT Tag_2。

实测还踩到两个真实坑(都写进了「常见坑」):UId 必须是十进制整数;导入后 UId 会被 TIA 重新编号,验证不能按 UId 断言。工程最后没有保存(导入 ≠ 保存),是否保存由你确认。

你将学会

  • 从示例页把示例一键导入自己的工程(并知道同名覆盖的风险);
  • 把"改造需求"说清楚:行为、地址、边界、不许动什么;
  • 让 agent 改点表和 LAD 接线(在电源轨后串触点这种典型改法);
  • 用编译 + 结构读回证明改对了,而不是只信 agent 说"改好了";
  • 记住 LAD 改造的两个真实坑:UId 十进制、导入后 UId 重排。

前置条件

  • Windows 机器,已安装 TIA Portal V19(TiaLink 当前基于 V19 与 Openness 构建);
  • TiaLink:在 TiaLink 页面 下载并启动;
  • 一个支持 Streamable HTTP MCP 的客户端(Claude Code、Cursor、VS Code 等),MCP 端点为 http://localhost:8080/mcp;
  • 一个可以随便改的工程:新建的空项目就行(没有 CPU 也没关系,agent 会建一台 S7-1200);不要把示例导进正在用的正式工程——示例自带 Main(OB1) 和 Default tag table,导入会覆盖同名对象;
  • 纪律:导入 ≠ 保存。改造完成后先别保存,确认无误再落盘。

步骤

第一步:配好 TiaLink 与 MCP

在博途那台机器上启动 TiaLink、打开(或新建)那个可以随便改的工程。页首状态条会自动检测;然后在客户端里加一个 Streamable HTTP MCP 服务:

先在本页顶部点「设置」填一次地址(存在本机,示例库页面也用同一个地址),下面的 URL 会跟着更新,点「复制」贴进客户端配置:

MCP
{
  "mcpServers": {
    "tialink": {
      "type": "http",
      "url": "http://localhost:8080/mcp",
      "headers": { "Authorization": "Bearer <你的 TiaLink API Token>" }
    }
  }
}

看到什么:客户端列出 TiaLink 的工具(名字以 tialink_ 开头,覆盖健康检查、读工程、导入、编译、保存等)。工具数量随版本变化,不必对数字。

第二步:把示例导入自己的工程

打开按钮翻转输出示例页,点「导入到我的 TIA 项目」——导入的就是页面上那份 V19 SimaticML(点表 + Main 块)。空项目里没有 CPU 时,先让 agent 建一台,再导入。

导入示例 + 基线编译 0/0
实测:点表新增 4 个标签、Main 覆盖,编译基线 0 错误 0 警告

看到什么:点表里出现 PB/Motor/Tag_1/Tag_2,程序块里出现 Main (OB1),编译 0 错误 0 警告。这一步先确认"起稿"是干净的——后面改造出问题,才能分清是谁的锅。

第三步:你输入的(全部内容)

把下面这段发给 agent(示例和需求换成你自己的):

只读先看一遍,然后做一次改造。需求:把当前的"按钮翻转输出"逻辑加一个使能输入 Enable(Bool,%I0.1):Enable=0 时输出 Motor 强制断开;Enable=1 时保持原有"按一下翻转"逻辑。

要求:

  1. 先告诉我你打算改哪些对象、每处怎么改,等我确认;
  2. 只改 Main 和点表,不要动其他任何东西,也不要改 PB/Motor/Tag_1/Tag_2 的地址和含义;
  3. 改完导入并编译到 0 错误 0 警告;
  4. 读回验证:点表里有 Enable 且地址是 %I0.1;Main 的输出网络里 Enable 在并联分支之前;说明每条结论的依据;
  5. 导入后不要保存,等我说。

发完这一条,你等着看结果就行。下面是它实际会做的事(本次实测过程)。

agent 实际做了什么:改点表 + 给输出网络串一个触点

按需求,它只动两个地方:给点表加 Enable@%I0.1,然后在 Main 的输出网络(Network 2)电源轨之后、原来两个并联触点之前插入一个 Enable 触点:

改造前:Motor = (Tag_1 OR Motor) AND NOT Tag_2

改造前:Network 2
改造前:电源轨直接并联 Tag_1 / Motor 两个触点

改造后:Motor = Enable AND (Tag_1 OR Motor) AND NOT Tag_2

改造后:Network 2
改造后:电源轨后先串 Enable 触点,再进并联分支

这个"串一个触点"的改法看着简单,落到 SimaticML 是三步接线手术:把 电源轨 → 两个触点.in 这条线拆开,改成 电源轨 → 新触点.in、新触点.out → 两个触点.in,并给新触点配一个符号访问。

agent 实际做了什么:真实踩到的两个坑

坑一:UId 必须是十进制整数。 第一次导入被拒,TIA 报"UId 特性无效——3A 不是有效的 Int32 值":FlgNet 里的 UId 是十进制(25、30…),按十六进制生成就不合法。改成 40/41/42 后通过。

真实报错:UId 必须是十进制 Int32
实测报错原文与原因

坑二:导入成功后 UId 会被 TIA 重新编号。 验证时不能按"我插入的 UId 是 41"去断言——读回时它已经变成别的值。必须按符号和结构验证:

读回验证:新标签、结构、编译、未保存
结构验证:Enable 触点的 in 接电源轨、out 并联到 Tag_1/Motor

你得到什么

  • 一个改造后的示例:点表 5 个标签(多了 Enable@%I0.1),Main 输出网络带上使能;
  • 编译 0/0 + 结构读回的验证证据;
  • 一套可复用的流程:挑示例 → 导入 → 说清改造 → 编译 → 读回;
  • 完整《改造记录》如下(本次运行生成,展示时只做了排版):
展开《改造记录》全文(对象、改动、验证、未保存声明)

改造记录:按钮翻转输出 + 使能 Enable

环境:新空项目 · S7-1200 CPU 1214C V4.6(L0_Station / PLC_1)· TiaLink 1.1.0.0 + TIA Portal V19

1. 改动对象

对象 改动 依据
Default tag table 新增 Enable(Bool,%I0.1) 需求指定地址
Main (OB1) Network 2 电源轨后插入 Enable 常开触点 需求:Enable=0 强制断开输出

2. 未改动

  • PB@%I0.0、Motor@%Q0.0、Tag_1@%M0.0、Tag_2@%M0.1 的地址与含义;
  • Network 1(按状态分流)、Network 3/4(空网络);
  • 工程里的其他任何对象。

3. 改造后逻辑

  • Network 1(不变):Tag_1 = PB AND NOT Motor;Tag_2 = PB AND Motor
  • Network 2(改后):Motor = Enable AND (Tag_1 OR Motor) AND NOT Tag_2

4. 验证与证据

  • 导入点表:tagChanges: {added: 1}
  • 导入块:{"name":"Main","blockClass":"OB","overwritten":true}
  • 编译:state=Success, errorCount=0, warningCount=0
  • 读回点表:Enable@%I0.1 存在
  • 结构读回(不按 UId):Enable 访问 → Contact:in 接电源轨、out 并联到 Tag_1/Motor
  • 异常记录:首次导入因 UId 用十六进制被拒(3A 非 Int32),改十进制后通过

5. 状态声明

改动已导入内存但未保存(dirty=true);保存需工程主人确认。未做行为验证(编译 ≠ 行为),建议用仿真或硬件确认。

需要你动手的地方(很少)

  • 保存确认:导入 ≠ 保存;确认无误再落盘;
  • 行为验证:编译 0/0 只说明语法/一致性没问题,Enable=0 时输出是否真的断开,要靠仿真或硬件(见下一课《投运前先仿真》,待上线);
  • 注意同名覆盖:示例带 Main 和 Default tag table,导入前确认工程里没有你不想被覆盖的同名对象。

可选:想逐步监督时的分步指令

正常使用不需要;如果你想在每一步停下来看,可以用这些指令:

想介入的点 发给 agent 的话
先看再改 只读。列出你打算改的对象和每处改法,等我确认,不要导入。
只改点表 先只加点表标签 Enable,地址 %I0.1,导入后编译,别动块。
只改逻辑 只改 Main 的输出网络:在并联分支前串 Enable 触点,其他网络不要动。
编译报告 导入后自己编译,把结果和错误原文给我,不要只给结论。
读回验证 读回点表和 Main,按符号/结构说明 Enable 的位置,给出依据。
暂不保存 所有改动先不要保存,等我确认。

验证清单

  • 示例导入成功:点表新增、Main 出现,基线编译 0/0;
  • 改造只动了预期的对象(点表 +1 个标签、块 1 个网络);
  • 新标签的地址与需求一致(Enable@%I0.1);
  • 编译 0 错误 0 警告;
  • 读回验证:Enable 在并联分支之前,接线结构正确;验证按符号/结构,不按 UId;
  • 对照改造前后,其他逻辑没有被误改;
  • 知道当前未保存,保存经过确认。

常见坑

  • 把示例导进正式工程:示例自带 Main(OB1)、Default tag table,会覆盖你的同名对象。用空项目/副本。
  • UId 用十六进制:FlgNet 的 UId 是十进制 Int32;写成 3A 会直接被拒。
  • 按 UId 做读回断言:导入后 TIA 会重排 UId,断言必然失败;要按符号和接线结构验证。
  • 先导块后加点表:新触点引用的符号不存在,导入会失败;点表在前。
  • 只信"改好了":不看编译、不读回,等于没验证;编译 0/0 也只证明一致性,不证明行为。
  • 忘记导入≠保存:以为已经生效,关掉工程就没了;反过来,擅自保存也可能把别人的未保存修改一起落盘。
  • 顺手改多了:串触点时误动了其他网络;改造前后各导出一次对比,是成本最低的核对方式。

下一步

本课工具

TiaLink

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

打开 TiaLink