跳到正文
Learn-LAD
PLC AI 实战/改一个 IO 地址,会影响谁?

改一个 IO 地址,会影响谁?

动手前先做变更影响分析:找出所有引用(块/网络/HMI)、对照硬件通道、给出方案与 dryRun 预检,最后再决定是否执行。

进阶 第 2 课 25 分钟 TiaLink

学完你能:能在改一个变量/IO 之前拿到有证据的影响清单和执行方案,并知道哪些风险编译查不出来。

概述

上一课《读懂一套没注释的博途老工程》解决"看懂";这一课解决"敢改"。老工程没人敢动,往往不是不会改,而是不知道会波及谁。本课让 agent 在动手之前做一次变更影响分析,产出有证据的影响清单、风险清单和执行方案,最后用 dryRun 预检一遍。

本课用同一套开源示例工程 PLC_SCADA_HMI(MIT)实测,改动候选:

把 ZS-101(Infeed Sensor)的地址从 %I29.0 改到 %I29.4。

实测结论(全部只读):引用点只有 Auto_mode 6 处 + Manu_mode 2 处,全是读,块里没有绝对地址;HMI 侧是符号访问;目标 %I29.4 是同一模块的空闲通道;修改后的点表 dryRun 预检通过(overwrite Main_variables,27 个标签)。本次没有执行改动——影响分析阶段工程零改动。

核心观点:影响分析不是"搜一下变量名",必须覆盖 块/网络、读写方向、HMI/上位、硬件通道、符号还是绝对地址。其中"编译查不出的部分"才是最危险的。

你将学会

  • 让 agent 建「变量 → 引用点」清单:哪个块、哪个网络、几处、读还是写,每条带证据;
  • 区分符号访问和绝对地址——决定要不要改块;
  • 把软件地址对到硬件通道,知道 TIA 编译查不出什么;
  • 用 dryRun 预检变更计划,确认要动的对象和覆盖范围;
  • 执行变更的固定顺序与验证(导入 → 编译 → 读回 → HMI → 现场 → 保存),以及"导入 ≠ 保存"的纪律。

前置条件

  • Windows 机器,已安装 TIA Portal V19(TiaLink 当前基于 V19 与 Openness 构建);
  • TiaLink:在 TiaLink 页面 下载并启动,打开要分析的工程;
  • 一个支持 Streamable HTTP MCP 的客户端(Claude Code、Cursor、VS Code 等),MCP 端点为 http://localhost:8080/mcp;
  • 练习对象:你自己的工程,或本课同款开源示例(仓库里的 PLC/PLC_SCADA_HMI.zap19),也可以在示例库导入 分拣箱(Factory IO) 练手;
  • 两条纪律:分析阶段只读;执行阶段导入 ≠ 保存,保存必须由工程主人确认。工程如果本来就有未保存修改(dirty),先记下基线。

步骤

真实使用只有一次输入:说清"别改,先告诉我影响谁",以及报告要覆盖哪些面。扫描引用、查 HMI、对硬件、做预检都是 agent 自己完成的。

第一步:配好 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_ 开头,覆盖健康检查、读工程、导出、编译、保存等)。工具数量随版本变化,不必对数字。

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

把下面这段发给 agent(改动换成你的):

只读,不要修改任何对象,也不要保存工程。请先做变更影响分析:我打算把 ZS-101(Infeed Sensor)的地址从 %I29.0 改到 %I29.4,告诉我:

  1. 所有引用点:哪些块、哪个网络、引用了几处、是读还是写;块里有没有绝对地址访问;
  2. HMI/上位侧:有没有引用,是符号还是绝对地址;
  3. 硬件对照:现在的地址属于哪个模块/哪个通道,目标地址有没有真实通道,I 区哪些地址空闲;
  4. 风险清单:编译能查出来的、编译查不出来的,分开列;
  5. 变更方案:需要改哪些对象、按什么顺序执行、每步怎么验证、怎么回退;
  6. 用 dryRun 预检这个方案,不要真的导入。

每条结论给出依据(块名 + 网络号 / 模块路径 / 导出字段);只能推断的标注「推断」,无法确认的标注「无法确认」。不要猜。

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

agent 实际做了什么:扫软件引用

它导出块和点表,按符号找引用点,并区分读/写、符号/绝对地址:

软件引用扫描:6+2 处引用,全是符号读点
Auto_mode 6 处、Manu_mode 2 处,全是读;块内 0 处绝对地址

  • 引用点很少且方向单一:ZS-101 只被两个 FB 读(Contact / PContact),Main 不读;没有任何写入——如果是写点(线圈、DB 写入),风险等级完全不同;
  • 全是符号访问:三个块里 %I29.x 绝对地址出现 0 次,所以块一行都不用改,只改点表;如果有块用绝对地址,改地址就必须同步改块,这才叫"影响面";
  • HMI 侧是符号访问(AddressAccessMode=Symbolic):地址变更会自动跟随;但 HMI 画面/注释里若写死了地址文字,仍需人工同步——这属于"编译查不出"的部分。

agent 实际做了什么:把改动对到硬件

软件全绿不代表现场能用——它把地址占用和硬件通道对了一遍:

硬件对照:目标通道必须真实存在
I29.0 属于 ET200SP 的 DI 8x24VDC ST_2;I29.4 是同模块空闲通道

  • %I29.0 属于 ET200SP 的 DI 8x24VDC ST_2(Input29,8 通道 I29.0–I29.7);当前 I29.0–3 被 ZS-101..104 占用,目标 %I29.4 空闲可用;
  • 最危险的一条:TIA 编译不检查地址有没有物理通道。如果把 ZS-101 改到本工程没有通道的 I30.0,编译照样 0 错误 0 警告,但现场永远读不到信号;
  • 改地址改变的是"物理接线 ↔ 地址"的对应:现场接线要挪到 I29.4 端子(或确认原接线含义),这只有人或图纸能确认。

agent 实际做了什么:变更方案 + dryRun 预检

最后它把方案整理出来,并用 dryRun 预检了一遍(不落任何改动):

变更预检与执行清单
dryRun 返回 overwrite Main_variables;执行按 1-6 顺序,保存需确认

  • 预检结果:{action: "overwrite", kind: "tagTable", tagCount: 27}——改动会覆盖整个 Main_variables 点表(27 个标签),而不是"只改一个地址";这正是预检要告诉你的:执行时被覆盖的对象范围;
  • 执行顺序固定:导入 → 编译(期望 0/0,块不动)→ 读回点表与地址占用 → HMI 侧确认 → 现场/图纸确认 → 保存;
  • 最后一步才是保存,且必须有人确认:导入只是内存里的改动,不保存就随工程关闭消失;而工程如果本来是 dirty 的,保存会把你这次改动和别人未保存的修改一起落盘。

你得到什么

  • 一份**《变更影响报告》**:引用清单(块/网络/次数/读写)、HMI/上位结论、硬件对照、风险清单(编译查得出/查不出)、变更与回退方案、dryRun 预检结果;
  • 如果只做到分析+预检:工程零改动(本课实测就是如此);
  • 如果决定执行:改动后的点表、编译 0/0、读回证据(保存另行确认)。

完整产物如下(本次运行生成;展示时只做了排版,内容未改):

展开《变更影响报告》全文(引用清单、HMI/上位、硬件对照、风险、方案与回退、预检结果)

变更影响报告:ZS-101 地址调整

只读生成 · 2026-10-18 · TiaLink 1.1.0.0 + TIA Portal V19 · 工程 PLC_SCADA_HMI

1. 变更概述

  • 对象:全局标签 ZS-101(Bool,%I29.0,注释 Infeed Sensor)
  • 变更:地址 %I29.0 → %I29.4
  • 目的:现场接线调整 / 通道整理(由工程师补充)
  • 影响等级:低(仅读点、纯符号访问、目标通道空闲);现场侧仍需确认

2. 软件引用清单(证据:块导出,按符号精确匹配)

块 网络 引用处数 接入指令 方向
Auto_mode (FB2) Network 1 “Auto” 6 Contact / PContact 读
Manu_mode (FB3) Network 1 “Manu” 2 Contact / PContact 读
Main (OB1) — 0 — —
  • 块内绝对地址 %I29.x 出现 0 次 → 全符号访问 → 块不需要修改
  • 点表 Main_variables:ZS-101 的 LogicalAddress=%I29.0 —— 唯一需要改的对象

3. HMI / 上位

  • HMI 变量 ZS-101:AddressAccessMode=Symbolic → 随符号自动跟随
  • 需人工确认:HMI 画面/注释中是否写死了地址文本(如 “I29.0”)、报警文本、帮助文档
  • 上位机:MATLAB 握手只涉及 Get/Send_value*,不涉及 ZS-101;KUKA 侧在工程外

4. 硬件对照

  • 现地址 %I29.0:ET 200SP DI 8x24VDC ST_2(6ES7 131-6BF01-0BA0),Input29,通道 I29.0–I29.7
  • I 区占用:I0.0–0.4(按钮)、I2.4(check)、I29.0–3(ZS-101..104);I29.4–29.7 空闲
  • 目标 %I29.4:同模块空闲通道,可用
  • ⚠ 编译不检查物理通道:改用无通道地址(如 I30.0)也 0 错误 0 警告,但现场无信号
  • 现场侧:需确认 I29.4 端子接线(把原 %I29.0 的进料传感器接到 I29.4,或确认新用途)

5. 风险清单

A. 编译能查出:无。地址修改不产生语法/一致性错误(若改名或改类型才会)。

B. 编译查不出(需人工/其他手段):

  • 物理接线与通道的对应(必须人工/图纸)
  • HMI 写死的地址文本与文档
  • 地址重叠:TIA 不报错,需自行对占用
  • 工艺含义变化:进料传感器接错通道 → 动作时序异常

6. 变更方案与回退

执行顺序(建议):

  1. 记录工程状态基线(dirty / lastSaveUtc)
  2. 导出 Main_variables 点表,将 ZS-101 的 LogicalAddress 改为 %I29.4
  3. dryRun 预检(本报告已完成,见下)
  4. 导入点表(override)
  5. 编译 → 期望 0 错误 0 警告
  6. 读回:点表 + 地址占用,确认 ZS-101=%I29.4
  7. HMI 侧确认(符号访问应自动跟随)
  8. 现场/图纸确认 ← 只有人能做的部分
  9. 保存(需工程主人确认;导入 ≠ 保存)

回退:把点表改回 %I29.0 重新导入即可;因为块未改,回退只涉及点表一个对象。

7. dryRun 预检结果(实测)

{
  "dryRun": true,
  "objects": [
    { "name": "Main_variables", "kind": "tagTable", "action": "overwrite", "tagCount": 27, "overwritten": true }
  ]
}

注意:导入会覆盖整个点表(27 个标签),而不是“只改一个地址”——这是预检要告诉你的覆盖范围。

8. 只读声明

本报告生成过程未修改工程;dryRun 不落任何改动;工程 dirty 与开始时一致。

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

  • 现场接线/图纸确认:编译和导出都查不出"物理通道接的是什么",这是人的活;
  • HMI 画面/文本:符号访问会自动跟随,但写死的地址文字要人工同步;
  • 执行与保存的授权:导入前确认;保存前再确认一次(尤其是别人 dirty 的工程);
  • 写点/联锁改动:如果改的不是读点而是影响启停、互锁、安全的写点,必须人工评审逻辑,不能只看编译。

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

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

想介入的点 发给 agent 的话
只看引用 只读。列出这个变量的所有引用点:块、网络、次数、读写方向、符号还是绝对地址。
看 HMI 查 HMI/上位侧有没有引用,是符号还是绝对地址,给出依据。
硬件对照 现在的地址属哪个模块/通道?目标地址有没有真实通道?I 区哪些空闲?
风险清单 分成"编译能查出"和"编译查不出"两类。
预检 用 dryRun 预检这个变更,列出会覆盖哪些对象、多少个,不要真导入。
执行 按方案执行:导入 → 编译 → 读回 → 报告结果;先不要保存。

验证清单

  • 引用清单覆盖所有块(包括 0 引用的块也要明确说 0);
  • 每条引用区分读/写,并区分符号/绝对地址;
  • HMI/上位侧有结论且有依据(符号还是绝对);
  • 目标地址有真实通道;给出 I 区占用数据(当前占用与空闲);
  • 风险清单区分"编译查得出 / 编译查不出";
  • dryRun 预检通过,且没有真的导入(工程零改动);
  • 若执行:编译 0 错误 0 警告、读回与预期一致、HMI 确认、dirty 基线与执行前一致(除本次改动)、保存经过确认。

常见坑

  • 只搜变量名,不查 HMI/上位:HMI 变量表、上位机握手、机器人接口都可能有引用,PLC 里搜不到不等于没人用。
  • 只看引用不看方向:读点改地址影响小;写点/联锁改地址可能改变动作顺序,必须人工评审。
  • 把编译当验收:编译不查物理通道、不查 HMI 文本、不查接线、不查工艺。软件 0/0 只是最低门槛。
  • 忽略绝对地址访问:全符号访问时只改点表;一旦有块用绝对地址,改地址就要连着改块——分析时必须扫一遍。
  • 跳过 dryRun 直接导入:预检会告诉你覆盖范围(本例是整个 27 标签的点表,不只是改 1 个地址)。
  • 导入就以为生效:导入 ≠ 保存;要么明确保存,要么知道关闭工程就丢。反过来,擅自保存别人 dirty 的工程会把未保存修改一起落盘。
  • 重名/相似名:ZS-101 和 ZS-104 只差一位,扫描要用精确匹配并复核。
  • 巨型网络里引用分散:同一变量在一个网络里出现多次(本例 Auto_mode 6 处),核对时要按网络逐处看,不要只数个数(接着看 《读懂一套没注释的博途老工程》)。

下一步

本课工具

TiaLink

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

打开 TiaLink