本文记录了在使用 Prosys OPC UA Simulation Server(免费版)创建变量、并通过 OPC UA 与 **Siemens NX MCD(Mechatronics Concept Designer)**做信号映射时,遇到的”变量 IO 类型识别异常”问题的完整排错过程,希望能帮到遇到同样问题的朋友。
背景
在虚拟调试(Virtual Commissioning)场景中,常用 Prosys OPC UA Simulation Server 模拟 PLC/外部设备的 OPC UA 服务器,配合 NX MCD 做机电一体化仿真。在 MCD 的”信号映射”对话框里,每个外部 OPC UA 变量会显示一个 IO 类型:
输入(Input)输出(Output)输入/输出(Input/Output,双向可读写)
理论上,一个具备完整读写权限的 OPC UA 变量,应该在 MCD 里显示为 输入/输出,可以自由映射给 MCD 的输入信号或输出信号。但实际操作中发现:用 Prosys 新建的变量,无论怎么调整权限,MCD 里始终只显示 输入,无法用作 MCD 信号的”输出”映射对象。
而用 asyncua(Python OPC UA 库)手写的一个简单服务器变量,却能正常显示为 输入/输出。
排错过程
第一步:检查 MCD 信号方向(Signal Adapter)
MCD 信号本身有方向属性,新建信号默认是 输出(Output)。如果要让外部数据(PLC/Prosys/HMI)写入并驱动这个信号,必须先在 Signal Adapter 对话框里手动把该信号的类型由默认的”输出”改为 输入(Input),否则信号映射时根本无法把外部变量配给它。
小结: MCD 信号方向是站在 MCD 自己的角度定义的——
- MCD 输出:值由 MCD 内部计算产生,外部只能读
- MCD 输入:值由外部写入,MCD 只读取,用来驱动机构
第二步:检查 Prosys 变量的 AccessLevel
最初怀疑是 Prosys 免费版限制了变量权限编辑功能。经核实,AccessLevel(读写权限)属于 OPC UA 标准节点的基础属性,免费版完全支持编辑,不需要专业版授权。专业版的限制主要体现在:
- 导入自定义 OPC UA 信息模型(NodeSet 文件)
- Method(方法)仿真
- PubSub DataSet 字段数量无限制(免费版限制 6 个字段)
打开 Prosys,编辑变量节点的 AccessLevel 属性,确认勾选了:
CurrentRead(可读)CurrentWrite(可写)
确认无误后,问题依然存在,说明权限不是根本原因。
第三步:检查 DataType
发现新建的变量 DataType 默认是抽象的 BaseDataType,而不是具体类型(如 Double)。把 DataType 改成具体类型(Double)后重新检查,问题依然存在。
Double 类型下还有一个子类型 Duration——它本质上也是 Double,只是语义上专门表示”时长”(通常单位为毫秒)。除非变量确实表示时长,否则应选普通 Double,而不是 Duration。
第四步(关键):发现 Historizing / HistoryRead 是真正原因
仔细对比 Prosys 变量与 asyncua 变量的属性差异:
Prosys 变量(有问题):
AccessLevel : [CurrentRead, CurrentWrite, HistoryRead]
Historizing : true
asyncua 变量(正常):
var = await obj.add_variable(idx, "MyVariable", 6.7)
await var.set_writable()
set_writable() 只设置了 CurrentRead + CurrentWrite,没有 HistoryRead,也没有开启 Historizing。
MCD 在自动解析 OPC UA 节点的 IO 方向时,遇到同时标记了”支持历史数据”的变量,会触发不同的内部分类逻辑,导致误判为只读/只能作为输入使用,无法正确识别其双向读写能力。
解决方法
在 Prosys 中编辑该变量:
- 打开变量的 Attributes 面板
- 在 AccessLevel 中,取消勾选
HistoryRead,只保留CurrentRead+CurrentWrite - 将 Historizing 属性由
true改为false - 保存
- 回到 NX MCD 的”外部信号配置”对话框,点击刷新按钮,重新浏览该 OPC UA 服务器的标签
- 再次打开”信号映射”对话框,该变量的 IO 类型应正确显示为 输入/输出
总结:Prosys 建立可双向读写变量的注意事项
| 检查项 | 正确设置 |
|---|---|
| AccessLevel | 仅勾选 CurrentRead + CurrentWrite,不要勾 HistoryRead |
| Historizing | false |
| DataType | 具体类型(如 Double),不要用抽象的 BaseDataType |
| Simulation(仿真信号) | 如不需要自动变化的值,设为 None 或 Constant,避免被仿真线程覆盖写入的值 |
延伸知识
MCD 与外部系统的 IO 方向是”镜像”关系
- MCD 输出 ↔ 外部(PLC/Prosys)输入:MCD 计算出数据写给外部,外部接收
- MCD 输入 ↔ 外部(PLC/Prosys)输出:外部写入数据,MCD 只读取,用来驱动机构
方向命名是相对各自系统而言的,不要把 PLC 视角的”输出”和 MCD 视角的”输出”混为一谈。
Prosys 免费版 vs 专业版
| 功能 | 免费版 | 专业版 |
|---|---|---|
| 创建自定义对象/变量、AccessLevel 编辑 | ✅ | ✅ |
| 全部基础仿真信号(Constant/Random/Sine 等) | ✅ | ✅ |
| 导入自定义 OPC UA 信息模型(NodeSet) | ❌ | ✅ |
| Method(方法)仿真 | ❌ | ✅ |
| PubSub DataSet 字段数量 | 限制 6 个 | 无限制 |
| 历史数据回放(Playback) | ❌ | ✅ |
整理于 2026 年 6 月,基于实际排错过程总结,适用于 Prosys OPC UA Simulation Server(Free Edition)与 NX MCD 虚拟调试场景。
发表回复