ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

用OpenCode和MCP服务器让AI自动分析博途AF框架程序

用OpenCode和MCP服务器让AI自动分析博途AF框架程序 近期在学习和分析西门子博途TIA Portal官方 AF 框架案例程序时我尝试把 OpenCode 与博途 MCP 服务器打通让 AI 直接读取 PLC 程序块、变量和调用关系再自动整理出程序逻辑和功能说明。这套流程帮我省下了大量对照翻译和翻块的时间也让我对 AF 框架的标准化写法有了更系统的理解。本文将完整记录这次实操过程包括环境准备、MCP 配置、OpenCode 连接方式和实战分析案例适合正在用博途开发或学习西门子标准化程序框架的工程师参考。1. 背景与核心概念1.1 学习 AF 框架案例程序的痛点西门子官方提供的 AF 框架Application Framework案例程序是一套面向工业自动化应用的标准化程序架构里面包含了很多通用功能块比如电机控制、阀门控制、模拟量处理、报警处理、字符串与配方数据管理等等。这些案例程序的特点是结构严谨、模块划分清晰非常适合用来学习标准化 PLC 编程。但实际学起来并不轻松。AF 框架案例程序通常包含大量功能块FB、函数FC、全局数据块DB和多重背景数据块块与块之间的调用关系层层嵌套。看程序时经常要不停地在 OB1、FB 和 FC 之间跳转才能搞明白一个信号是怎么从设备层最终映射到 HMI 变量的。如果案例程序里的注释还以英文为主阅读成本会进一步增加。传统的学习方式是把每一个 FB 块截图、编号、手动整理调用关系再对照官方文档逐步理解。这种方式对新手来说效率很低而且容易漏掉关键细节。比如一个电机控制块可能同时涉及使能信号、反馈信号、故障复位、安全联锁、HMI 操作权限等多个输入输出参数光靠人眼去梳理这些参数的来源和去向非常耗时。1.2 AI 辅助分析解决什么问题AI 辅助分析解决的核心问题是“程序结构信息的快速提取与解释”。通过 AI 编程工具我们可以让模型读取博途工程中程序块的名字、注释、变量声明和程序段源代码然后按照我们的提问方式自动生成调用关系、功能说明、故障排查思路等结构化内容。这里需要特别强调的是AI 不是替代工程师做设计而是帮助我们快速理解现有代码。对于 AF 框架这种标准化程序AI 特别擅长做两件事一是把英文注释翻译并概括成容易理解的中文说明二是根据程序块的接口和内部逻辑推断出这个块的使用方法和典型调用场景。当然AI 要能够分析博途程序首先得能“看到”程序内容。博途的工程文件是加密且结构化的普通的文件读取方式很难直接拿到 FB 块内部的逻辑代码。这就需要一个桥接工具把博途工程中的程序信息提取出来再交给 AI 使用。1.3 OpenCode 与 MCP 服务器的组合OpenCode 是一个运行在终端里的 AI 编程助手类似大家熟知的 Cursor 或 Copilot CLI但它更强调本地化和可配置性。OpenCode 本身可以接入多种大模型同时支持通过 MCPModel Context Protocol协议扩展外部工具能力。MCP 服务器的价值在于它定义了一套标准化的方式让 AI 助手能够调用外部工具或读取外部数据。比如我们可以把博途工程的数据访问逻辑封装成一个 MCP 服务器AI 需要分析某个 FB 块时就通过 MCP 向博途工程查询并获取对应块的接口和代码再结合自身的代码理解能力完成分析。所以整体链路就是OpenCodeAI 助手→ MCP 协议 → 博途 MCP 服务器 → TIA Openness API → 博途工程文件TIA Openness 是博途提供的开放接口支持通过编程方式访问工程中的程序块、变量、硬件配置等信息。MCP 服务器做的工作就是把这些底层 API 封装成 AI 可以理解和调用的工具。2. 核心概念与实现原理2.1 博途 MCP 服务器的工作原理博途 MCP 服务器本质上是运行在本机的一个小型服务程序它通过 TIA Openness 与正在运行的博途工程建立连接。当 AI 助手发起一个“列出所有 FB 块”“读取 OB1 程序段”“查询某个 DB 变量的注释”之类的请求时MCP 服务器会把请求转换成对应的 TIA Openness API 调用读取到数据后再返回给 AI 助手。这个设计有几个明显好处。第一AI 不需要直接接触复杂的博途工程文件格式也不用关心 TIA Openness API 的细节只需要按照 MCP 服务器提供的工具名和参数来提问即可。第二MCP 服务器运行在本地博途工程文件不会离开当前电脑对项目数据的安全性和保密性比较友好。第三MCP 服务器可以复用不需要针对每个 AI 工具单独开发接口。我们在分析 AF 框架案例程序时最常用的 MCP 工具有这样几个列出工程内所有程序块、读取某个程序块的接口信息、读取某个程序块的注释和程序段代码、查找某个变量在哪些块中被引用。通过这些基础查询能力AI 就可以完成较高阶的分析任务。2.2 OpenCode 如何连接 MCP 服务器OpenCode 对 MCP 的支持方式是读取配置文件中的 MCP 服务器列表。每个服务器条目包含服务器名称、启动命令和参数。OpenCode 启动时会按照配置拉起对应的 MCP 进程并通过标准输入输出与它通信。配置 MCP 服务器时最核心的是command和args两个字段。command指定启动 MCP 服务器的可执行命令args是该命令的参数数组。如果 MCP 服务器是用 Node.js 写的通常会通过npx命令启动如果是编译好的二进制文件则直接指定路径。一个需要注意的坑是MCP 服务器进程是独立的它默认不会继承博途工程当前的上下文环境。所以如果 MCP 服务器需要连接某个具体的博途工程通常还需要在 MCP 服务器的配置或环境变量中指定工程文件路径或者在 MCP 服务器启动后通过工具参数传入工程路径。2.3 AF 框架的核心特征AF 框架Application Framework是西门子为标准化 PLC 编程提供的一套解决方案它在底层把工业现场常见的控制逻辑抽象成标准功能块。以官方案例程序为例AF 框架程序通常包含初始化逻辑、设备控制逻辑、报警处理逻辑、数据管理逻辑和诊断逻辑等层次。学习 AF 框架时重点要看三个层面。第一是程序架构即 OB1 如何调用 FB 块FB 块之间如何嵌套第二是接口设计即每个标准功能块的输入输出参数有哪些哪些信号是使能信号、反馈信号、联锁信号第三是数据存储即设备数据、工艺参数和报警数据分别存在哪些 DB 块中它们之间的数据流是怎样的。3. 环境准备与版本说明3.1 需要的软件环境下面是本次实操涉及的核心软件与作用说明软件/组件作用注意事项Windows 10/11 专业版博途和 OpenCode 都运行在 Windows 上建议关闭系统休眠以保持长时间分析稳定TIA Portal博途 V17/V18/V19 等版本打开和分析 PLC 工程版本不同Openness API 也有差异需要匹配TIA Openness 组件提供工程访问 API安装博途时需勾选 Openness 组件Node.js 18运行 OpenCode 和部分 MCP 服务器安装时勾选加入 PATHOpenCode CLIAI 编程助手安装命令以官方仓库为准博途 MCP 服务器把博途工程数据封装成 MCP 工具社区或自研实现版本需要根据你的项目实际情况调整本文示例以常见环境为例重点演示配置思路。博途 V17 和 V18 之间的 Openness API 兼容性并不完全一致如果你的工程是 V18 创建的建议优先在 V18 环境下做开发调试避免 API 不兼容导致读取失败。3.2 安装 OpenCodeOpenCode 的安装方式比较简单。如果你已经安装了 Node.js可以直接通过 npm 安装 CLI 工具。下面给出安装命令示例# 检查 Node.js 环境 node -v npm -v # 安装 OpenCode CLI具体包名以官方仓库发布为准 npm install -g opencode-ai # 验证安装 opencode --version如果你在安装时遇到权限错误比如提示EACCES建议不要直接使用sudo强制安装而是通过 Node 版本管理工具如 nvm-windows安装 Node.js把全局安装路径调整到当前用户目录下。安装完成后在终端输入opencode即可进入交互式 AI 编程界面。首次使用时会要求配置模型。OpenCode 支持多种模型供应商不同模型在理解 PLC 代码时的表现会有差异整体上选择上下文窗口更大、代码理解能力强的模型效果会更好。3.3 安装并配置博途 MCP 服务器博途 MCP 服务器目前没有统一官方版本常见实现有两种一种是社区分享的开源脚本另一种是使用 Python 或 Node.js 自己封装 TIA Openness 接口。我这里以社区常用的 Node.js 版 MCP 服务器为例进行说明具体命令名和参数请以你实际下载的 MCP 服务端为准。假设我们下载了一个名为tia-mcp-server的 MCP 服务器那么 OpenCode 的 MCP 配置文件可以写成{ mcp: { tia-mcp: { type: stdio, command: npx, args: [tia-mcp-server], env: { TIA_PROJECT_PATH: D:\\Projects\\AF_Demo\\AF_Demo.ap18 } } } }这里type固定为stdio表示通过标准输入输出通信command和args决定如何启动 MCP 服务器env用来向 MCP 服务器传递环境变量比如博途工程路径。如果你的 MCP 服务器是通过连接已打开的博途工程来读取数据那么工程路径也可以不提前指定而是在调用工具时传入。3.4 验证 MCP 服务器是否正常配置完成后可以在 OpenCode 中运行 MCP 工具列表命令来验证连接是否成功。如果 OpenCode 支持通过终端命令管理 MCP也可以先执行opencode mcp list这条命令会列出当前配置的所有 MCP 服务器及其状态。如果tia-mcp显示为已连接说明 MCP 服务器启动成功如果显示失败或报错则需要根据报错信息检查启动命令、路径和环境变量。另一种验证方式是在 OpenCode 对话中直接要求 AI 调用 MCP 工具例如输入“请列出当前博途工程中的 FB 块列表”如果 AI 成功返回结果说明数据链路已经打通。4. 实战案例用 OpenCode 自动分析 AF 框架程序4.1 准备一份 AF 框架案例工程为了演示我们需要准备一份包含 AF 框架程序的博途工程。如果你手头没有现成工程可以从西门子官网或相关案例资源中找到 AF 框架示例项目也可以打开一个之前做过的标准化程序工程来体验。打开博途后确认工程中至少包含以下几个要素一个完整的 OB1 主程序若干 FB 功能块比如电机控制块、阀门控制块、报警处理块对应的背景数据块或共享数据块变量表中包含输入输出映射。工程打开后建议先手动浏览一遍 OB1 和几个主要 FB 块心里有个大概印象。这样后续 AI 分析的结果你也能判断是否正确不会完全被动接收。4.2 在 OpenCode 中发起分析请求准备好工程后在终端启动 OpenCode进入对话模式。为了让 AI 充分利用 MCP 工具我们需要在对话中明确告诉 AI 可以调用哪些工具以及工程的基本信息。下面是一个典型的提问示例请先通过 MCP 工具列出当前博途工程中的所有功能块FB和函数FC 然后重点分析 AF 框架中设备控制相关块的调用关系。AI 收到请求后会通过 MCP 服务器读取工程中的程序块列表然后根据块名和注释信息筛选出设备控制相关块。这个过程通常只需要几秒钟。为了让分析结果更有条理可以继续追问请把 FB 块 Motor_Control 的接口参数整理成表格 包括参数名称、数据类型、方向输入/输出和注释含义。MCP 服务器返回的块接口数据会包含 AF 框架标准功能块的声明信息AI 会基于这些信息生成一张结构清晰的接口表后续我们用这张表去对照 HMI 变量和 PLC 变量就方便很多。4.3 分析 AF 框架的程序块调用层级AF 框架程序的一个特点是块嵌套层级很深。为了把调用关系完整还原出来可以让 AI 依次读取 OB1、FB 块和 FC 函数的内容再结合块内的程序段注释整理出调用树。示例提问方式如下请分析 OB1 的程序段说明 OB1 调用了哪些 FB 和 FC 分别用一句话解释每个被调用块的作用并输出调用关系树。AI 会调用读取程序段的 MCP 工具获取 OB1 内部的调用指令和注释然后生成类似下面的调用关系OB1主程序 ├── FB100_Motor_Control电机控制 ├── FB101_Valve_Control阀门控制 ├── FB200_Alarm_Handle报警处理 ├── FC300_String_Convert字符串转换 └── FC400_Data_Collect数据采集这里要注意的是AI 读取到的调用关系是否准确取决于博途工程中是否有完整的调用注释和符号名。如果程序中大量使用临时变量或间接寻址AI 的分析结果可能会有偏差。这种情况建议通过人工抽查方式验证关键块的分析结论。4.4 分析一个设备控制功能块下面以电机控制块为例说明 AI 如何自动分析一个具体 FB 块。假设工程中存在一个名为FB_Motor_Control的功能块我们可以向 AI 提问请读取 FB_Motor_Control 的完整接口和程序段代码 用中文解释这个块的整体控制逻辑包括启动条件、停止条件、 故障复位和保护联锁。AI 会通过 MCP 工具获取该块的接口声明并读取程序段中实际使用的输入输出参数和中间逻辑。常见的分析结果会包括启动条件通常由 HMI 启动按钮、现场启动命令或自动模式命令触发停止条件HMI 停止按钮、现场停止命令或工艺完成信号故障处理过载、短路、反馈丢失时置位故障位并触发报警联锁逻辑设备未就绪、安全回路断开时禁止启动。这种结构化结果比直接看代码直观很多尤其适合在项目交接或技术培训时快速了解程序功能。4.5 用 AI 排查字符串显示异常问题在 AF 框架案例中经常涉及字符串类型的处理和 HMI 显示。一个常见的问题是PLC 侧某个字符串变量的值已经变为 0但触摸屏上仍然显示原来的字符。这个问题的原因通常不在字符串本身而是通信区域的数据更新机制或数据类型映射不一致导致的。我们可以把这类问题交给 AI 辅助分析。首先让 AI 读取相关 DB 块中字符串变量的定义和引用位置找出该变量是由哪个 FB 块写入的写入逻辑为什么没有真正把值清零。示例提问如下请查找 DB100 中的字符串变量 Str_RecipeName 分析它在哪些 FB 块中被写入或清零 并检查是否有 ByteSwap 或按字节复制导致显示异常的风险。AI 在分析后通常会提示检查以下几个方向触摸屏变量连接是否绑定到了 DB 块中的正确偏移地址字符串长度是否超出了 HMI 侧定义的显示区域程序中是否使用了MOVE_BLK或SCL的字节复制指令导致字符串的终止符没有被正确写入HMI 或 PLC 的通信负载过大时是否有数据同步延迟。虽然 AI 不能直接帮我们修改触摸屏组态但可以帮助我们缩小排查范围把“字符串已经为 0 但显示没变”的问题定位到通信变量绑定或字节复制逻辑上大大减少盲猜时间。4.6 结合 HMI 变量和 PLC 变量交叉校验AF 框架程序学习过程中比较难的一点是搞清 HMI 变量与 PLC 变量之间的对应关系。由于博途项目中的 HMI 组态和 PLC 变量表是分开管理的初学者经常不知道某个按钮到底操作的是哪个 PLC 地址。我们可以让 AI 结合 MCP 工具读取变量表和 HMI 变量连接信息自动整理一个交叉对应表。提问示例请读取 PLC 变量表中名称包含 Motor_Start 的变量 并在 HMI 变量列表中查找与之连接的画面对象名称。 输出 PLC 地址、HMI 变量名和连接类型。这样整理出来的信息无论是做调试还是做文档都非常有价值。尤其在做项目移交时可以把这份对照表直接放到技术文档中让接手的人快速理解。5. 常见问题与排查思路5.1 OpenCode 无法被识别为 cmdlet 命令不少用户安装 OpenCode 后在终端输入opencode会得到如下错误opencode : 无法将“opencode”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。这个问题的根本原因是 npm 全局安装路径没有加入到系统 PATH 环境变量中。排查步骤如下问题现象常见原因解决思路opencode 不是 cmdletnpm 全局目录未加入 PATH找到 npm 全局安装目录加入 PATH 后重启终端显示权限不足Node.js 全局安装目录受保护使用 nvm-windows 安装 Node.js 到用户目录命令存在但无法进入界面终端为旧版 PowerShell升级 Windows Terminal 或使用新版 PowerShell解决方法是先执行npm config get prefix查看 npm 全局安装目录然后把目录路径添加到系统 PATH 环境变量中。添加完成后重新打开终端再执行opencode就可以正常启动了。5.2 MCP 服务器启动失败MCP 服务器启动失败也是常见问题。在 OpenCode 中执行 MCP 工具列表时如果显示连接失败一般需要检查以下内容问题现象常见原因解决思路MCP 启动即退出依赖包未安装完整在 MCP 服务器目录执行依赖安装命令提示找不到模块Node.js 版本过低升级到 Node.js 18 以上版本连接成功但查询超时博途工程未打开或 Openness 权限不足确认博途已打开对应工程并重新登录在实际配置中最容易忽略的是 TIA Openness 的工程访问权限。博途工程文件需要在项目属性中勾选“支持 Openness”并且 MCP 服务器进程必须以与博途相同的 Windows 用户身份运行否则 Openness API 会拒绝访问。5.3 博途读取程序段内容为空有时 MCP 服务器能够正常读取到程序块列表但读取程序段代码时返回为空。这可能是因为工程处于离线状态或者程序块使用了多重实例等复杂结构Openness 接口的解析深度不够。遇到这种情况建议先确认博途工程是否处于在线连接状态然后把目标程序块在博途中手动打开一遍再重新让 AI 读取。如果仍然为空可以尝试让 MCP 服务器调用导出的接口将程序块导出为文本文件后再由 AI 读取分析。5.4 触摸屏字符串显示不刷新前面提到的“字符串里面的值已经为 0但触摸屏还是显示原来的字符”在 AF 框架案例程序中偶有发生。除了通信映射问题外还有可能是 HMI 的显示控件使用了字符缓冲区缓存而 PLC 端写入了新值但未触发刷新事件。排查时可以按以下顺序逐步检查在博途在线监控中确认 PLC 侧字符串变量的实际值是否为 0 或空字符串检查 HMI 变量与 PLC 变量的连接路径是否一致在 HMI 画面中打开该字符串显示控件确认关联的变量地址偏移是否正确如果使用了脚本或内部变量中转检查是否缺少字符串刷新动作。这些排查步骤也可以借助 AI 自动生成检查清单让 AI 根据工程信息优先推荐最可能的原因提高效率。6. 最佳实践与工程建议6.1 任何自动化分析前先备份工程不管使用什么工具只要涉及到读取或修改博途工程我们都建议先做完整备份。特别是使用第三方 MCP 服务器时无法保证服务器代码一定不会触发写操作。建议在工程文件目录下创建 zip 压缩包或在博途中使用项目归档功能确保随时可以回滚。在自动化分析过程中尽量只开放“只读”权限。TIA Openness 本身支持只读访问我们可以在 MCP 服务器配置中设置只读模式避免 AI 在分析时意外触发程序编译、加密或写入操作。6.2 给 AI 设定清晰的分析范围OpenCode 或 AI 模型在分析大型博途工程时上下文窗口是有限的。如果一次性让 AI 分析整个工程中的所有 FB 块不仅效果差而且容易遗漏关键信息。最佳实践是每次提问聚焦一个对象。比如一次只分析一个 FB 块或者一次只整理一条调用链。在分析完一个块后再带着上下文询问下一个块。这种“增量式”分析方式虽然要多进行几次对话但分析质量会明显更高。6.3 建立标准化提问模板在分析 AF 框架案例程序时我们可以提前准备一套标准提问模板减少重复输入。对于程序块接口分析模板可以是读取程序块 {块名} 的接口信息 输出格式为 Markdown 表格包含参数名、数据类型、输入/输出方向、注释含义。对于调用关系分析模板可以是分析 OB1 程序段中的调用关系 输出从 OB1 到最底层 FB/FC 的完整调用树 并用一句话概括每个块的功能。这些模板可以保存在本地文档或 OpenCode 的配置文件中需要时直接复用大大提升分析效率。6.4 对 AI 分析结果保持审慎虽然 AI 在代码理解和结构化整理方面表现出色但对于 AF 框架这种依赖大量全局数据块和多重背景数据块的程序分析结果仍然需要人工验证。特别是涉及安全联锁、故障复位等关键逻辑时必须回到博途中逐条核对。建议把 AI 生成的分析文档作为一个“学习草稿”或“初步框架”而不是最终交付物。在关键控制逻辑上可以对照博途在线监控逐行确认确保理解无误。6.5 关注版本兼容性和环境隔离博途的 Openness API 不同版本之间存在差异。如果你在 V17 上开发了一个 MCP 服务器直接拿到 V18 或 V19 环境中可能无法运行。建议在 MCP 服务器代码中做好版本判断或者在配置文件中明确记录适用的博途版本。另外MCP 服务器依赖的 Python 或 Node.js 环境尽量使用虚拟环境或独立目录避免污染全局环境。在换电脑或换工程时通过一键脚本重建 MCP 服务器环境可以节省大量配置时间。7. 总结与学习路线通过本文的实操演示我们完成了 OpenCode 与博途 MCP 服务器的联调实现了让 AI 自动读取 AF 框架案例程序中的程序块信息、接口参数和调用关系并生成结构化分析文档。这套流程的核心价值在于把大量重复的“翻块、对照、翻译”工作交给 AI让我们把精力集中在逻辑理解和方案验证上。如果你也想像这样用 AI 辅助学习博途程序建议从一个小案例开始先安装 OpenCode 并配置好 MCP 服务器然后对自己最熟悉的一个 AF 框架功能块做一次自动分析感受一下工具链的效果。在确认流程稳定后再逐步扩展到整条设备控制链路、报警处理链路和字符串数据处理链路。后续还可以继续探索的方向包括把 AI 分析结果自动生成 Markdown 文档并提交到项目归档编写自定义 MCP 工具把博途工程与数据库、MES 系统的数据做关联分析或者在 OpenCode 中接入更多领域模型验证不同模型对 PLC 代码理解能力的差异。AI 辅助分析只是提高学习效率的一种方式真正对程序的理解仍然需要结合实际调试和工程验证。希望本文的配置方法和实战思路能够给你带来一些启发让你在分析 AF 框架案例程序时少走弯路。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进