Repository navigation
用 MCP 驱动 S7-200 SMART(STEP 7-Micro/WIN SMART V3):从 AWL 源文件到"工程里可用且验证过"的一条龙。
这软件没有 Openness——没有 COM、没有命令行,内置 JSON-RPC 只管 PROFINET,内置 AI 只连云端。所以本项目走的是进程注入:启一个独立的 MicroWIN 实例,注入自研 DLL,在主线程里直接调用软件自己的内部 C++ 导出函数(PRJ_ImportPouFile、POU_ExportPOU、POU_IsValidNet、GLBVAR_GetRow 等)。这些函数的签名是逆向出来的。
主要能力
smart_deploy—— 90% 的活一个工具搞定:设符号 → 导程序 → 编译 → 五关验证 → 保存,一次注入干完smart_overview—— 一屏看清工程结构:有哪些块、各干什么、谁调用谁、死代码、悬空引用smart_export_all—— 整个工程连同符号表导出,目录自包含,可当备份/迁移/进 gitsmart_validate_project—— 问引擎要真值(POU_IsValidNet),权威判据smart_check_stl—— 离线秒级预检,不启动软件- 另有离线工程解析(V2
.smart)、在线通讯、UI 自动化等,共 25 个工具
为什么是"五关验证"
软件的 COMPILE ret=0 不能当通过判据。 无效程序段会被标红并排除在编译之外,其余照常编译 → 返回成功。据此报"已验证"会骗人(真踩过,交付过一份满屏标红的程序)。
| 关 | 干什么 |
|---|---|
| 1 静态预检 | 离线秒级,挡明显问题 |
| 2 导入+编译 | 抓语法与交叉引用错误 |
| 3 引擎真值 | POU_IsValidNet 逐网络问软件本人 ← 权威 |
| 4 往返导出 | 逐条核对指令流与网络数,抓静默丢弃 |
| 5 落盘校验 | 比对文件指纹,证明真写进磁盘了 |
第 5 关补的是另一个洞:前四关全在同一个内存实例里问软件自己,软件说"存好了"不等于文件变了。实测过 SAVE 返回 ret=0、却把内容写进同名的 .smart(V2)、原 .smartV3 字节不变——四关全绿但工程是空的。
示例工程
examples/demo_station/:双工位自动上料·加工·出料站,从空白模板从零生成、五关验证过。
18 块 / 231 网络 / 635 条指令 / 158 种指令助记符 / 30 个 I/O 符号,SCR 顺序控制 7 步做骨架,可直接抄改。
examples/instruction_probe/:问软件"这条指令你到底认不认"的可复跑探针。
几条实测踩出来的坑(详见 README)
- S7-200 SMART 只有 LAD/FBD/STL,没有 SCL;而且语言是整个工程的一个设置,不是每个块各自的属性(
PRJ_前缀不是POU_)——所以 AWL 导入后显示成梯形图很正常 - 没有
NETR/NETW(那是 S7-200 的 PPI 指令),以太网 S7 通信用GET/PUT - 落盘一律
SAVEAS,别用SAVE - 导入 OB1 会替换整个程序集,主程序必须排最前
- 未定义的符号名不报编译错,而是让整个网络变成无效程序段
- 从工程导出的 AWL 用符号名不是绝对地址,导出件依赖那份符号表
安装
pip install -r requirements.txt
python native/bootstrap/build.py # 编译注入 DLL(需 VS Build Tools)
claude mcp add smart200 -s user -- python <仓库路径>/run.py挂好之后先跑 smart_doctor,它会一次说清缺什么、怎么补。仓库放哪个盘都行,MicroWIN 位置自动探测。
测试
6 套测试合计 113 项,离线部分 clone 下来就能跑。每套都含反向哨兵(哨兵若 PASS 就说明测试本身坏了),关键修复还做过故障注入验证。
已知边界
- 下载到 PLC 未打通;在线通讯(snap7)代码就绪但未经真机验证
- 切换编程语言没打通(
PRJ_SetLang返回 0 但不生效)——在软件界面上切是一秒钟的事 - 不还原逐网络 LAD/STL 图形布局
- V3
.smartV3离线不可读(加密),但引擎注入可处理 V3 工程 - UI 层依赖简体中文界面 + V3.2
环境
Windows + STEP 7-Micro/WIN SMART V3.2 + Python 3.9+ + VS Build Tools(编译注入 DLL 用)