三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

AI辅助PLC编程:Claude Code与MCP协议在西门子博途中的应用实践

AI辅助PLC编程:Claude Code与MCP协议在西门子博途中的应用实践

这次我们来看一个能显著提升PLC编程效率的技术组合:Claude Code + MCP + 西门子博途。如果你正在从事工业自动化、PLC编程,或者对如何用AI辅助生成梯形图程序感兴趣,这篇文章会直接告诉你这套方案能不能用、怎么用、以及实际效果如何。

Claude Code是Anthropic公司推出的智能编程助手,而MCP(Model Context Protocol)则是一个新兴的协议,它允许Claude Code这类AI助手安全、可控地访问外部工具、数据和系统。当我们将MCP服务器与西门子TIA Portal(博途)连接起来,目标就非常明确:让AI能够理解我们的控制需求,并直接生成或辅助编写梯形图(LAD)程序。这不再是简单的代码补全,而是迈向“自然语言描述控制逻辑,AI自动生成PLC程序”的关键一步。

对于PLC工程师来说,最核心的吸引力在于三点:第一,能否将复杂的起保停、联锁、顺控逻辑用文字描述出来就让AI实现;第二,生成的程序是否规范、可读,并且符合IEC 61131-3标准;第三,整个流程是否顺畅,是否需要复杂的配置。本文将围绕这三点,带你完成从环境搭建、MCP服务器配置、Claude Code连接,到实际生成梯形图并导入博途测试的全过程。

1. 核心能力速览

在深入细节之前,我们先通过一个表格快速了解这套方案的核心特性和要求:

能力项说明
核心功能通过自然语言或结构化描述,由AI(Claude Code)辅助生成西门子博途(TIA Portal)兼容的梯形图程序。
技术栈Claude Code (AI助手) + MCP Server (桥梁) + 西门子 TIA Portal (PLC编程环境)。
硬件门槛无特殊GPU要求。主要依赖CPU和内存。运行Claude Code需要能正常访问其服务,本地部署MCP服务器对机器性能要求极低。
启动与连接方式1. 确保Claude Code可用(通常是浏览器或IDE插件)。
2. 在本地或服务器启动自定义的MCP服务器(一个Python/Node.js进程)。
3. 在Claude Code中配置MCP服务器连接信息。
“显存”占用不涉及AI模型本地推理,无显存占用概念。主要资源消耗在Claude Code的云端服务和本地的TIA Portal软件运行上。
接口能力MCP服务器提供标准化的API接口。Claude Code通过MCP协议调用这些接口,将“生成梯形图”的请求发送到服务器,服务器再与TIA Portal或离线逻辑引擎交互。
批量任务支持。可以通过脚本批量向Claude Code发送不同设备的控制逻辑描述,自动生成多个程序块。
适合场景1.快速原型开发:用文字描述验证控制逻辑思路。
2.代码重构与标准化:将老旧或不规范的程序转换为标准梯形图。
3.辅助培训与学习:新手通过描述生成示例程序进行学习。
4.文档与程序同步:根据设计文档自动生成基础程序框架。

2. 适用场景与使用边界

这套方案并非要完全取代工程师,而是作为一个强大的“副驾驶”。它最适合以下几类场景:

  • 逻辑描述到程序块的快速转换:当你有一个清晰的逻辑描述(如“按下启动按钮I0.0,电机Q0.0运行;按下停止按钮I0.1,电机停止;需增加过载保护I0.2”),可以直接让AI生成对应的梯形图网络,省去手动拖拽指令的时间。
  • 复杂算法或数据处理程序的辅助编写:对于涉及循环、比较、计算的功能块(如流量累计、PID参数整定逻辑),用文字描述算法后,AI可以生成结构化的STL或SCL代码,再集成到梯形图中。
  • 程序模板和重复模式的生成:在多台相同设备编程时,可以快速生成基础框架,如电机控制模板、阀门控制模板、报警处理模板等。

需要明确的使用边界:

  1. 安全关键逻辑不能依赖AI:涉及安全停机、紧急切断、安全联锁等SIL或PL等级要求的逻辑,必须由专业安全工程师严格按照安全规范设计和验证。AI生成的内容仅可作为参考,绝不能直接用于最终的安全相关程序。
  2. 硬件配置与网络拓扑需人工确认:AI无法知道你的实际PLC型号、模块配置、IO地址分配和现场网络情况。这些必须由工程师在TIA Portal中正确配置。
  3. 生成代码必须经过严格验证和测试:AI可能误解描述,或生成非最优、甚至存在潜在缺陷的逻辑。所有生成的程序必须在TIA Portal中进行仿真(如PLCSim)和逻辑验证,并在实际设备上空载测试后,方可投入运行。
  4. 知识产权与合规性:确保你的使用方式符合Claude Code的服务条款,并且生成的程序用于合法的工业自动化项目。

3. 环境准备与前置条件

开始之前,请确保你的开发环境满足以下条件:

软件环境:

  • 操作系统:Windows 10/11 (64位)。这是运行西门子TIA Portal的硬性要求。
  • 西门子TIA Portal:V15及以上版本已安装并授权。这是我们的目标编程环境和验证平台。
  • Python环境:推荐Python 3.8-3.11。用于开发和运行我们的MCP服务器。需安装pip
  • 代码编辑器或IDE:Visual Studio Code (VS Code) 是首选,因为它对Claude Code插件和Python开发支持良好。
  • Claude Code访问权限:确保你拥有有效的Claude Code使用权限,并能在VS Code中或通过Web端正常使用。

网络与账户:

  • 稳定的网络连接,用于Claude Code服务通信。
  • (可选但推荐)Git,用于管理MCP服务器代码和版本控制。

概念准备:

  • 基本了解西门子PLC编程(梯形图LAD/功能块图FBD/结构化文本STL)。
  • 了解IEC 61131-3标准中的基本数据类型和程序组织单元(POU)。
  • 对HTTP API和简单的客户端-服务器通信有概念性认识。

4. 安装部署与启动方式

我们的核心是构建一个MCP服务器,作为Claude Code与TIA Portal(或一个模拟生成器)之间的桥梁。下面以创建一个简单的、能够生成梯形图XML(TIA Portal可导入的格式)的MCP服务器为例。

4.1 创建MCP服务器项目

首先,创建一个新的项目目录并初始化Python环境。

# 创建项目目录 mkdir tia-mcp-server cd tia-mcp-server # 创建虚拟环境(推荐) python -m venv venv # 激活虚拟环境 # Windows: venv\Scripts\activate # Linux/Mac: # source venv/bin/activate # 安装核心依赖:MCP协议SDK pip install mcp

4.2 编写MCP服务器主程序

创建一个名为server.py的文件,实现一个简单的MCP服务器,它提供一个名为generate_ladder_logic的工具。

# server.py import asyncio from mcp.server import Server, NotificationOptions from mcp.server.models import TextContent import mcp.server.stdio import json # 创建一个简单的梯形图生成函数 # 这里只是一个演示,实际需要生成符合TIA Portal XML Schema (`.xlsx` 内部格式) 或直接生成AWL/STL代码 def generate_ladder_from_description(description: str) -> str: """ 根据自然语言描述生成梯形图逻辑的文本表示。 在实际应用中,这里应集成更复杂的逻辑解析和代码生成引擎。 """ logic_summary = f"// 根据描述生成的逻辑摘要:\n// {description}\n\n" # 示例:简单的起保停逻辑生成 if "启动" in description and "停止" in description and "电机" in description: # 这是一个极度简化的示例,实际需要生成完整的STL或LAD XML logic_summary += """NETWORK 1: 电机起保停控制 TITLE: 主运行逻辑 // 假设: I0.0=启动, I0.1=停止, Q0.0=电机 A I0.0 // 检查启动按钮 S Q0.0 // 置位电机输出 A I0.1 // 检查停止按钮 R Q0.0 // 复位电机输出 """ else: logic_summary += f"// 已接收描述: '{description}'\n// 提示:请确保描述中包含明确的输入(如I地址)、输出(如Q地址)和逻辑关系(如与、或、非、置位、复位)。" return logic_summary async def main(): # 初始化MCP服务器 server = Server("tia-ladder-generator") # 注册一个工具(Tool),Claude Code可以调用这个工具 @server.list_tools() async def handle_list_tools(): return [ { "name": "generate_ladder_logic", "description": "根据文本描述生成西门子PLC梯形图逻辑程序。描述应包含输入输出地址和逻辑关系。", "inputSchema": { "type": "object", "properties": { "description": { "type": "string", "description": "用自然语言描述控制逻辑,例如:'当启动按钮I0.0按下时,电机Q0.0运行,直到停止按钮I0.1按下。过载信号I0.2为1时立即停止电机。'" } }, "required": ["description"] } } ] # 处理工具调用 @server.call_tool() async def handle_call_tool(name: str, arguments: dict): if name == "generate_ladder_logic": description = arguments.get("description", "") result_text = generate_ladder_from_description(description) # 返回结果给Claude Code return [ TextContent( type="text", text=result_text ) ] else: raise ValueError(f"未知工具: {name}") # 使用标准输入输出与Claude Code通信 async with mcp.server.stdio.stdio_server() as (read_stream, write_stream): await server.run(read_stream, write_stream, NotificationOptions()) if __name__ == "__main__": asyncio.run(main())

4.3 启动MCP服务器

在项目目录下,运行你的服务器:

python server.py

服务器启动后,会等待通过标准输入输出(stdio)接收来自MCP客户端的连接。它不会主动监听网络端口,这是一种安全的本地通信方式。

5. 功能测试与效果验证

现在,我们需要配置Claude Code来连接我们刚刚启动的MCP服务器,并进行功能测试。

5.1 配置Claude Code连接MCP服务器

配置方式取决于你使用Claude Code的界面。通常在Claude Code的设置或配置文件中,可以添加MCP服务器。这里以概念性配置为例:

你需要告诉Claude Code,存在一个本地的MCP服务器,其命令是启动你的server.py脚本。

// 示例配置位置:Claude Code 设置中的 MCP 服务器配置部分 { "mcpServers": { "tiaLadderGenerator": { "command": "python", "args": ["/你的绝对路径/tia-mcp-server/server.py"], "env": { "PYTHONPATH": "/你的绝对路径/tia-mcp-server" } } } }

关键点:配置中的commandargs必须能正确启动你的Python脚本。配置完成后,重启Claude Code或重新加载配置。

5.2 在Claude Code中调用工具进行测试

在Claude Code的对话界面中,你可以直接要求它使用我们注册的工具。

测试对话示例:

  • 你(用户):“请使用generate_ladder_logic工具,帮我生成一个电机起保停的梯形图程序。描述是:当常开点I0.0(启动按钮)接通时,输出线圈Q0.0(电机)得电并自锁;当常闭点I0.1(停止按钮)断开时,Q0.0失电。另外,当常闭点I0.2(过载保护)断开时,电机也应停止。”

  • Claude Code(识别到工具并调用)

    我将使用generate_ladder_logic工具来根据您的描述生成梯形图逻辑。调用工具generate_ladder_logic参数:{“description”: “当常开点I0.0(启动按钮)接通时,输出线圈Q0.0(电机)得电并自锁;当常闭点I0.1(停止按钮)断开时,Q0.0失电。另外,当常闭点I0.2(过载保护)断开时,电机也应停止。”}

  • MCP服务器返回结果(通过Claude Code显示)

    // 根据描述生成的逻辑摘要: // 当常开点I0.0(启动按钮)接通时,输出线圈Q0.0(电机)得电并自锁;当常闭点I0.1(停止按钮)断开时,Q0.0失电。另外,当常闭点I0.2(过载保护)断开时,电机也应停止。 NETWORK 1: 电机起保停控制 TITLE: 主运行逻辑 // 假设: I0.0=启动, I0.1=停止, Q0.0=电机 A I0.0 // 检查启动按钮 S Q0.0 // 置位电机输出 A I0.1 // 检查停止按钮 R Q0.0 // 复位电机输出 // 注意:当前示例生成器未完全解析过载保护I0.2的逻辑,需要更复杂的解析引擎。

5.3 验证与下一步:导入TIA Portal

目前我们的示例服务器返回的是文本化的STL指令注释。在实际生产中,MCP服务器的generate_ladder_from_description函数需要升级为一个真正的梯形图生成引擎。这个引擎可以:

  1. 解析自然语言:使用更专业的NLP模型或规则引擎,将描述解析为逻辑操作树。
  2. 生成标准代码:根据解析出的逻辑树,生成符合IEC 61131-3标准的STL(语句表)或SCL(结构化文本)代码。这些代码可以直接被TIA Portal识别。
  3. 生成TIA Portal XML:更高级的做法是直接生成TIA Portal项目文件(.apXX)中梯形图网络对应的XML结构,然后通过TIA Portal Openness API(官方自动化接口)导入项目。

一个更实用的generate_ladder_from_description函数改进思路:

def generate_ladder_from_description_v2(description: str): # 1. 调用本地或云端的专业NLP服务进行逻辑解析 # parsed_logic = call_logic_parser(description) # 示例解析结果: parsed_logic = { “outputs”: [{"name": “Motor”, “address”: “Q0.0”}], “logic”: [ {“type”: “AND”, “inputs”: [{“address”: “I0.0”, “normally_open”: True}]}, {“type”: “OR”, “inputs”: [{“address”: “I0.1”, “normally_closed”: True}, {“address”: “I0.2”, “normally_closed”: True}]} ] } # 2. 根据解析结果生成STL代码 stl_code = generate_stl_from_parsed_logic(parsed_logic) # 3. 或者,调用TIA Portal Openness API创建程序块 # create_block_via_openness(project_path, block_name, stl_code) return stl_code

6. 接口API与批量任务

我们的MCP服务器本身就是一个标准化的API接口。除了通过Claude Code交互,我们也可以将其扩展为独立的HTTP服务,供其他系统调用,实现批量任务。

6.1 扩展为HTTP MCP服务器

我们可以修改服务器,使其同时支持stdio(供Claude Code)和HTTP(供脚本调用)。这里使用mcp[cli]uvicorn等库来实现。

# 安装额外依赖 pip install “mcp[cli]” uvicorn fastapi

创建一个新的文件http_server.py

# http_server.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from .server import generate_ladder_from_description # 导入之前的函数 import asyncio from contextlib import asynccontextmanager from mcp import ClientSession, StdioServerParameters from mcp.client import stdio app = FastAPI() class GenerationRequest(BaseModel): description: str project_id: str | None = None # 可选,指定TIA项目 @app.post(“/generate”) async def generate_ladder_logic(request: GenerationRequest): “”“HTTP接口,用于批量生成任务”“” try: # 调用核心生成函数 result = generate_ladder_from_description(request.description) # 这里可以添加将结果保存到文件或数据库的逻辑 # if request.project_id: # integrate_with_tia_openness(request.project_id, result) return {“status”: “success”, “code”: result} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) # 保留原有的stdio服务器功能,供Claude Code连接 # ... (可以将之前server.py的async main逻辑封装成函数在此调用) if __name__ == “__main__”: import uvicorn uvicorn.run(app, host=“127.0.0.1”, port=8000)

6.2 批量任务处理

启动HTTP服务器后,你可以编写Python脚本进行批量生成。

# batch_generate.py import requests import json import time # 假设你的HTTP服务器运行在本地8000端口 BASE_URL = “http://127.0.0.1:8000” # 从文件读取批量描述 def read_descriptions_from_file(file_path): with open(file_path, ‘r’, encoding=‘utf-8’) as f: # 假设每行是一个描述 return [line.strip() for line in f if line.strip()] descriptions = read_descriptions_from_file(“control_logic_descriptions.txt”) for idx, desc in enumerate(descriptions): print(f“正在处理第 {idx+1} 个逻辑: {desc[:50]}...”) payload = {“description”: desc} try: response = requests.post(f“{BASE_URL}/generate”, json=payload, timeout=30) if response.status_code == 200: result = response.json() # 将生成的代码保存到文件 filename = f“generated_logic_{idx+1}.awl” with open(filename, ‘w’, encoding=‘utf-8’) as f: f.write(result.get(“code”, “”)) print(f“ 已保存到 {filename}”) else: print(f“ 请求失败: {response.status_code}, {response.text}”) except requests.exceptions.RequestException as e: print(f“ 网络错误: {e}”) time.sleep(1) # 避免请求过快 print(“批量处理完成。”)

7. 资源占用与性能观察

由于本方案的核心是Claude Code的云端推理和本地的轻量级MCP服务器/逻辑生成引擎,因此资源占用主要集中在两个方面:

  1. Claude Code服务端:其资源消耗对用户透明,取决于Anthropic的云端基础设施。通常响应速度在几秒内,与网络状况和问题复杂度相关。
  2. 本地MCP服务器与TIA Portal
    • MCP服务器(Python进程):内存占用通常很小(几十MB到百MB级别),CPU占用仅在处理请求时短暂升高。使用task managerhtop即可观察。
    • TIA Portal:这是资源消耗大户。尤其是打开大型项目或进行仿真时,可能占用数GB内存和较高的CPU。这是整个工作流中最需要关注的性能点。
    • TIA Portal Openness API:如果你实现了通过Openness API自动导入代码,该API调用会额外增加TIA Portal进程的负载,并可能因项目编译而短暂卡顿。

性能优化建议:

  • 将MCP服务器部署在与运行TIA Portal的同一台高性能工作站上,减少网络延迟。
  • 对于批量任务,合理安排请求间隔,避免对TIA Portal进行高频并发操作,可能导致其无响应。
  • 生成的代码先保存为文本文件,然后由工程师择机在TIA Portal中统一导入、编译和测试,而不是每生成一个就自动导入一次。

8. 常见问题与排查方法

在搭建和使用过程中,你可能会遇到以下问题:

问题现象可能原因排查方式解决方案
Claude Code无法识别MCP工具1. MCP服务器未启动。
2. Claude Code配置错误。
3. 命令路径不正确。
1. 检查python server.py进程是否在运行。
2. 检查Claude Code中MCP服务器配置的commandargs是否指向正确的脚本路径。
3. 查看Claude Code的错误日志或开发者控制台。
1. 确保服务器在Claude Code启动前已运行。
2. 使用绝对路径配置args
3. 重启Claude Code并重新加载配置。
调用工具后无响应或报错1. MCP服务器代码存在语法或运行时错误。
2. 工具函数handle_call_tool未正确处理请求。
3. 输入参数格式不符合schema定义。
1. 在运行server.py的控制台查看是否有Python报错信息。
2. 在handle_call_tool函数中添加print语句调试。
3. 检查Claude Code发送的参数是否包含description字段。
1. 根据控制台报错修复服务器代码。
2. 确保工具函数正确返回List[TextContent]
3. 确保请求参数是合法的JSON对象。
生成的代码无法导入TIA Portal1. 生成的代码语法不符合IEC 61131-3标准。
2. 地址格式错误(如I0.0在特定PLC中无效)。
3. 使用了TIA Portal不支持的指令。
1. 将生成代码粘贴到TIA Portal的STL编辑器中,查看编译错误。
2. 核对PLC硬件配置中的IO地址范围。
3. 查阅TIA Portal指令手册。
1. 改进MCP服务器的代码生成器,使其遵循严格的标准。
2. 在逻辑描述中明确PLC型号和地址范围,或在生成器中加入地址验证。
3. 限定生成器只使用一组经过验证的核心指令。
TIA Portal Openness API调用失败1. TIA Portal未安装或版本不匹配。
2. Openness DLL未正确注册或引用。
3. 项目文件被占用或路径无权限。
1. 检查Openness开发环境是否搭建正确。
2. 使用简单的Openness示例程序测试。
3. 检查项目文件是否被TIA Portal GUI打开。
1. 安装正确版本的TIA Portal和Openness开发包。
2. 确保Python能通过comtypespywin32正确调用COM接口。
3. 先关闭TIA Portal GUI,再通过API操作项目,或操作项目的副本。
批量处理时速度慢1. 网络延迟(如果MCP服务器在远端)。
2. TIA Portal编译每次生成的项目耗时。
3. 逻辑描述过于复杂,解析和生成耗时。
1. 使用pingtime命令测试网络。
2. 观察任务管理器中的TIA Portal进程CPU/内存占用。
3. 对单个复杂描述进行计时。
1. 将MCP服务器部署在本地。
2. 批量生成代码文件,最后统一导入和编译一次项目。
3. 优化生成器算法,或对复杂逻辑进行拆分描述。

9. 最佳实践与使用建议

为了高效、安全地使用这套AI辅助编程方案,遵循以下建议:

  1. 从简单到复杂:先用“电机起保停”、“闪烁电路”、“两地控制”等经典逻辑测试流程,确保整个链路(描述 -> AI -> MCP -> 代码)跑通,再尝试更复杂的顺控、模拟量处理逻辑。
  2. 描述标准化:给AI提供清晰、结构化、无歧义的描述。最好能形成自己的“描述模板”,例如:“当[输入条件1]与[输入条件2]同时成立时,则置位[输出1];当[输入条件3]成立时,则复位[输出1]。” 这能极大提高生成代码的准确率。
  3. 结果必须验证这是铁律。无论AI生成的代码看起来多完美,都必须经过TIA Portal的严格编译检查、PLCSim仿真测试,并在安全的环境下进行实物测试。将AI视为一个高级的“代码起草员”,你才是最终的“审核法官”。
  4. 版本控制:使用Git等工具对MCP服务器代码、生成的PLC程序块、以及对应的自然语言描述进行版本管理。这便于回溯、比较不同生成策略的效果,以及团队协作。
  5. 构建自己的逻辑库:将经过验证的、由AI生成的高质量程序块(如标准的报警处理FB、通用的PID功能块)保存到公司的全局库中。后续可以直接复用或让AI基于这些标准块进行组合生成,提高效率和质量。
  6. 关注合规与安全:明确内部规定,哪些类型的程序允许使用AI辅助生成,哪些(特别是安全相关)绝对禁止。对所有生成的代码进行来源标注。

10. 总结与下一步

Claude Code + MCP + 西门子博途的组合,为PLC编程打开了一扇新的大门。它的核心价值不在于完全自动化,而在于大幅降低从设计思路到可执行代码之间的摩擦。工程师可以更专注于逻辑设计和系统架构,将繁琐的、模式化的代码编写工作交给AI助手。

最值得尝试的第一步:不是去实现一个完美的全自动生成系统,而是先搭建起最小可行链路。就像本文所示,一个能返回文本化STL代码的MCP服务器,加上Claude Code的调用,已经能让你直观感受到“用说话来编程”的潜力。在此基础上,逐步强化自然语言解析和代码生成引擎,最终与TIA Portal Openness深度集成,实现从描述到项目文件的一键生成。

最容易踩的坑:对AI生成代码的盲目信任。切记,工业控制程序的错误可能导致严重的物理损害和安全事故。始终保持审慎,让AI辅助,而非主导。

后续扩展方向

  • 集成更多PLC品牌:将MCP服务器扩展为支持三菱、欧姆龙、汇川等品牌的代码生成。
  • 可视化逻辑确认:在生成代码后,MCP服务器可以同时生成一个简单的SVG或图片,可视化展示梯形图网络,供工程师快速确认逻辑是否正确。
  • 从图纸生成代码:结合OCR和CV技术,让MCP服务器能读取电气原理图或旧的梯形图打印稿,自动生成新的TIA Portal程序。
  • 调试与注释辅助:不仅生成代码,还能根据在线调试的变量值,用自然语言解释某一段程序正在执行什么逻辑,辅助故障排查。

这套技术栈仍处于早期,但方向已经清晰。对于积极拥抱效率工具的自动化工程师来说,现在正是开始探索和积累经验的最佳时机。建议收藏本文,从搭建第一个能返回“Hello, Ladder Logic”的MCP服务器开始你的实践。

← 返回列表