Skip to main content
Glama
apexsotjo-blip

RemoteConnect MCP Server

RemoteConnect MCP Server

一个用于 Schneider Electric RemoteConnect 及其 SCADAPack x70 UnitySoControl 逻辑编辑器的 MCP 服务器。它可以发现配对的 .PRJ/.RCZ/.STU/.STA 文件,并让 AI 代理安全地检查、编辑、重建和保存 IEC 逻辑。

本项目受 tiaportal-mcp 启发,该库用于 Siemens TIA Portal。TIA Portal 通过 Openness API 开放接口,而 Control Expert 则暴露 Unity Developer's Edition (UDE) COM 自动化服务PSBroker.PServerBroker)——本服务器使用 pywin32 驱动它,并通过 stdio 将其暴露为 MCP 工具。

AI agent ──MCP/stdio──> remoteconnect-mcp ──COM/UDE──> UnitySoControl

AI 可以做什么

  • 项目:为硬件目录中的任意 CPU(M340:**、M580、Premium、Quantum……)从零创建新工程,打开/保存 .STU/ST,导入/导出 .mars 数据。

  • 浏览:查看任务、Sections、变量、DFB工程/DDT类型、CPU/硬件信息、构建状态。

  • 编程:在 ST、LD、FBD、SFC、IL 中创建/读取/删除程序段;通过导入 Control Expert XML 写入逻辑(AI 先读取一次现有段的 XML 并参考其 schema,已验证对五种语言均可往返转换)。

  • 硬件:遍歷完整的总线 → 分站 → 机架 → 模块 拓扑;按目录部件号 添加/删除 IO 模块;更换 CPU。

  • Modbus / DTM(已在 M580 实测):地浏览 DTM 拓扑,添加从站 DTM(add_modbus("Modbus Device", ...,parent= ),设置设备 IP 地址,读取扫描状态(get_dtm_control_parameters),并通过 get_master_dtm_dataset 等工具 VIDM,添加 Modbus MP 请求(读写地址 + 长度)。内置编号规则的 ManagedModusRequest 模板;写入的扫描行会生成 built_ok,并在扫描器配置中显示为 ModbusScanLine

  • 网络(Premium/Quantum):创建逻辑以太网网络并设置其 IP 服务配置。

  • 变量:列表、创建、更新、删除全局变量,包括类型、注释、地址(%MM 等)、初始值。

  • 构建:分析并构建工程,输出最终构建状态。

  • 界面:弹出 Control Expert 窗口供人工查看或接管,并可实时打开动画表编辑器(open_animation_table)来动态显示 AI 操控测试值。

  • 在线(可选):连接 PLC/仿真器、下载/上传、运行/停止。

  • 实时值(可选):通过 Modbus TCPcontactread_tags/write_tags)读写运行中的 PLC/模拟器数据。由于 UDT/COM 没有实时标签访问,这是与运行控制器进行测试的通道。使用已定位的 %M/%MW 变量,并将未定位的 DFB 内部数据覆盖到 %MM 命中名称。

  • 安全:明确. ... (continue)

Let's correct. I must not let mistakes get in. Let's rewrite# RemoteConnect MCP Server

一个用于 Schneider Electric RemoteConnect 及其 SCADAPack x70 UnitySoControl 逻辑编辑器的 MCP 服务器。它可以发现配对的 .PRJ/.RCZ/.STU/.STA 文件,并让 AI 代理安全地检查、编辑、重建和保存 IEC 逻辑。

本项目的灵感来源于 tiaportal-mcp(用于 Siemens TIA Portal)。TIA Portal 通过 Openness API 暴露接口,而 Control Expert 则暴露 Unity Developer's Edition (UDE) COM 自动化服务器PSBroker.PServerBroker)——本服务器通过 pywin32 驱动它,并将它作为 MCP 工具在 stdio 上暴露。

AI agent ──MCP/stdio──> remoteconnect-mcp ──COM/UDE──> UnitySoControl

Related MCP server: control-expert-mcp

AI 可以做什么

  • 项目:为硬件目录中的任意 CPU(M340、M580、Premium、Quantum……)从零创建项目,打开/保存 .stu/.sta,导入/导出 .xef/.zef

  • 浏览:任务、程序段、变量、DFB/DDT 类型、CPU/硬件信息、构建状态

  • 编程:在 ST、LD、FBD、SFC、IL 中创建/读取/删除程序段;通过导入 Control Expert XML 编写逻辑(AI 会读取一次现有段的 XML 并按照它的 schema 来写——已验证五种语言均可往返转换)

  • 硬件:遍历完整的总线 → 分站 → 机架 → 模块拓扑;按目录部件号 添加/移除 IO 模块;更换 CPU

  • Modbus / DTMs(已在 M580 上实测):浏览 DTM 拓扑,添加从站 DTM(add_dtm("Modbus Device", ..., parent_dtm="BMEP58_ECPU_EXT")——协议 ID 是 Modbus,会自动尝试),设置设备 IP 地址,读取扫描器状态(get_dtm_control_parameters),并通过 get_master_dtm_dataset / set_master_dtm_dataset 编辑主站 DTM 数据集来添加 Modbus 扫描请求(读/写地址加上大小);工具说明中构建了遵循编号规则的 ManagedModbusRequest 模板;写入的扫描行会构建 built_ok,并在扫描器配置中显示为 ModbusScanLine

  • 网络(Premium/Quantum):创建逻辑以太网网络并设置其 IP 服务配置

  • 变量:列出/创建/更新/删除全局变量,包括类型、注释、地址(%MW...)、初始值

  • 构建:分析并构建项目,获取结果

  • 界面:弹出 Control Expert 窗口供人工查看或接管;同时打开动画表编辑器(open_animation_table),以便在 AI 驱动测试时现场观察值动画

  • 在线(可选):连接 PLC/模拟器,下载/上传,运行/停止

  • 实时值(可选):通过 Modbus-TCPmodbus_connectread_tags/write_tags)读写运行中的 PLC/模拟器数据——由于 UDE/COM API 不能访问实时标签,这个通道被用于与运行中的控制器测试逻辑通道(使用已定位的 %M/%MW 标签;先将未定位的 DFB 内部变量镜像到 %MW

环境要求

  • 装有并授权 EcoStruxure Control Expert(或 Unity Pro)的 Windows 中——目前已在 Control Expert 14.0 上验证,但任何能注册 PSBroker.PServerBroker.1 的版本应该都能工作(UDE 自动化服务器随 Control Expert 本身提供;单独的 UDE 包只用于文档)

  • Python 3.10+,并同步安装 pywin32

  • 服务器必须与 Control Expert 运行在同一台机器上(DCOM 远程展开是可能的,但此处未配置)

安装

cd remoteconnect-mcp
python -m venv .venv
.venv\Scripts\pip install -e .

连接 AI 客户端

该服务器通过 stdio 提供 MCP 协议。请将客户端指向 venv 的 Python:

RealConnect / SCADAPack x70

RemoteConnect 将 IEC 逻辑存储在其 .PRJ 逻辑文件旁边的 .STU/.STA 文件中,同级的还有一个可选 .RCZ 配置文件。在启动 MCP 服务器之前,设置 OEM 产品上下文,这样 broker 启动时就是 UnitySoControl,而不是标准 Control Expert:

$env:CE_MCP_XPDF_CONTEXT = "C:\ProgramData\Schneider Electric\CommonControlExpert\16.2\Xpdf\SCBForSCADAPack.xpdf"

用文件包中的任意一个成员调用 inspect_remoteconnect_project,就可以找到 paired 文件,然后调用 open_remoteconnect_logic 打开该逻辑工程。.PRJ 检查器是只读的,并且故意不去反序列化或重写ره不明确的 DTM 工程数据。

Claude Desktop

%APPDATA%\Claude\claude_desktop_config.json(参见 samples/claude_desktop_config.json):

{
  "mcpServers": {
    "control-expert": {
      "command": "C:\\path\\to\\control-expert-mcp\\.venv\\Scripts\\python.exe",
      "args": ["-m", "control_expert_mcp"]
    }
  }
}

Claude Code

claude mcp add control-expert -- C:\path\to\control-expert-mcp\.venv\Scripts\python.exe -m control_expert_mcp

VS Code(GitHub Copilot 代理模式)

.vscode/mcp.json(参见 samples/vscode-mcp.json):

{
  "servers": {
    "control-expert": {
      "type": "stdio",
      "command": "C:\\path\\to\\control-expert-mcp\\.venv\\Scripts\\python.exe",
      "args": ["-m", "control_expert_mcp"]
    }
  }
}

工具

工具

用途

get_status

服务器版本、打开的项目、CPU、构建状态

inspect_remoteconnect_project

对配对的 RemoteConnect .PRJ/.RCZ/.STU/.STA 文件进行只读发现和汇总

inventory_remoteconnect_configuration

只读的 FDT/DTM 拓扑与配置记录清单;绝不反序列化不透明的厂商载荷

read_remoteconnect_feedback

将 Object Bulk Edit 日志解析为逐对象的变更、警告、错误和 ok 结果

inspect_remoteconnect_bulk_edit_workbook

读取 RemoteConnect 原生 .xls 工作表、稳定的字段名、元数据和行

create_remoteconnect_bulk_edit_copy

对新的 .xls 副本应用逐行精确的类型化补丁,并以结构化方式重新打开它

open_remoteconnect_logic

使用配置的 OEM 上下文打开一个 bundle 中配对的 UnitySoControl 逻辑文件

build_remoteconnect_logic_copy

添加变量/ST、执行完整重建,并仅将干净结果保存到新的 .STU 副本

open_project

打开 .stu / .sta / .xef / .zef 文件

new_project

为 CPU 创建项目(例如 BMX P34 2020 + 02.70

save_project / close_project

持久化 / 关闭(close 会丢弃更改,除非 save=true

build_project / analyze_project

构建或分析;返回构建结果状态

get_project_structure

任务、段(含语言)、事件、fct 模块

list_variables

具有类型/注释/地址/初始值的变量

create_var / update_variable / delete_variable

变量编辑

read_section

以 Control Expert XML 形式返回段逻辑

write_language_logic

以纯 IEC 文本形式写入 ST 逻辑(无 XML)——创建或替换一段,并可内联声明变量

get_language_reference

ST/LD/FBD/SFC/IL 的编写指南和已验证示例——AI 客户端编写图形逻辑所需的 exchange-XML 结构规则(FBD 引脚几何规则、LD 线/单元格模型、SFC 图布局)

validate_xml

在导入/构建前用已安装的 SrcXmlSchema XSD 对候选 XML 进行预验证——即时返回结构性错误和合法取值集合

place_fb_in_ladder

无需模板即可将任意项目 DFB 放入梯形图——读取 DFB 接口后自动生成正确的(CE 自有)引脚几何结构,然后绑定终端引脚

use_fb_in_ladder

克隆 GUI 编写的 LD 内块模板,并重新绑定实例与变量(作为基本 EFB/对 GUI几何有精确要求的回退方案)

create_section / delete_section

段管理(ST/LD/FBD/SFC/IL)

create_task

添加 MAST/FAST/AUX/SAFE 任务

import_xml

主要写入路径 —导入段逻辑、变量、DFB/DDT 类型、配置或整个工程的交换文件(内联 XML 或文件)

export_xml

以 XML 导出变量 / 程序 / 配置 / 单个 DFB / 单个段

export_project

将完整应用程序导出为 .xef / .zef

list_data_types

DFB + DDT 类型

get_hardware

CPU + 总线 → 站 → 机架 → 模块树

add_io_module / remove_io_module

通过部件号 + 目录版本(如 BM_P2)添加/移除 LED... 例 BMX DDI 1602 + 02.00

add_drop / add_rack

构建远程站/机架(例如在 M580 RIO 总线上添加 X80 EIO 站 + BME_XBP 1200 机架)

change_cpu

更换 CPU 型号

list_animation_tables / create_animation_table / delete_animation_table

监视/动画表(接受 Pump1.SpeedSFC_Demo.S_Init.x 等层级路径),用于在线监测/写入值

list_dtms

DTM 浏览器中的拓扑,包括名称、类型、地址

add_dtm / delete_dtm

添加通讯 DTM 或从站设备(例如 M580 CPU DTM 下的 Modbus Device

set_dtm_address

设置从站的 IP / 总线内地址(+ 网关/子网——解决 “IP address and Gateway address are not in the same domain” 构建警告)

configure_cpu_ethernet

M580 CPU 板上以太网: IP/子网/网关 + security 页面服务(tftp/eip/dhcp_bootp/ftp/web/snmp)。启用 tftp+eip+dhcp_bootp 可解除 remote-EIO CRA 构建错误

get_dtm_control_parameters / set_dtm_control_parameters

Modbus TCP I/O 扫描器配置 XML(CetControlParameter* schema): IP、单元 id、超时、ModbusTcpRequest 扫描线

get_dtm_dataset / set_dtm_dataset

从设备 DTM 自己的数据集(身份+总线地址)

get_master_dtm_dataset / set_master_dtm_dataset

主/CPU DTM 数据集(通过 ZEF 往返)——在 <SlaveDevices>/<ManagedModbusRequestList> 中保存 Modbus 扫描行;写入一个 ManagedModbusTcpRequest 节点即可添加请求

list_networks / add_network / set_network_ip

Premium / Quantum 的逻辑网络

show_ui

使 Control Expert 窗口可见(默认只读,可边跟随操作 / 在客户保留写入权限时打开编辑器)

open_animation_table

在实时 CE 窗口中打开动画表的编辑器,以便在测试期间观察视觉变化

plc_*(可选)

在线:设置连接 / 断开连接 / 状态 / 传输 / 运行 / 停止

modbus_connect / modbus_disconnect / modbus_status(可选)

打开或关闭到 CPU/仿真器服务器的 Modbus TCP 连接(仿真器为 127.0.0.1:502),以获取实时值

`read_tags/write_tags`(可选加入)

从/写即时变量标记值(%M/%MW),按名称或地址使用(%MW),例如 %MW2:REAL;这是唯一的实时读/写路径(COM API 没有)

AI 如何编写逻辑

程序段以 Control Expert XML 形式进行交换。一个 ST 段如下所示:

<STExchangeFile>
  <fileHeader company="Schneider Automation" product="Control Expert V14.0 - 190112"
              dateTime="date_and_time#2026-6-11-1:0:0" content="Structured source file"
              DTDVersion="41"></fileHeader>
  <contentHeader name="Project" version="0.0.000"></contentHeader>
  <program>
    <identProgram name="Logic01" type="section" task="MAST"></identProgram>
    <STSource>
IF StartButton AND NOT StopButton THEN
    MotorRun := TRUE;
ELSE
    MotorRun := FALSE;
END_IF;
    </STSource>
  </program>
</STExchangeFile>

import_xml(kind="section", xml_content=...) 在段不存在时创建该段,在冲突时删除并替换该段。代理应首先声明被引用的变量(create_variable),或包含一个 <dataBlock>,然后调用 build_project 进行验证。

在线工具(真实 PLC / 模拟器)—— 默认禁用

会触及控制器的工具(plc_connectplc_transferplc_command 等)默认不会注册,除非你设置环境变量:

CE_MCP_ENABLE_ONLINE=1

启动/停止 PLC 或下载应用工程都会影响物理过程。因此这些功能只能,请在测试台架或模拟器上启用,并始终留有人在回路中监督。

模拟器调试(已端到端验证):先启动 PLC 模拟器 —— 通过 start_simulator,或使用 Control Expert 安装目录中的 PLC_Simulator\sim.exe(它驻留在系统托盘区)—— 然后依次 plc_setup_connection("simulator", "127.0.0.1")plc_connect("simulator")plc_transfer("pc_to_plc")plc_command("run")。工程在下载前必须能干净构建(built_ok)。plc_state 会报告连接状态、运行/停止状态,以及 PC 与 PLC 是否一致。

已知限制: 一个刚启动、尚未加载任何站点plc_state = no_conf)的模拟器,会以 “Family check failed” 拒绝 plc_transfer——API 下载(不同于 Control Expert GUI 的行为)要求模拟器里已有一个与设备匹配系列的站点。请先在 Control Expert GUI 中手动传输任意工程一次(PLC → Simulation → Connect → Transfer)完成默认初始化;已加载的站点在 sim.exe 运行期间一直保留,之后所有 API 下载都能正常工作(但传输前要先停止 PLC——向正在运行的 PLC 传输会失败)。

通过 Modbus TCP 读取实时值(已端到端验证)

UDE/COM 自动化 API 访问的是 工程数据库——它没有实时标记值的读/写能力(动画表只能在 GUI 里显示;IVariable 只暴露离线初始值)。实时值改由 CPU 的 Modbus TCP 服务器 暴露——这正是 SCADA/Vijeo 和 Vijeo 所使用的同一通道:

modbus_connect(host="127.0.0.1")          # the sim's Modbus server; or a real CPU IP, port 502
read_tags("EMFM1FLOW, RESIDUAL2CLTHSP, %MW0, %MW2:REAL")
write_tags({"RESIDUAL2CLTHSP": 4.0, "%MX100.0": true})
  • 标记既可是全局变量名称(地址和 IEC 类型从工程中解析得到),也可是带可选 :TYPE 的显式地址(如 %MW86, %MW2:REAL%MW70:UDINT%M3%MW10.2 位)。解码由数据类型驱动(INT/UINT、DINT/UDINT、REAL、BOOL,支持线圈 %M 或字位 %MW.x)。

  • 只有已定位(LOCATED)的 %M/%MW 标记点才可访问。 未定位的 DFB 内部变量(例如 Pump1.Running)必须先在程序中镜像 / 映射到 %MW/%M(参见 test_logic_live 提示词)。

  • 32 位 REAL/DINT 默认采用 Schneider 低字在前(low-word-first) 的顺序;如果某个服务器不同,请传 word_order="high_first"

  • Control Expert 模拟器会在 127.0.0.1:502 上开放一个 Modbus 服务,因此整个读/写测试循环都可以针对于模拟器运行,无需物理硬件。

提示词(引导式工作流)

服务器自带了 MCP 提示词src/control_expert_mcp/prompts.py)—— 即是可复用的“配方”,把经过验证的流程 以及其中不易察觉的坑 固化下来,这样客户端不用再去试错重复踩。在 Claude Code 中它们会成为 /mcp__control-expert__<name> 斜杠命令;其他 MCP 客户端则会在“提示词选择器”中列出它们:

提示词

它引导你做的工作

commission_simulator

构建 → 启动模拟器 → 连接 → 传输 → 运行;包含 手动首次传输凭借助 “Family check failed” 的单次初始化

test_logic_live

针对某个 DFB 实例的 Modbus 测试循环;包括 ** 将未定位的内部变量镜像到 %MW/%M ** 以及字序(word-order)的注意事项。

author_logic

走通 get_language_reference → 写入/导入 → build_project →(根据输出逆向修复)的循环,按语言区分。

scaffold_project

new_project(精确 CPU 型号 + 版本)→ 机架/电源/IO → 构建 → 保存。

add_modbus_device

在 M580 CPU 下添加 Modbus-TCP 从站 DTM,并配置一条扫描行。

扩展服务器

每当你新增一个工具或能力时,同时请在 prompts.py 中新增(或扩展现有)一个 MCP 提示词,引导使用者如何调用它。这是项目的一条约定,而不是事后的想法:一个好提示词,能把一个小时期的尝试与试错,变成一条斜杠命令。

请为任何 客户端无法从工具描述里直接看出 的事情编写提示词——比如环境变量标志(CE_MCP_ENABLE_ONLINE)、手工 GUI 步骤(模拟内部的一次初始化)、顺序上的强制要求(如:传输前先停止 PLC)、或地址规则(只有已定位的模件可访问、REAL 是低字在前)。基本准则:

  • 每个新工作流 → 配一个提示词;每个新工具 → 至少在一个相关提示词中提一下。

  • 把坑点显式写进提示词中(就是你自己搭建时犯过时间付出的地方)。

  • 严格复现已验证的顺序(工具名 + 参数形式),并按名称引用相关提示词。

  • 保持服务端 instructions 字符串中的总方向说明短小精悍;把一步一步的操作“配方”放到提示词里。

故障排查

  • new_projectCatalog object not found —— CPU 的型号和版本必须与你的 Control Expert 版本自身的硬件目录完全匹配(注意空格:比如 BMX P34 2020,固件需写成 02.70)。

  • add_io_module 报 “application object reference is not found in the catalog” —— 模块也同理:必须写全目录版本(大多数 M340 IO 模块用 02.00,机架/电源模块用 01.00)。

  • new_project 对某 CPU 系列只报“Exception occurred —— 通常是你的 Control Expert 许可证或 DTM 库根本不带这个平台。该错误信息没有任何描述;只能在 Control Expert GUI 里测试同款 CPU 以确认。

  • add_dtm 显示 “protocol Id parameter is empty or invalid” / “Impossible to create a new DTM object” —— 从站 DTM 需要把 FDT 的协议名填截至 protocol_id(通用 Modbus TCP 设备用 Modbus;当为空时服务端会自动补试 ModbusEtherNet/IP),而且 device_type_name 必须与 DTM 目录中的名字一字不差(试 Modbus Device)。用 tools/list_dtm_catalog.py 列出目录名字。

  • set_master_dtm_dataset 让服务端直接崩溃(RPC failed) —— 绝大多数是请求 XML 结构太畸形;特别是 requestUniqueID 必须是新的 GUID,不能是一个整数。严格照工具说明中已验证过的模板写。

  • “Write access mode is already reserved by another client”” —— 有 Control Expert(GUI 端)或其他控件客户端以写入方式打开工程。先在那边关掉。服务器设计上一个会话占用一个写权限。

  • 前提下创建 Broker 失败 —— 通常是没有装 Control Expert,或者其 COM 注册损坏(重装/修复安装后可重新注册)。

  • 首次调用会慢 —— open_project/new_project 会拉起 Unity 服务进程;大工程需要几十秒。在客户端中配一个足够长的工具超时。

  • Invalid file 导入失败 —— XML 与交换格式不匹配。先导出一个相似对象再仿照其结构(用 read_sectionexport_xml),照搬其结构,包括 fileHeader/contentHeader

架构记录

  • 所有 COM 调用都跑在同一条专用的 STA 工作线程 上(COM 单元内存关联);MCP 工具调用会被编排到这条线程执行(调度器是可重入的——嵌套的桥接直接在工作线程内执行)。

  • 硬件、DTM 对象是通过 辅助双接口IProject3IConfiguration2IBusIModuleIP htm* 等)暴露成员的,而这些接口并早早并虚拟接口不属于默认的 dispatch 接口。桥接层会用从 HKCR\Interface 收集到的 IID 对每个对象做 QueryInterface,并把结果包装为 IDispatch(_qi),这是从“late-bound”客户端访问 DTMRootInternalBusesAddChild 等内部成员唯一办法。

  • 写访问等放大标记app.Project(1))每个会话获取一次并缓存;失败的 traceback 不会持有 COM 引用,因而不会把 ProjectClose 锁死。

  • Project 是一个带参数化 COM 属性——调用时必须加显式 DISPATCH_PROPERTYGET 标志,因为 pywin32 的动态调用不能直接调用它。

  • 导入的临时文件会使用与 XML 根节点匹配的扩展名(如 STExchangeFile.xst, VariablesExchangeFile.xsy ...),因为 Control Expert 根据扩展名来选择解析器。

  • 枚举常量(语言、导出选项、PLC 命令等)从 PServer.tlb 抽取 —— 见 src/control_expert_mcp/constants.py

免责声明

本项目与 Schneider Electric 无附属关系。UDE 自动化接口由施耐德“原样”提供,且已不再作为商业产品出售;本项目是自担风险去驱动该接口。决不要在没有合格人员监督的情况下,将线上工具连到生产设备上去。

Install Server
A
license - permissive license
B
quality
D
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

View all related MCP servers

Related MCP Connectors

  • Code intelligence for coding agents: semantic, AST, graph, and full-text search. 279+ languages.

  • Manage SRG+ hubs, channels, content, assets, users, and workspaces from any MCP-aware AI agent.

  • Create and manage AI agents that collaborate and solve problems through natural language interacti…

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/apexsotjo-blip/remoteconnect-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server