基于Claude Code与MCP协议实现西门子PLC梯形图AI辅助编程

📅 2026/8/6 10:12:21
基于Claude Code与MCP协议实现西门子PLC梯形图AI辅助编程
在工业自动化领域西门子博途TIA Portal是工程师进行PLC编程的核心工具其梯形图LAD语言直观易懂是逻辑控制的主流编程方式。然而传统的编程流程往往意味着工程师需要长时间在TIA Portal的图形化界面中进行拖拽、连线、配置对于复杂逻辑或批量修改效率仍有提升空间。随着AI辅助编程工具的兴起一种新的工作流开始被探索能否用自然语言描述控制逻辑由AI生成结构化的梯形图代码再集成到博途项目中这不仅能加速原型开发也为代码审查、逻辑验证和文档生成提供了新的可能性。Claude Code作为一款深度集成在IDE中的AI编程助手其核心能力在于理解上下文并生成、解释代码。而MCPModel Context Protocol则是一种开放的协议旨在标准化AI模型与外部工具、数据源之间的连接方式。将两者结合理论上可以构建一个智能体Claude Code作为“大脑”理解自然语言指令和PLC编程规范通过MCP协议调用一个专门为TIA Portal项目文件如.awl源文件设计的“手”——MCP Server来执行具体的文件读写、代码块插入等操作。本文的目标就是为熟悉西门子PLC编程的工程师展示如何搭建这样一个环境实现从自然语言需求到梯形图程序块的半自动化生成。1. 理解核心组件Claude Code、MCP与博途项目结构在开始动手之前必须厘清几个关键概念以及它们在本场景中的角色这是后续所有配置和开发工作的基础。1.1 Claude Code你的AI编程副驾Claude Code是Anthropic公司开发的AI编程助手通常以插件或扩展的形式集成在VS Code、Cursor等现代代码编辑器中。与通用的聊天机器人不同Claude Code专为编程场景优化具备以下对PLC编程有价值的能力强大的代码理解与生成能够理解多种编程语言的语法和结构。虽然梯形图不是传统文本语言但其AWL指令表源文件是结构化的文本Claude Code可以学习其模式。项目上下文感知可以读取当前打开的文件、项目结构基于此生成更准确的代码建议。自然语言交互你可以用中文或英文描述逻辑例如“实现一个三相电机的星三角启动程序包括启动、停止按钮热保护星形运行5秒后切换到三角形”Claude Code会尝试将其转化为结构化的编程逻辑描述。在本方案中Claude Code扮演“需求解析器”和“代码生成器”的角色。它负责将你的自然语言需求转化为符合西门子S7-1200/1500系列PLC编程规范的、基于SCL结构化控制语言或AWL片段的逻辑描述。我们更倾向于先生成SCL因为其文本特性更适合AI理解和生成后续再讨论如何关联到梯形图。1.2 MCP协议连接AI与外部世界的桥梁MCP的核心思想是让AI模型能够安全、可控地调用外部工具。一个典型的MCP架构包括MCP Client通常是集成了AI模型的应用程序如Claude Code。它发起工具调用请求。MCP Server提供具体工具能力的服务端。例如一个“文件系统工具”Server可以提供读写文件、列出目录的能力一个“TIA Portal工具”Server可以提供解析项目文件、插入代码块的能力。协议通信Client和Server通过标准化的JSON-RPC over stdio/HTTP/SSE进行通信传递工具调用请求和结果。对于我们的目标我们需要一个自定义的MCP Server。这个Server需要具备以下核心能力解析TIA Portal项目理解.ap13TIA Portal V13项目或.ap17等项目的内部结构定位到具体的PLC设备、程序块如Main[OB1]。读写AWL/SCL源文件梯形图、功能块图FBD、结构化文本SCL在TIA Portal中都有对应的文本化源文件位于项目目录的/Siemens/Step7/等子目录下。Server需要能读取现有逻辑并写入新的逻辑片段。提供“工具”向Claude Code暴露诸如read_plc_block、write_plc_sc、generate_ladder_from_scl等工具函数。1.3 西门子博途项目与梯形图本质TIA Portal项目是一个包含大量XML、二进制和源文件的文件夹。梯形图程序块最终以多种形式存储图形化表示在UI中看到的梯形图其布局信息存储在特定文件中。文本化源文件AWL/SCL这是程序的本质。梯形图可以转换为指令表AWL这是一种类似汇编的文本语言。而SCL则是高级文本语言。一个简单的起保停电路在梯形图中是I0.0常开并联Q0.0线圈自锁再串联I0.1常闭最后输出Q0.0。在SCL中可能表示为IF #Start OR #Motor THEN #Motor : 1; END_IF; IF #Stop THEN #Motor : 0; END_IF;在AWL中可能表示为A I 0.0; O Q 0.0; Q 0.0;关键认知我们无法也不应该让AI直接生成复杂的、包含精确坐标的梯形图图形文件。更可行的路径是生成SCL逻辑利用Claude Code强大的文本生成能力将自然语言需求转化为正确、完整的SCL代码段。转换或插入通过MCP Server将生成的SCL代码插入到TIA Portal项目的对应源文件中。在TIA Portal中SCL块和梯形图块可以共存甚至可以在SCL编辑器中编写逻辑然后将其作为“SCL源”分配给一个梯形图块虽然不常见或者直接使用SCL块。人工审查与微调工程师在TIA Portal中打开生成的SCL块审查逻辑必要时可将其内容复制到新建的梯形图块中或直接使用SCL块。对于纯梯形图需求可以探索将SCL逻辑“翻译”成AWL指令表再导入但这需要更复杂的MCP Server逻辑。2. 环境准备与工具链搭建实现整个流程需要搭建一个从代码编辑器到TIA Portal的桥梁。以下是详细的准备步骤。2.1 基础软件安装确保你的开发机上已安装以下软件软件名称版本要求作用安装验证命令Node.js18.x 或更高运行JavaScript/TypeScript编写的MCP Servernode --versionPython3.8备选方案可用于编写MCP Server或处理项目文件python --versionVS Code或Cursor最新稳定版集成Claude Code的代码编辑器-西门子 TIA PortalV15 或更高PLC编程的终极环境用于验证和最终下载正常打开项目即可Git最新版版本控制管理MCP Server代码git --version注意TIA Portal的安装路径通常包含空格和特殊字符在编写MCP Server时涉及路径操作要特别注意引号和转义。2.2 安装并配置Claude CodeClaude Code的安装方式取决于你使用的编辑器。在VS Code中安装打开VS Code进入扩展市场CtrlShiftX。搜索“Claude”。找到由“Anthropic”发布的“Claude”扩展点击安装。安装后侧边栏会出现Claude的图标。你需要登录Anthropic账户并获取API密钥进行配置。通常扩展会引导你完成此过程。在Cursor编辑器中Cursor编辑器内置了Claude模型通常开箱即用。你需要确保在Cursor的设置中已启用并正确配置了Claude模型如Claude 3.5 Sonnet。Cursor也支持配置MCP Server。关键配置点无论是VS Code还是Cursor都需要在其设置中通常是settings.json配置MCP Server的连接信息。我们将在创建Server后完成这一步。2.3 初始化MCP Server项目我们将创建一个最简单的、具备文件读写能力的MCP Server作为起点。选择Node.js环境因为它有官方SDK生态较好。创建项目目录并初始化mkdir tia-portal-mcp-server cd tia-portal-mcp-server npm init -y安装MCP SDKnpm install modelcontextprotocol/sdk创建Server入口文件新建文件server.js。// server.js import { Server } from modelcontextprotocol/sdk/server/index.js; import { StdioServerTransport } from modelcontextprotocol/sdk/server/stdio.js; import { CallToolRequestSchema, ListToolsRequestSchema, } from modelcontextprotocol/sdk/types.js; // 1. 创建Server实例 const server new Server( { name: tia-portal-mcp-server, version: 0.1.0, }, { capabilities: { tools: {}, // 声明本Server提供工具 }, } ); // 2. 定义工具读取TIA Portal项目中的SCL/AWL文件 server.setRequestHandler(ListToolsRequestSchema, async () { return { tools: [ { name: read_plc_source, description: 读取西门子TIA Portal项目中指定PLC块的源文件内容SCL/AWL, inputSchema: { type: object, properties: { projectPath: { type: string, description: TIA Portal项目文件夹的完整路径, }, plcName: { type: string, description: PLC设备名称如“PLC_1”, }, blockType: { type: string, description: 块类型如“OB”、“FC”、“FB”、“DB”, }, blockNumber: { type: number, description: 块编号如1对于OB1, }, }, required: [projectPath, plcName, blockType, blockNumber], }, }, { name: write_plc_scl, description: 将一段SCL代码写入到TIA Portal项目的指定块中覆盖或追加。注意此操作会直接修改项目文件请谨慎使用。, inputSchema: { type: object, properties: { projectPath: { type: string, description: 项目路径 }, plcName: { type: string, description: PLC设备名 }, blockType: { type: string, description: 块类型 }, blockNumber: { type: number, description: 块编号 }, sclCode: { type: string, description: 要写入的SCL代码 }, mode: { type: string, enum: [overwrite, append], description: 写入模式覆盖原有内容或追加到末尾, }, }, required: [projectPath, plcName, blockType, blockNumber, sclCode, mode], }, }, ], }; }); // 3. 实现工具的处理逻辑此处为简化示例仅模拟文件操作 server.setRequestHandler(CallToolRequestSchema, async (request) { const { name, arguments: args } request.params; if (name read_plc_source) { // 实际项目中这里需要解析TIA项目结构找到对应源文件 const { projectPath, plcName, blockType, blockNumber } args; const simulatedPath ${projectPath}/Siemens/Step7/${plcName}/Program/${blockType}${blockNumber}.scl; // 模拟读取文件 return { content: [ { type: text, text: 模拟读取文件${simulatedPath}\n内容为// 这里是块${blockType}${blockNumber}的现有SCL代码, }, ], }; } if (name write_plc_scl) { const { projectPath, plcName, blockType, blockNumber, sclCode, mode } args; const simulatedPath ${projectPath}/Siemens/Step7/${plcName}/Program/${blockType}${blockNumber}.scl; // 模拟写入文件 return { content: [ { type: text, text: 模拟${mode}模式写入文件${simulatedPath}\n写入的代码为\n${sclCode}\n\n**警告**在实际实现中此操作将直接修改项目源文件可能导致TIA Portal无法识别。强烈建议先备份或实现更安全的中间文件生成机制。, }, ], }; } throw new Error(未知工具${name}); }); // 4. 启动Server使用stdio传输 const transport new StdioServerTransport(); await server.connect(transport); console.error(TIA Portal MCP Server 已启动stdio模式);这个Server目前只是一个框架它声明了两个工具并模拟了其行为。最关键的一步是完善read_plc_source和write_plc_scl的实际逻辑这需要深入解析TIA Portal项目的目录和文件格式这通常涉及解析XML和特定二进制格式复杂度较高可能需要借助社区库或逆向工程。2.4 配置Claude Code连接MCP Server在Cursor中配置相对简单。在Cursor的设置界面Cmd,或Ctrl,中搜索“MCP”或“Model Context Protocol”。通常会有配置MCP Server的选项。你需要添加一个新的Server配置指向你刚刚创建的Server脚本。一个示例性的Cursor配置在settings.json中可能如下所示{ mcpServers: { tia-portal-server: { command: node, args: [/绝对路径/to/your/tia-portal-mcp-server/server.js], env: { // 可选环境变量 } } } }在VS Code的Claude扩展中配置方式可能类似具体请查阅Claude扩展关于MCP的文档。配置完成后重启编辑器。Claude Code应该就能识别到你注册的MCP工具了。你可以尝试在聊天框中输入“/”查看可用工具列表理论上应该能看到read_plc_source和write_plc_scl。3. 实现核心工作流从自然语言到SCL代码环境就绪后我们来演练一个完整的工作流用自然语言描述一个电机控制逻辑让Claude Code生成SCL代码并通过MCP Server“写入”项目目前是模拟。3.1 步骤一在编辑器中与Claude Code对话假设你已经在Cursor或VS Code中打开了任意一个项目甚至只是一个空文件夹。在Claude Code的聊天面板中你可以这样开始用户输入我有一个西门子S7-1200 PLC需要编写一个功能块FB。功能块名为“MotorControl”包含以下引脚 - 输入Start (Bool), Stop (Bool), Thermal (Bool), TimerPreset (Time) - 输出MotorRun (Bool), Star (Bool), Delta (Bool), Fault (Bool) - 静态变量StarTimer (TON), DeltaTimer (TON) 逻辑要求 1. 按下Start按钮且无热保护Thermal为False时MotorRun置位同时启动星形Star输出和StarTimer。 2. StarTimer到达预设时间TimerPreset后关闭Star输出启动三角形Delta输出和DeltaTimer。 3. DeltaTimer到达预设时间后保持Delta输出MotorRun保持。 4. 任何时候按下Stop按钮或热保护触发Thermal为True立即停止所有输出Star, Delta, MotorRun并置位Fault如果是因为Thermal。 5. Fault需要手动复位。 请用SCL语言编写这个功能块FB的代码。注意使用标准的TON定时器和正确的SCL语法。3.2 步骤二Claude Code生成SCL代码一个合格的Claude Code如Claude 3.5 Sonnet应该能生成如下结构清晰的SCL代码// 生成的功能块MotorControl FUNCTION_BLOCK MotorControl VAR_INPUT Start : Bool; // 启动按钮 Stop : Bool; // 停止按钮 Thermal : Bool; // 热保护信号True表示故障 TimerPreset : Time; // 定时器预设值 END_VAR VAR_OUTPUT MotorRun : Bool; // 电机运行指示 Star : Bool; // 星形接触器 Delta : Bool; // 三角形接触器 Fault : Bool; // 故障指示 END_VAR VAR_IN_OUT // 通常FB的静态变量放在这里但SCL中更常用VAR_STAT END_VAR VAR StarTimer : TON; // 星形启动定时器 DeltaTimer : TON; // 星-三角切换定时器 InternalFaultLatch : Bool; // 内部故障锁存 ResetFault : Bool; // 故障复位信号可外部连接 END_VAR // 主逻辑 // 故障处理热保护触发则锁存故障 IF Thermal THEN InternalFaultLatch : TRUE; Fault : TRUE; END_IF; // 故障复位逻辑假设通过外部一个上升沿复位 IF ResetFault AND NOT Thermal THEN InternalFaultLatch : FALSE; Fault : FALSE; END_IF; // 电机启停逻辑 IF NOT InternalFaultLatch THEN // 启动条件Start按下且未运行且未在停止状态 IF Start AND NOT MotorRun THEN MotorRun : TRUE; END_IF; // 停止条件Stop按下或故障锁存 IF Stop OR InternalFaultLatch THEN MotorRun : FALSE; Star : FALSE; Delta : FALSE; StarTimer(IN:FALSE); // 复位定时器 DeltaTimer(IN:FALSE); END_IF; // 星-三角控制逻辑 IF MotorRun THEN // 阶段1星形启动 StarTimer(IN:TRUE, PT:TimerPreset); Star : TRUE; Delta : FALSE; // 检查星形定时器是否到时 IF StarTimer.Q THEN Star : FALSE; // 阶段2星形到三角形切换延时 DeltaTimer(IN:TRUE, PT:T#500ms); // 切换延时例如500ms IF DeltaTimer.Q THEN // 阶段3三角形运行 Delta : TRUE; END_IF; END_IF; ELSE // 电机停止复位所有定时器 StarTimer(IN:FALSE); DeltaTimer(IN:FALSE); END_IF; ELSE // 存在故障强制停止 MotorRun : FALSE; Star : FALSE; Delta : FALSE; END_IF; END_FUNCTION_BLOCK注意生成的代码可能需要根据实际TIA Portal版本和PLC型号进行微调。例如定时器TON的调用语法、故障复位机制等。Claude Code生成的代码应作为初稿必须由工程师进行严谨的逻辑审查和测试。3.3 步骤三通过MCP Server“写入”项目现在假设我们已经有了一个功能完善的MCP Server它能够准确定位并修改TIA项目中的SCL源文件。我们可以在Claude Code的对话中直接调用MCP工具。用户输入我将把我的TIA Portal项目路径、PLC名称等信息提供给你。请调用write_plc_scl工具将上面生成的SCL代码写入到名为“PLC_1”的PLC中创建一个新的功能块类型为FB编号为100。使用“overwrite”模式。 项目路径是C:\MyTIAProjects\DemoPlantClaude Code的响应模拟 Claude Code会识别到可用的write_plc_scl工具并尝试调用它。调用结果会返回类似之前Server中模拟的文本告知文件路径和写入的代码内容。在实际的、功能完整的Server中这个调用会真正地在C:\MyTIAProjects\DemoPlant\Siemens\Step7\PLC_1\Program\FB100.scl路径下创建或覆盖一个SCL源文件。3.4 步骤四在TIA Portal中验证与编译打开TIA Portal加载C:\MyTIAProjects\DemoPlant项目。在项目树中找到PLC设备“PLC_1”展开“程序块”。你应该能看到新生成的“FB100”可能需要刷新或重新扫描外部源文件。双击打开FB100其内容应该就是Claude Code生成的SCL代码。关键步骤在TIA Portal中编译该块。编译器会检查语法错误、数据类型匹配、未定义的变量等。根据编译错误信息如果有返回Claude Code对话描述错误让其修正SCL代码然后再次通过MCP工具更新。4. 关键实现细节、挑战与解决方案将理想工作流落地会遇到诸多挑战。以下是几个核心问题的分析与解决思路。4.1 挑战一TIA Portal项目文件解析这是最大的技术障碍。TIA Portal项目不是简单的文本文件集合而是高度结构化、部分二进制的数据库。解决方案探索使用官方或社区库寻找是否有开源库如python-snap7的扩展、TIA-Openness的封装能读取项目信息。西门子官方提供了TIA OpennessAPI这是一个.NET库可以通过C#或Python调用以编程方式操作TIA项目。我们的MCP Server可以封装对TIA Openness的调用。中间文件策略推荐避免直接解析复杂的项目文件。MCP Server不直接修改原项目而是在项目目录外的一个临时文件夹中生成标准的SCL源文件如FB100.scl。同时生成一个TIA Openness可执行的脚本如.cs或.py该脚本的功能是“将指定SCL文件导入到指定项目的指定块中”。工程师运行这个脚本通过官方API安全地导入代码。或者MCP Server在后台调用系统命令执行这个脚本。模拟与提示在开发初期MCP Server可以完全模拟操作只输出“应该做什么”的指导文本。例如“请在TIA Portal中手动创建FB100并将以下SCL代码复制进去。”4.2 挑战二SCL到梯形图的转换本文标题聚焦“梯形图程序编写”但上述流程生成的是SCL。如何得到梯形图解决方案直接使用SCL块对于复杂的逻辑控制、计算、数据处理SCL比梯形图更高效、更清晰。生成的SCL块可以直接在项目中使用。在TIA Portal中手动转换工程师可以将SCL块的逻辑作为参考在梯形图编辑器中重新绘制。对于简单的起保停、定时器逻辑转换是直观的。开发转换工具高级可以尝试开发一个MCP工具将简单的SCL逻辑片段如IF-THEN-ELSE赋值转换为AWL指令表然后利用TIA Openness创建梯形图网络并填充指令。但这需要深入研究梯形图与AWL的映射关系实现成本极高。4.3 挑战三AI生成代码的准确性与安全性AI生成的PLC代码直接用于工业控制存在风险。必须建立的审查与测试流程代码审查工程师必须逐行审查生成的SCL代码重点关注安全逻辑急停、互锁、故障处理是否完备定时器/计数器复位逻辑是否正确预设值处理是否合理数据类型Time、Int、Real等类型的使用和转换是否正确边界条件启动、停止、复位信号的边沿检测是否必要且正确TIA Portal编译利用编译器进行第一道语法和语义检查。仿真测试务必使用TIA Portal的PLCSIM Advanced或硬件仿真器进行全面的功能测试覆盖所有正常和异常工况。版本控制将AI生成的代码和最终确认的代码都纳入Git等版本控制系统清晰记录变更。5. 生产环境考量与最佳实践如果计划在团队或生产项目中引入此工作流必须遵循以下实践以确保稳定和安全。5.1 环境隔离与备份开发环境先行所有AI生成和MCP Server操作必须在独立的开发或测试项目中进行严禁直接操作生产项目。项目备份在调用任何write类MCP工具前确保TIA Portal项目已备份。MCP Server工具的实现中应加入强提醒甚至强制要求提供备份副本路径。版本快照使用TIA Portal的“归档”功能或Git对项目进行版本管理确保任何错误修改可以快速回滚。5.2 MCP Server增强功能一个用于生产环境的MCP Server应至少包含以下工具工具名功能描述安全建议list_plcs列出项目中所有PLC设备只读操作安全list_blocks列出指定PLC中的所有程序块只读操作安全read_block_interface读取块的接口输入、输出、静态变量只读操作安全validate_scl_syntax在写入前对SCL代码进行基础语法校验本地校验安全generate_scl_from_desc核心工具将自然语言描述转为SCL可调用Claude API无文件操作安全propose_block_addition建议生成一个包含SCL代码和导入说明的离线文件包而非直接写入最安全需人工干预diff_block_content对比AI生成代码与现有代码的差异只读操作安全5.3 集成到CI/CD流水线可选对于追求自动化的团队可以考虑将自然语言需求描述作为“需求文档”存入Git。在CI流水线中一个Job调用脚本封装了Claude API和MCP Server逻辑根据需求文档生成SCL代码。另一个Job自动在PLCSIM中编译和运行基础测试用例。生成差异报告和测试报告供工程师审核。审核通过后人工或自动合并到主代码库。6. 常见问题排查在搭建和使用过程中你可能会遇到以下问题问题现象可能原因检查与解决步骤Claude Code中看不到MCP工具1. MCP Server未正确启动或配置。2. 编辑器配置未生效。1. 在终端手动运行node server.js看Server是否报错。2. 检查编辑器settings.json中MCP Server的路径和参数是否正确。3. 重启编辑器。调用MCP工具时报“连接错误”Server进程崩溃或通信协议错误。1. 查看Server进程的控制台输出是否有异常堆栈。2. 确保Server代码中正确使用了StdioServerTransport并调用了server.connect。3. 检查Node.js版本是否符合MCP SDK要求。AI生成的SCL代码在TIA中编译失败1. 语法不符合特定TIA版本。2. 使用了未定义的变量或数据类型。3. 块接口定义不完整。1. 将具体的编译错误信息反馈给Claude Code要求其修正。2. 在需求描述中明确指定TIA Portal版本和PLC型号如S7-1200 V4.4。3. 要求AI先生成完整的块接口VAR_INPUT, VAR_OUTPUT等。MCP Server无法找到TIA项目文件项目路径错误或Server进程权限不足。1. 使用绝对路径并确保路径中存在有效的.apXX项目文件。2. 在Windows上以管理员身份运行编辑器或Server可能解决权限问题但不推荐应调整文件夹权限。3. 考虑使用“中间文件策略”避免Server直接访问复杂项目目录。工作流效率感觉不高生成了代码但导入和验证步骤繁琐。1. 优化MCP Server使其能生成“一键导入”脚本。2. 将常用逻辑如电机控制、阀门控制模板化让AI基于模板生成减少审查工作量。3. 聚焦于用AI生成复杂算法、数据处理或重复性高的代码段简单逻辑手动编写可能更快。7. 扩展方向与未来展望当前实现只是一个起点你可以在此基础上探索更多有价值的方向反向工程梯形图转自然语言描述开发一个MCP工具读取现有的梯形图块通过解析AWL让Claude Code生成其对应的自然语言功能描述和注释极大提升遗留代码的可读性和维护性。代码审查助手将现有SCL或梯形图代码提交给Claude Code让其检查潜在问题如未使用的变量、死循环风险、不安全的类型转换、不符合公司编程规范的地方等。测试用例生成根据程序块接口和逻辑描述让AI自动生成在PLCSIM中使用的测试用例输入信号序列并验证输出是否符合预期。文档自动生成基于代码和注释自动生成技术文档、操作手册或IO清单。集成更多工业协议让MCP Server不仅能操作TIA项目还能通过OPC UA、S7协议等读取实时数据结合实时数据让AI进行简单的故障诊断或生产数据分析。将Claude Code与MCP结合用于PLC编程其核心价值不在于完全替代工程师而在于成为一位强大的“初级程序员”和“知识助理”。它能够快速将思路转化为代码草稿处理繁琐的语法和结构让工程师能更专注于核心控制逻辑设计、安全机制和系统集成。开始实践时请从简单的、非关键的控制逻辑入手逐步建立对AI生成代码的审查信心和优化流程最终形成人机协同的高效编程新模式。