> ## Content Index
> Fetch the complete content index at: https://www.hubwiz.com/blog/llms.txt
> Use this file to discover other available public pages before exploring further.

# 20 个工程师写了 10 年的 PLC 程序，我让 Gemini 读了一遍
- URL: https://www.hubwiz.com/blog/gemini-mcp-read-tia-portal-programs/
- Published: 2026-11-10T15:21:41.000Z
- Updated: 2026-11-10T15:43:21.000Z
- Description: 我以前怀疑 AI 会幻觉。但我早就让它读手册了——那为什么不让它读那堆二十年欠债的面条代码？
- Author: admin
- Tags: PLC, TIA Portal, MCP, Gemini, AI 编程

一位自动化工程师（Weiming，WZAutomation）在 11 月 7 日写了篇实测：**他用 Gemini + MCP 读 TIA Portal 里的 PLC 程序，专挑那种"人能读、但读起来很痛"的写法——`REF_TO` 间接赋值、`DB_ANY`、`POKE`。Gemini 解释了程序、算出了结果，还把执行流程画成流程图写回工作区。**

开场那句很诚实：**"我以前怀疑 AI 在控制软件开发里的作用，因为我知道它会幻觉。但我早就让它帮我读文档和手册了——那为什么不让它读那堆由 20 个工程师维护了 10 年的面条代码？"**

下面按原文翻译他的做法、代码与结论，最后附我们的整理。

## 一、MCP 是什么，以及它怎么接自动化软件

> MCP（Model Context Protocol）是 Anthropic 在 2024 年 11 月提出的开源标准，用来把 AI 应用连接到外部数据源、工具与工作流。2025 年 12 月，Anthropic 把 MCP 捐给了 Agentic AI Foundation——Linux 基金会下的一个基金。

协议是 server-client 结构：**MCP server 提供服务（tool call）与工作区数据；MCP client 把 server 能提供的服务以 schema 的形式发给 LLM。**

用户对 LLM 写提示之后，LLM 去请求 schema，让 MCP client 执行工具，把本地工作区的数据喂回 LLM；LLM 处理完再产出结果给用户。这个请求—取数—再请求的过程可能**来回多次**，才拿到最终结果。

MCP server 还可以提供反向的工具：让 LLM 把结果以文本形式写回工作区，或者把文本结果转成图片之类的格式。

![MCP 架构：LLM 在云端，MCP client 与 server 在本地，工作区数据不出机器](https://www.hubwiz.com/blog/content/images/2026/11/ws-mcp-arch.jpg)

*原文配图：User → MCP Client →（schema / JSON-RPC）→ 云端的 LLM；MCP Server ↔ Local Workspace。注意这张图的分界线——数据在本地，模型在云上。*

## 二、他写的那个"故意难读"的程序

他写了一个演示用的 FB，专门用了人类程序员常用的几种"臭名昭著"的手法：**指针访问 DB 数据、通过引用做间接赋值**。小程序里不难懂，但在大程序里，人要顺着追踪会非常痛苦。

```pascal
FUNCTION_BLOCK "FB_Calculate"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_IN_OUT
   Numbers : "numbertype";
END_VAR

VAR
   Value1 : Int;
   Value2 : Int;
   s_AddedValue : Int;
END_VAR

VAR_TEMP
   reference : REF_TO Int;
   error : Int;
   dbany : DB_ANY;
END_VAR

BEGIN
   #Value1 := #Numbers.value1;
   #Value2 := #Numbers.value2;

   #s_AddedValue := #Value1 + #Value2;

// POKE(area       := 16#84,
//      dbNumber   := #Numbers,
//      byteOffset := _dint_in_,
//      value      := _byte_in_);

   #reference := REF("DB_Strange".secretValue);

   #reference^ := #s_AddedValue;
END_FUNCTION_BLOCK

ORGANIZATION_BLOCK "Main"
TITLE = "Main Program Sweep (Cycle)"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1

BEGIN
   "DB_Calculate"(Numbers := "DB_Numbers".numbers);
END_ORGANIZATION_BLOCK

```

他的判断是：**这些写法对人很痛，但对 LLM 不算挑战——只要它知道这些编程技巧是怎么工作的。而它知道。**

## 三、他怎么用

跑起工具、接上自己的 Gemini key，然后要求 Gemini 做三件事：**算出程序在某个条件下的值、解释程序怎么工作、画一张执行流程图。**

![终端：FastMCP 4.1.5 起本地工作区 server，stdio 传输，连上后 Gemini 可读 ./gemini workspace](https://www.hubwiz.com/blog/content/images/2026/11/ws-mcp-terminal.jpg)

*原文截图：他用的是 FastMCP 4.1.5，起了一个 `LocalWorkspaceServer`，stdio 传输；连上后提示 "Gemini can now access your './gemini workspace' folder."*

Gemini 的回应是**调用 MCP server 提供的工具**去理解这个程序，然后用文字回答了问题、解释了它怎么工作。

最后它把程序执行过程画成流程图，**放进工作区**。

> 原文：这是 Gemini 生成的流程图。它相当准确，我相信任何懂西门子 PLC 编程的人都能看懂。

## 四、他下一步想做什么

> 这个想法试下来很有意思，看起来效果相当不错。  
>  
> 我下一步的计划是：写几个工具，让 Gemini 通过 **TIA Openness 或 OPC UA** 访问 PLC 的**在线数据**，看看它在一些在线程序的排障场景里表现如何。

注意这一步的性质变化：**从"读工程文件"走到"读现场数据"**。

## 五、我们的整理

这篇的价值不在于"AI 能读 PLC 程序"这个结论，而在于它给了一个**可以复现的最小路径**：一个故意难读的 FB → 一个 MCP server → 三个可验收的要求（算值、解释、画流程）。任何团队想自证"我们的 AI 辅助到底行不行"，都可以照这个做一遍。

三条我认为要补的边界：

1. **这是"读"，不是"写"。** 全程没有任何一步是往工程里写东西的。所以它避开了这类工具最危险的那一半——写入、编译、下装。原文最后那句"下一步接在线数据"才是风险分水岭：读工程是静态的，读现场是**会动的**。
2. **云模型的边界画在图里。** 那张架构图把 LLM 画在云端、工作区画在本地。这意味着**工程内容会出内网**（至少是它读到的那些块）。工业项目默认应该按"不出内网"设计，这一点原文没有展开，但选型时必须问。
3. **三个要求里，只有两个是可自动验收的。** "算值"可以对比，"画流程"可以肉眼核，但"解释怎么工作"对不对，仍然要靠懂行的人判断。**流程图"相当准确"是作者的判断，不是测量的结果。**

对我们做博途工具的人，这篇还确认了一件事：**这条链路上最贵的不是模型，是"读得到"**。他之所以能跑通，是因为本地有一个能读工作区的 MCP server；换到 TIA Portal 里，等价的那一层是 TIA Openness。模型换来换去差别不大，**能不能读到工程里的块、变量、交叉引用，才决定它有没有用**。

## 六、想自己跑一遍？三步

博途这边对应的现成入口是 [TiaLink（博途 MCP 网关）](https://tia.hubwiz.com/tia-link?utm%5Fsource=blog&utm%5Fmedium=article&utm%5Fcampaign=gemini-mcp-reader&utm%5Fcontent=cta)。它给 agent 的不是"能读到项目"这一件事，而是**两层**：

- **第一层：读到原始内容。** 块与接口的源码、DB 结构、标签表、硬件组态，按工程里的样子读出来，不做改写、不转述。
- **第二层：把项目建成一张可查询的代码图谱。** 它把工程的 SimaticML 导出索引成图——块与接口、调用关系、DB 与标签的读/写、悬空引用——再由 `tialink_context_*` 这组工具交给 agent：搜符号、走调用链、读块摘要、问"改这里会影响谁"。

**这两层的差别，就是这篇文章的分水岭。** 原文那位作者手上只有第一层：一堆导出的文本。所以 `REF_TO` 指向哪、`DB_ANY` 实际落在哪个数据块、这段逻辑还有谁在调用，他得让模型顺着文本自己推——能推对，但每次都从头推。

有了第二层，`这个块被谁调用`、`这个变量在哪儿被写`、`改它会影响到谁` 是**一次查询**，不是一次通读。工业项目里真正难的不是"看单个块"，是"看这个块在这张网里的位置"——这正是代码图谱存在的理由。

三步：

1. **导出 + 索引**：把工程（或一份已导出的 SimaticML 目录）喂进去，建那张图。索引是只读的，工程文件不上传；不装授权时连接本身就是只读模式。
2. **问三个问题**：这个块被谁调用？这个变量在哪儿被写？改它会影响到谁？
3. **对答案**：拿你自己已经知道的三个事实去核——核对上了，再让它读你不敢读的那几个块。

第 2 步那三个问题，正好对应原文的诉求；区别是**他读的是文本，TiaLink 读的是工程本体加关系图**。

**同一条链的下一段（写 SCL → 编译 → 仿真验证）也在 TiaLink 里**：除了读工程，它的 MCP 工具还包括建块、写 SCL 与梯形图、编译检查、PLCSIM Advanced 单元仿真与整机仿真、以及写完读回核对。入口同上：[TiaLink](https://tia.hubwiz.com/tia-link?utm%5Fsource=blog&utm%5Fmedium=article&utm%5Fcampaign=gemini-mcp-reader&utm%5Fcontent=chain)。

> 如果你不想自己配 agent、只想把需求说清楚让它把活干完，那是另一个产品：[TIA Forge](https://tia.hubwiz.com/tia-forge?utm%5Fsource=blog&utm%5Fmedium=article&utm%5Fcampaign=gemini-mcp-reader&utm%5Fcontent=forge)——成品智能体，关键节点由人确认。

---

**来源**

- Weiming（WZAutomation），《Play with AI: Gemini MCP Program Reader》，2026-11-07：[https://www.wzautomation.com/tech-talk/play\_with\_ai\_gemini\_mcp\_plc\_program\_reader/](https://www.wzautomation.com/tech-talk/play%5Fwith%5Fai%5Fgemini%5Fmcp%5Fplc%5Fprogram%5Freader/?ref=hubwiz.com)
- 原文配图三张（封面、MCP 架构、终端截图）均转自原文，作者制作
- MCP 的来历与捐赠时间取自原文（Anthropic 2024-11 提出；2025-12 捐给 Linux 基金会下的 Agentic AI Foundation）

**同一条链的下一段（读 → 写 SCL → 编译 → 仿真验证）都在 TiaLink 里**：它的 MCP 工具除了读工程，还包括建块、写 SCL 与梯形图、编译检查、PLCSIM Advanced 单元仿真与整机仿真、以及写完读回核对。入口同上：[TiaLink](https://tia.hubwiz.com/tia-link?utm%5Fsource=blog&utm%5Fmedium=article&utm%5Fcampaign=gemini-mcp-reader&utm%5Fcontent=chain)。

> 如果你不想自己配 agent、只想把需求说清楚让它把活干完，那是另一个产品：[TIA Forge](https://tia.hubwiz.com/tia-forge?utm%5Fsource=blog&utm%5Fmedium=article&utm%5Fcampaign=gemini-mcp-reader&utm%5Fcontent=forge)——成品智能体，关键节点由人确认。

**相关阅读**：[AI 改博途程序：TIA Openness MCP 的写保护与边界](https://www.hubwiz.com/blog/tia-portal-openness-mcp-write-guards/)——这篇讲"读"，那篇讲"写"，两篇合起来才是一条完整的链路。｜[AI × 工业 / PLC 完全指南](https://www.hubwiz.com/blog/ai-industrial-stack/)