# 枢途 **Repository Path**: RabitLogic/shutu ## Basic Information - **Project Name**: 枢途 - **Description**: 让 AI 用自然语言“写”西门子 PLC 程序:基于 TIA Portal Openness 的 MCP 服务端(约 265 个工具)+ 一套现代化 WPF 上位机/HMI 框架。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-07-20 - **Last Updated**: 2026-07-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 枢途 — TIA Portal 自动化生成台(MCP + WPF) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) 基于 TIA Portal Openness API 的博途程序自动生成工具。提供两大部分: 1. **MCP 服务器 `TiaOpennessMcp`**(.NET Framework 4.8):封装 Openness,对外暴露 **265 个**工具,既供外部 AI 客户端调用,也由 WPF 操作台在本地拉起与托管。支持两种传输: - **stdio**(JSON-RPC 2.0,旧行为,供 AI 客户端直接拉起); - **HTTP/SSE**(加 `--url <地址>` 启动,例如 `http://localhost:5180`)—— 经 `GET /sse` 建立事件流、`POST /messages` 收发请求,WPF 与任意 AI 客户端都可用“访问地址”连接。 2. **WPF 主机 `TiaOpennessWpf`**(.NET 10 / Windows):使用与 `PlcHmi.Framework.UI` 一致的 Fluent 风格界面,既作为“人工操作台”驱动 MCP 服务器,也内嵌并管理该服务器(可配置其访问地址)。 ## MCP 服务器就在 WPF 项目中 `TiaOpennessMcp`(net48)是 Openness 的必然宿主(Openness 为 .NET Framework 程序集,无法直接加载进 net10 进程),因此它与 WPF 分离编译,但: - 它作为**同一解决方案**中的项目存在; - 生成时自动复制进 WPF 输出目录的 `Server\` 子目录,与 WPF 一同分发; - 由 WPF **按需拉起、配置访问地址、连接**(HTTP/SSE); - 在“设置”页可自由填写访问地址(如 `http://localhost:5180`)并选择传输方式。 > 如果你希望把服务器源码物理上移入 `TiaOpennessWpf\` 目录,告诉我即可调整项目结构。 ## 解决方案 `TiaOpenness.slnx` 包含以下可构建项目: | 项目 | 目标框架 | 作用 | |------|----------|------| | `TiaOpennessMcp` | net48 | Openness MCP 服务器(支持 stdio 与 HTTP/SSE;由 WPF 启动与配置) | | `TiaOpennessWpf` | net10.0-windows | WPF 操作台(含 `PlcHmi.Framework.UI` 同款主题资源 + 梯形图渲染器) | > 工作区中还附带了 `PlcHmi.Framework` / `PlcHmi.Framework.UI` 源码:`PlcHmi.Framework.UI` 是 WPF 真实依赖的共享 UI 库(提供统一色板/样式/主题管理器与通用控件,见 `TiaOpennessWpf.csproj` 的 ``);`PlcHmi.Framework` / `PlcHmi.Net`(PLC 通信库)由 `PlcHmi.Framework.UI` 间接依赖。命名沿用来源项目。 ## 系统要求 ### 最终用户(运行安装包) | 项 | 要求 | |---|---| | 操作系统 | Windows 10 / 11 **专业版/企业版/教育版**(家庭版不支持 Openness) | | .NET 运行时 | **无需另装**——安装包已自包含 .NET 10 Desktop Runtime;仅需 Win10 1809+ 自带的 .NET Framework 4.8 | | TIA Portal | V15 ~ V20,安装时勾选 **TIA Portal Openness** 组件 | | 用户权限 | 当前 Windows 用户需加入本地组 **Siemens TIA Openness**(应用内「设置 → 运行环境」可一键修复,需管理员权限) | | 磁盘空间 | %TEMP% 必须可写(自包含单文件首次启动时会解压原生库到 `%TEMP%\.net\`,约几 MB) | ## 快速开始(安装包用户) 1. **下载**:到 [Gitee Releases](https://gitee.com/zmx371525/shutu/releases) 下载最新版 `枢途_x.x.x_安装程序.exe`。 2. **安装**:双击运行。若 Windows 弹出 **SmartScreen** 蓝色提示"已保护你的电脑"(因安装包未做代码签名),点击 `更多信息` → `仍要运行`。 3. **首次启动**:安装完成会自动打开枢途,默认落在「变量表」页。 4. **启动 MCP 服务**:在窗口**右下角状态栏**找到「MCP 服务」区域,点击展开弹窗 → 点「启动 / 停止」开启服务(首次启动会提示加入 Siemens TIA Openness 用户组,可在「设置 → 运行环境」一键修复,需管理员权限)。 5. **连接 TIA Portal**:到「连接 / 项目」页,按引导三步走(启动 MCP → 打开项目 → 选 PLC)。 6. **开始使用**:在程序开发页(变量表、程序块、硬件等)操作 TIA Portal,或到「AI 客户端配置」页查看如何让 AI 通过 MCP 自动驱动 TIA。 > 💡 遇到问题:关于页有崩溃日志 / 数据目录入口;反馈可通过邮箱 `zmx371525@outlook.com` 或 Gitee Issue。 ### 开发者(构建源码) - 上述全部 + .NET 10 SDK + .NET Framework 4.8 Developer Pack - 已安装的 TIA Portal(Openness 目录通过环境变量 `OPENNESS_SDK_DIR` 或 `Directory.Build.props.local` 指向,默认 V18) ## 构建 需要:Windows + .NET 10 SDK + .NET Framework 4.8 targeting pack + 已安装的 TIA Portal V18(Openness 目录为 `C:\Program Files\Siemens\Automation\Portal V18\PublicAPI\V18`)。 ```powershell dotnet build TiaOpenness.slnx -c Release ``` 生成产物: - `TiaOpennessWpf\bin\Release\net10.0-windows\TiaOpennessWpf.exe` —— WPF 操作台 - `TiaOpennessWpf\bin\Release\net10.0-windows\Server\TiaOpennessMcp.exe` —— 自动复制进来的 MCP 服务器及其 Openness 依赖 > 构建时会出现 `NU1702` 警告:WPF(net10)引用了 net48 的 `TiaOpennessMcp` 项目,这是预期的(MCP 服务器本就需要在 net48 上运行以加载 Openness)。只要最终提示 `0 个错误` 即为成功。 ## 运行(WPF 操作台) 直接运行 `TiaOpennessWpf.exe`。界面左侧为导航,右侧为对应功能页: - **连接 / 项目**:打开/新建项目、连接运行中的 TIA Portal 实例、列出并选择 PLC、按 MLFB 订货号添加 PLC CPU(或在「硬件目录」页按 TypeIdentifier 添加)。 - **硬件目录**:按关键字搜索 TIA 硬件目录(返回 TypeIdentifier 与订货号),复制到项目、删除设备、向机架插入模块、创建/列出子网、设置接口主/从站模式。 - **数据类型 (UDT)**:用完整 SCL `TYPE` 源码创建用户数据类型,并支持列出/删除。 - **PLC 变量**:创建变量表,表格化批量录入变量(名称/类型/地址/初始值/注释)并创建;也支持 PLC 常量、删除变量表。 - **程序块**:创建 FB/FC/OB(贴入完整 SCL 源码)或全局 DB(成员表格);也支持 LAD 梯形图块、自定义 Openness(SimaticML) XML 导入、删除块、块组创建/删除/列出、批量导出全部块、从文件导入块。 - **程序生成**:把多张变量表、多个程序块(FB/FC/OB/DB/导入 XML)组织成一个**离线工程**,保存为 `.tiaopen.json` 文件;连接 TIA Portal 后一键按序生成全部内容(适合批量搭建可复用的标准程序模板)。 - **代码预览 / 梯形图**:列出当前 PLC 程序块,导出并预览其源码;SCL 块显示 SCL 源码,LAD/FBD 块在下方**渲染成梯形图**(左母线 + 触点/线圈/方框 + 连线,含并行分支)。 - **编译 / 保存**:编译整个软件或指定块,保存项目,关闭并断开。 - **下载与在线**:获取 PLC 在线状态、下载/上传程序、比较离线在线差异。 - **交叉引用**:分析整个 PLC 软件(或指定块)的对象引用关系——谁引用了某变量/块、在哪里引用(需项目已编译,手册 5.11.2.8)。 - **工艺对象**:列出/创建运动控制等工艺对象,并为已有对象设置参数(手册 5.11.4)。 - **HMI 画面**:列出/导出 HMI(WinCC)画面,并可创建空白画面与画面文件夹(更深入的 HMI 编辑)。 - **协作与集成**:UMAC 用户权限、多用户项目、版本控制接口(VCI,含导出/导入同步)、OPC UA 配置、SiVArc 画面自动生成。 - **设置**:配置 MCP 服务器的**访问地址**与传输方式(HTTP/SSE 或 stdio),可选“本机自动启动”;修改后点“应用并连接”。 - **运行日志**:实时显示操作日志与服务器日志(`Server\TiaOpennessMcp.log`)。 顶部“🌓 切换主题”可在浅色/深色间切换(偏好保存在 `%LOCALAPPDATA%\TiaOpennessWpf`)。 ### 前置权限 当前 Windows 用户需加入本地组 **Siemens TIA Openness**(控制面板 → 计算机管理 → 本地用户和组 → 组),否则 Openness 无法启动 TIA Portal。若未加入,可在 WPF 状态栏左侧点“运行环境”弹窗中的“修复用户组”(需管理员权限)。 ## 作为 MCP 服务器对接 AI `TiaOpennessMcp` 两种接线方式: - **stdio(AI 直接拉起)**:配置示例见 `mcp-config-example.json`: ```json { "mcpServers": { "tia-openness": { "command": "C:\\path\\to\\TiaOpennessMcp.exe" } } } ``` - **HTTP/SSE(可远程/被 WPF 统一托管)**:用 `--url` 启动后,AI 客户端通过 SSE 连接: ```json { "mcpServers": { "tia-openness": { "url": "http://localhost:5180/sse" } } } ``` > 服务器基于 `TcpListener` 实现(不经 http.sys),普通用户权限即可监听 `localhost`,无需 `netsh http add urlacl`。 ### 工具清单(共 265 个) **一、项目与设备** `tia_open_project` / `tia_create_project` / `tia_attach` / `tia_list_devices` / `tia_refresh_devices` / `tia_add_plc` / `tia_delete_device` / `tia_search_hardware` / `tia_add_device` / `tia_select_plc` **二、PLC 变量与块(核心)** `tia_create_tag_table` / `tia_delete_tag_table` / `tia_create_tag` / `tia_create_plc_constant` / `tia_create_data_block` / `tia_create_function_block` / `tia_create_function` / `tia_create_organization_block` / `tia_create_lad_block` / `tia_create_udt` / `tia_list_udts` / `tia_delete_udt` / `tia_delete_block` / `tia_create_block_group` / `tia_delete_block_group` / `tia_list_block_groups` **三、导入 / 导出 / 编译** `tia_import_block_xml` / `tia_import_block_from_file` / `tia_list_blocks` / `tia_export_block` / `tia_export_block_to_file` / `tia_export_all_blocks` / `tia_compile` **四、下载与在线** `tia_download` / `tia_upload` / `tia_online_state` / `tia_compare_online` / `tia_cross_references` **五、硬件与网络** `tia_plug_module` / `tia_create_subnet` / `tia_list_subnets` / `tia_set_interface_mode` **六、库 / 主副本** `tia_open_library` / `tia_close_library` / `tia_list_master_copies` / `tia_create_from_master_copy` **七、块保护 / 校验和** `tia_protect_block` / `tia_unprotect_block` / `tia_get_checksum` **八、工艺对象 / Motion Control** `tia_list_technology_objects` / `tia_create_technology_object` / `tia_set_technology_parameter` **九、HMI 画面** `tia_list_hmi_screens` / `tia_export_hmi_screen` / `tia_create_hmi_screen`(创建空白画面) / `tia_create_hmi_folder`(创建画面文件夹) **十、UMAC / VCI / 多用户** `tia_list_umac` / `tia_list_vci_workspaces` / `tia_vci_sync`(与版本控制系统同步:导出/导入) / `tia_list_multiuser_projects` **十一、OPC UA / SiVArc(探测式)** `tia_get_opcua_config` / `tia_get_sivarc_info` **十二、会话** `tia_save` / `tia_close` ## 说明 - **代码预览 / 梯形图**:`tia_export_block` 通过 Openness 把块导出为 XML 并回传。SCL 块抽取 `` 显示源码;LAD/FBD 块解析 `/` 的 `Parts` 与 `Wires`,由 `LadderRenderer` 做分层布局后画成梯形图。该梯形图为“尽力而为”的预览渲染,复杂嵌套分支的视觉精度可能有限。 - **SCL 逻辑**:服务器将你提供的完整 SCL 源码写入 `.scl` 外部源,再经 `GenerateBlocksFromSource` 编译为块(接口由 `FUNCTION_BLOCK`/`FUNCTION`/`ORGANIZATION_BLOCK` 里的 `VAR` 段自动推导),对 V15–V18 通用。UDT 同样走外部源路径(`TYPE ... END_TYPE`)。若你的版本对结构有特殊要求,可用 `tia_import_block_xml` 直接传 XML(已作为兜底工具)。 - **LAD 块**:`tia_create_lad_block` 按官方手册 FlgNet v4 架构,由“网络数组”描述逻辑(每网络是一串从左母线向右串联的元件:contact/coil/move/box/call,以及 parallel 并联支路),生成 SimaticML 后导入。 - **添加 PLC** 的 `mlfb` 需按实际硬件/固件版本填写(示例 `OrderNumber:6ES7 511-1AK02-0AB0/V2.9` 仅供参考);也可在「硬件目录」页搜索后直接按 `TypeIdentifier` 添加,更不易出错。 - **交叉引用** 依赖项目已编译(先 `tia_compile`),未编译时可能返回空。 - 服务器日志写到其目录下的 `TiaOpennessMcp.log`,排错时查看。 - **切换 TIA Portal 版本**:Openness V15~V20 均基于 .NET Framework 4.x,`TiaOpennessMcp` 始终用 net48,**无需改 TargetFramework**。只需在 `Directory.Build.props.local`(已 gitignore)或环境变量 `OPENNESS_SDK_DIR` 指向目标版本的 `PublicAPI\VV` 目录即可(见 `Directory.Build.props` 的三级回退说明)。