1. 这个项目到底是做什么的:UG NX 与 S7-1500 的在环虚拟测试全貌
1.1 什么是在环虚拟测试,解决什么问题
在环虚拟测试,英文常叫 In-the-Loop Testing,放在西门子的技术体系里就是大家常听到的虚拟调试、Virtuelle Inbetriebnahme。它的核心思路很简单:在真实设备造出来之前,或者哪怕设备已经造出来但不敢直接上电试跑的时候,先用高保真度的虚拟模型代替真实机械,把 PLC 程序接上去跑一遍,看看逻辑是否成立、动作是否干涉、节拍是否达标。
传统做自动化项目,机械设计、电气设计、PLC 编程是三条线各干各的。机械用 UG NX 建模,电气画图,PLC 工程师在 TIA Portal 里写程序。等设备进场、接线完成,大家才发现动作顺序有问题、气缸行程不够、传感器位置装得不对。现场改机械是大工程,改 PLC 程序又要重新调试,时间成本和资金成本都很高。
UG NX 与 PLC-1500 的在环虚拟测试就是把“现场调试”这一环节提前。UG NX 里的机电概念设计模块(MCD,Mechatronics Concept Design)负责把三维机械模型变成虚拟样机,包含运动学、碰撞检测、传感器仿真;S7-1500 侧则由 PLC 程序控制这个虚拟样机。机械和电气在电脑里先“结婚”,联调通过之后再落地设备,现场调试时间能压缩 50% 到 70%。这个数值不是我随口说的,我做过一条小型装配线的虚拟调试,原计划现场调试两周,最后三天就收工了。
这套方案适合谁?如果你是搞非标自动化设备设计的、做产线集成的、给机床或包装设备配套的电控工程师,或者你所在的团队经常因为机械和电气沟通不畅而吃哑巴亏,那这套东西你早晚要用上。汽车焊装线、电池模组线、医药包装线这些高节拍、高复杂度的行业里,虚拟调试已经快成为交付硬指标了。
1.2 为什么选 UG NX 和 S7-1500 这对组合
这么选背后是有理由的。先说 S7-1500。它是西门子的中高端 PLC,性能强、通信接口丰富,支持 OPC UA,本身就适合做虚拟调试。论生态,TIA Portal 加 PLCSIM Advanced 的组合,能在一台电脑里虚拟出一个和真实 PLC 行为高度一致的 PLC,而且支持 API 调用,这给自动化测试留了非常大的空间。
再看 UG NX。它不只是建模工具,真正的王牌是内嵌的 MCD 模块。MCD 能把 Solid 模型转成刚性体、定义碰撞体、添加铰链副和滑动副,还能布置传感器信号,说白了它已经是一个轻量级物理仿真引擎。MCD 和 PLCSIM Advanced 之间的通信有官方支持,信号映射、实时数据交换都是现成的。你不需要再去跨软件折腾 Unity 或者别的仿真平台,一条链路就能打通。
两个软件都是西门子自家的东西,版本之间的兼容性可控。我记得早年间做这种联调,最痛苦的就是 Siemens PLCSIM 和新版本 TIA Portal 之间的匹配问题,动辄打不开或连不上。现在虽然版本问题仍然存在,但至少官方文档齐全,社区案例也多,遇到问题能找到出路,而不是自己瞎摸索。
另外一个实际考虑是团队技能复用。大多数机械工程师本来就会 UG NX,电控工程师本来就会 TIA Portal。引入虚拟调试,只是在这两个软件里各自加一门新技能,而不是让大家从零学一个新平台。我见过强行上马其他仿真软件的项目,机械和电气都怨声载道,最后不了了之。做工程落地,工具链越贴近现状,越容易成功。
2. 环境搭建与工程准备:版本、软件、通信链路
2.1 关键软件与版本匹配
做在环虚拟测试,最小软件集合是四件套:UG NX(含 MCD 模块)、TIA Portal、S7-PLCSIM Advanced,以及一个用于模型通信的中间件或授权服务。这是我建议的搭配,也是我在项目里实际用得比较顺的组合。
先说说版本匹配,这是新手最容易踩坑的地方。不要觉得软件越新越好,虚拟调试这条链路里,任何一环的版本不一致,都可能让你花一整天去排查连接问题。我自己的经验是:
| 软件 | 推荐版本组合 | 理由 |
|---|---|---|
| UG NX | NX 2007 或 NX 2206 之后的 MCD 版本 | 对 PLCSIM Advanced 的接口更稳定,信号编辑器体验好得多 |
| TIA Portal | V17 或更高 | 低版本对 S7-1500 固件 2.5 以后的设备支持不完整 |
| S7-PLCSIM Advanced | V4.0 以上,最好 V5.0 | V4.0 支持 API 调用,V5.0 在网络通信和实例管理上更省心 |
| 操作系统 | 独立物理机,Win10 Pro 或 Win11 | 不要用虚拟机跑 PLCSIM Advanced,延时会让你的仿真节奏完全失控 |
这里额外说一句:如果条件允许,尽量把 UG NX 和 TIA Portal 装在同一台高配工作站上。因为 PLCSIM Advanced 和 MCD 之间的通信走的是本地虚拟网卡或 OPC UA,数据都是本机转发的。装在同一台机器上,少一层跨机器的防火墙配置,连接稳定性直线上升。如果实在要分开两台电脑跑,记得把防火墙里与 Siemens 相关的入站出站规则全部放行,并且为两个软件分别设置静态 IP 的虚拟网卡,不要用 DHCP。
2.2 通信链路选型:OPC UA 与 PLCSIM Advanced 的取舍
MCD 和 PLC 侧通信,我实际用下来有三条路:直接内存映射(PLCSIM Advanced 与 MCD 的 Softbus)、OPC UA 通信、以及通过 SIMIT 作为中间层转发。第三条路径涉及额外软件授权,除非是大型产线级仿真,否则我不建议一上来就用。
对于单台设备或小型工位级验证,我推荐用 PLCSIM Advanced 自带的内存映射机制。MCD 的信号可以直接通过“内部信号”和“外部信号”绑定到 PLCSIM 的虚拟 I/O 地址上。这种方式实时性最高,信号延迟在 10~20ms 量级,完全能满足气缸、伺服这类执行器的逻辑验证需求。配置方式也很直接:在 MCD 的信号适配器里选择 PLCSIM Advanced 作为目标,填上虚拟 PLC 的实例名即可。
OPC UA 的优势在于跨平台和开放性。如果你的控制器不是一个 S7-1500,而是第三方设备,或者你需要同时把数据送给 MES、SCADA 系统看,那 OPC UA 是更通用的选择。MCD 本身支持 OPC UA Server,S7-1500 也原生支持 OPC UA Server,两个 Server 之间由 UA Client 桥接数据。缺点是数据点位多了之后,维护量明显变大,而且通信周期会比内存映射慢一个量级。
总结成一句话:自己做项目验证,优先走 PLCSIM Advanced 直连;要给客户做演示,或者数据要出给其他系统,再考虑 OPC UA。别一上来就把链路搞得过于复杂。
2.3 项目初始化:模型准备与机电对象定义
很多人以为,把三维模型导入 MCD 就能直接仿真了。这是个非常大的误区。MCD 里的模型确实可以直接导入,但导入进来的东西只是“长得像设备”的几何图形,它没有质量、没有运动学关系、没有碰撞属性,MCD 并不知道哪个函数是固定的床身、哪个面是滑块的滑动面。
在我自己的标准流程里,模型进入 MCD 后的第一步是做“三清”:清理冗余零件、清理干涉特征、清理无效参数。去参处理很重要。MCD 对大规模装配体的实时计算压力很大,如果模型里有几百个螺栓螺母之类的零件,哪怕它们不参与运动,也会拖慢仿真速度。我的经验是只保留运动部件、传感器安装座、工件和抓手模型,其余固定件能合并的就合并成一个体。
模型清完之后才开始定义机电对象。这一步的核心操作为:
- 把固定床身设为固定体。
- 把滑块、气缸活塞杆、抓手手指设为刚性体。
- 在两两运动部件之间创建运动副,最常见的三类是:铰链副(旋转)、滑动副(直线移动)、圆柱副(既旋转又滑动)。
- 给所有需要碰撞检测的面创建凸碰撞体或精确碰撞体。
- 在气缸的伸出、缩回极限位置布置位置传感器,或者用仿真信号替代。
这一步有一个非常关键的经验:运动副的坐标方向必须与设备实际运动方向一致,而且最好以机械原点为基准。如果装配体是从别的子系统复制过来的,常常出现运动副方向和实际运动相反的情况,这时候在 MCD 里直接改运动副方向就行,不要重新建模。我早期吃过亏,一个搬运工位的 Y 轴滑块反向,PLC 逻辑怎么调都不对,排查了两天才发现是 MCD 里运动副方向定义错了。
3. 模型侧的实现:把机械模型变成“能跑会动”的虚拟样机
3.1 运动副与约束的设定
运动副设置在 MCD 里是非常花费精力的环节,也是最考验对设备理解能力的地方。每创建一个运动副,本质上都是在告诉仿真引擎:这两个物体之间只能以某一种方式相对运动。这一步做错了,整个虚拟样机都会“散架”。
以最常见的直线气缸为例。气缸体固定在支架上,活塞杆连接一个滑块。你在 MCD 里需要:
- 选择气缸体作为源,整体作为刚性体。
- 选择滑块作为运动体。
- 创建滑动副,并把滑动方向指定为活塞杆的伸出方向。
- 设定滑动行程的下限和上限,对应气缸的缩回位和伸出位。
这里有一个容易被忽视的细节:MCD 的滑动副本身不限制行程范围,它只约束自由度。如果你在仿真过程中不主动给滑块施加控制信号,滑块不会自动停在气缸行程终点。你需要通过两个方法配合:一是给滑动副定义限位条件,二是用位置控制或速度控制信号驱动它。否则滑块会一直沿着滑动方向飞出去,画面非常魔幻。
多个运动部件联动的场景,比如四连杆机构、凸轮从动机构,我建议给每个运动副起一个清晰易懂的名字,比如“Gripper_Left_Finger_Slide”“Cylinder_A_Piston_Hinge”,不要用默认的 Rigid_001、Joint_002 这种。后面对接 PLC 信号时,信号列表里会同时出现几十上百个运动副,命名混乱会让你中途崩溃。
3.2 碰撞体与传感器的仿真
碰撞体是让虚拟样机“有手感”的关键配置。没有碰撞体的模型,部件之间是可以互相穿过的,也就是俗称的“穿模”。MCD 提供三种碰撞体:精确碰撞体适用于形状复杂的工件,但计算量大;凸碰撞体对凸包外形做简化,速度和精度平衡;包围盒碰撞体最简单,适合粗测。
我的建议非常明确:凡是和抓取、放置、推料直接相关的部件,一定要用精确碰撞体或凸碰撞体;对只起防错作用的结构,用包围盒就够。仿真速度比绝对精度重要,因为 PLC 程序要的只是“有没有碰到”这个布尔量,不是碰撞力的精确数值。
传感器在 MCD 里有两种实现方式。一种是布置物理传感器,把位置传感器、光电传感器的感应区域用几何体表示,当物体进入感应区域时触发信号;另一种是直接利用运动副的位置值生成模拟量,比如读取滑块的当前位置,超过阈值就发出到位信号。实操中,光电传感器类逻辑我更喜欢用第二种方式,因为不用在三维空间里小心调整传感器感应区的位置,还能避免传感器误触发的干扰。
3.3 信号接口定义:从仿真信号到 PLC I/O
这是整个项目里最关键的一步:把 MCD 内部的仿真信号,通过信号适配器映射到 PLC 的 I/O 地址上。
在 MCD 的“信号”模块里,每个运动副或传感器都能暴露多个信号,比如位置值、速度值、触碰状态、运行时状态。你需要做的是:
- 给要用于控制的信号勾选“外部”属性,比如气缸伸出到位信号、缩回到位信号、抓手的夹紧完成信号。
- 给要接收 PLC 控制的信号勾选“外部”属性,比如气缸伸出控制、缩回控制、抓手松开控制。
- 建立信号映射表,把外部输入信号映射到 PLCSIM Advanced 的 I 区地址,把控制信号映射到 Q 区地址。
一个典型工位的信号映射表长这样:
| MCD 仿真信号 | PLC 地址 | 数据类型 | 方向 |
|---|---|---|---|
| Cylinder_A_Extended | I0.0 | Bool | 仿真到 PLC |
| Cylinder_A_Retracted | I0.1 | Bool | 仿真到 PLC |
| Gripper_Closed | I0.2 | Bool | 仿真到 PLC |
| Cylinder_A_Extend_Cmd | Q0.0 | Bool | PLC 到仿真 |
| Cylinder_A_Retract_Cmd | Q0.1 | Bool | PLC 到仿真 |
| Gripper_Close_Cmd | Q0.2 | Bool | PLC 到仿真 |
信号映射看起来简单,但它是整个联动调试的“高速公路收费站”。如果这个表建的信息不全,后面联调时你会在 MCD 和 TIA Portal 之间来回切换上百次。所以我的习惯是:哪怕一个信号暂时用不到,只要现场会用到,就先在信号表里预留。
4. PLC 侧的实现:从真实程序到虚拟执行
4.1 TIA Portal 工程与 S7-1500 程序结构
S7-1500 的程序结构在虚拟调试中和真实项目没有区别,甚至应该比真实项目更规范,因为调试效率直接取决于程序的可读性。我的建议是:把程序按功能块拆分,而不是把所有逻辑堆在 OB1 里。一个工位的动作逻辑对应一个 FB,传感器信号和输出信号统一走全局数据块。
在写虚拟调试程序时,有一个心态要调整:这台“虚拟 PLC”是碰不坏的。所以初始时你可以更大胆地去验证逻辑边界,比如同时输出两个互锁的气缸动作,看程序里有没有设联锁条件。这些测试如果放在真实设备上,轻则撞气缸,重则报废工装。虚拟世界里的容错空间,就是虚拟调试带来的最大红利。
OB1 之外,我建议加一个周期性中断 OB,比如 OB30,做轨迹插补类的计算,或者用于伺服轴的运动控制。S7-1500 支持多 OB 并行运行,这在虚拟调试中意义重大——因为虚拟 PLC 跑在 PC 上,CPU 资源不那么紧张,反而能暴露程序逻辑里的时序真相。
4.2 虚拟 PLC(PLCSIM Advanced)的启动与连接
PLCSIM Advanced 和标准 PLCSIM 最大的区别是,它生成的是一个独立的虚拟 PLC 实例,有独立的 IP 地址,支持外部程序通过 Softbus 或 API 访问。你需要先在 PLCSIM Advanced 界面里创建一个实例,指定固件版本和虚拟 IP,然后启动这个实例,接着才能把 TIA Portal 里写好的程序下载进去。
这里有一个特别容易踩的坑:创建 PLCSIM Advanced 实例之前,要确保电脑上装了虚拟网卡,并且虚拟网卡的 IP 地址和虚拟 PLC 实例的 IP 在同一个网段。最简单的做法是都放在 192.168.0.x 网段。如果忘了配置虚拟网卡,你能创建实例,但 TIA Portal 下载程序时永远提示“设备不可达”。
PLCSIM Advanced 还有一个非常有用的功能:API 接口。你可以通过 C#、Python 或 .NET 脚本控制虚拟 PLC 的启停,甚至实现在线读写变量。这意味着你可以写一个自动化测试脚本,一键完成“下载程序—启动运行—注入信号—判断输出—汇总结果”的回归测试流程。项目越大,这个能力的价值越高,也是后面单独拿出来做文章的点。
4.3 数据交换与同步机制
PLC 侧程序和 MCD 模型的运行节奏是不一致的。PLC 程序有循环扫描周期,MCD 仿真也有自己的时间步长。联调时,通常以 MCD 的实时仿真为基准,PLC 程序以固定周期执行,两者在信号交换点同步。
实际项目中,我一般把 PLCSIM Advanced 的通信周期设置为 10ms 到 20ms,MCD 的仿真步长设置为固定步长,也是 10ms 级别。这个匹配关系跑下来,气缸动作的时序表现与真实设备的差异在可接受范围之内。如果你发现虚拟调试中动作明显偏慢或者偏快,第一件事不是去改程序,而是检查两个软件的仿真时间步长是否匹配。
时间基准的问题还有一个隐藏影响:PLC 的定时器指令(比如 TON)在虚拟环境下按真实时间运行,但 MCD 仿真如果因为显卡性能不足出现掉帧,模型动作会显得一顿一顿的,体和 PLC 定时器判断的时间就会错位。所以虚拟调试对电脑硬件的要求不是“能打开 UG NX”就行,而是要能稳定保持 40 帧以上运行 MCD。显卡性能不够时,优先降低 MCD 的视觉效果参数,而不是调慢仿真速度。
5. 联调过程与核心环节实测
5.1 首次联调的启动顺序
第一次把 MCD 和 PLCSIM Advanced 拉通的顺序,直接影响你排查问题的速度。我推荐一套固定的启动顺序:
- 启动 UG NX,加载 MCD 项目,确认运动副和信号列表正常。
- 启动 PLCSIM Advanced,创建虚拟 PLC 实例,等待实例状态变为 Running。
- 打开 TIA Portal,把编译好的程序下载到虚拟 PLC。
- 回到 MCD,启动仿真循环,确认模型可以正常运行。
- 在 MCD 信号适配器里打开与 PLCSIM 的通信,观察信号是否同步变为绿色/Active。
- 在 PLC 程序里强制一个输出,比如 Q0.0 置 1,看 MCD 里对应的气缸是否伸出,到位信号 I0.0 是否变 1。
如果第六步能成功,恭喜你,整条链路已经通了。剩下的工作就是把所有动作逐个在 PLC 程序里执行一遍,确认机械与电气逻辑一致。
这里要特别强调第六步的价值:先手动强制一个信号,验证链路,而不是直接按下启动按钮跑完整逻辑。因为如果整条链路有连接问题,你跑完整逻辑时根本无法判断是“逻辑写错了”还是“信号根本没过去”。这种排查思路,在虚拟调试和现场调试里同样适用。
5.2 跑通一个最简单的抓取工位
我们来做一个最小可行案例:一个气缸推动料盒到指定位置,机械手夹爪下降抓取,夹紧后退回。这个工位涵盖了直线运动、旋转运动、逻辑互锁和传感器反馈,足够验证整个工具链,又不至于被复杂逻辑干扰。
第一步,在 NX 里建好料盒、推动气缸、机械手框架、夹爪。第二步,在 MCD 里把推动气缸的滑块加滑动副,把机械手的旋转轴加铰链副,把夹爪的两个手指分别加滑动副,并给所有运动部件添加碰撞体。第三步,把所有位置信号和控制信号按前文表格映射好。
PLC 侧的程序逻辑并不复杂,我习惯按“动作状态机”来写:
- S0:初始状态,所有气缸缩回,等待启动。
- S1:推进气缸伸出,推动料盒到待抓取位。
- S2:机械手旋转下降到位。
- S3:夹爪闭合,夹取料盒。
- S4:机械手旋转回原位。
- S5:推进气缸缩回,循环完成。
这个状态机里的每个状态切换条件,都必须包含一个到位信号和一个时间超时保护。到位信号保证机械动作确实完成,时间超时保护保证万一信号丢失,程序不会卡死在一个状态里。在虚拟调试中,很多信号其实是“模拟的”,更要注意超时保护,不然一个信号断掉,程序就“假死”了,这和现场的情况非常相似。
我在实际跑这个工位时,第一轮就发现推进气缸伸出后,料盒在碰撞作用下发生了微小偏移,导致夹爪合拢时和料盒边缘轻微干涉。这类问题在纯 PLC 模拟环境里是永远发现不了的,只有在有物理引擎的 MCD 里才能暴露出来。这也正是把 MCD 引入在环测试的核心意义。
5.3 性能调优:仿真速度、信号抖动和处理周期
刚拉通的时候,绝大多数人都会觉得仿真跑得不够流畅,或者信号反馈有跳跃感。以我的经验,问题基本集中在三个地方:一是 MCD 的实时模式设置,二是 PLCSIM Advanced 的通信周期,三是模型复杂度。
MCD 里有一个“实时模式”选项,默认可能是“尽可能快”,这就导致模型在无负载时飞速运行,而 PLC 逻辑跟不上,出现信号堆积。我一般改为“固定时间步长”模式,并设置步长为 10ms,这样仿真速度就与真实时间基本一致了。
信号抖动的问题,多半出在位置传感器或碰撞体的阈值上。MCD 的位置信号理论上非常干净,但如果你用传感器感应区域来触发信号,物体正好处于感应区边缘时,信号会反复变化。解决办法是把传感器感应区域加大,或者在 PLC 侧程序里加一个 50ms 的信号滤波。
处理周期是一个需要反复试出来的参数。PLCSIM Advanced 的通信周期太短,电脑 CPU 会被大量中断占用,导致软件卡死;太长,PLC 程序感觉不到模型的实时变化,逻辑判断明显滞后。我在 i7-12700 + 32GB 内存的机器上,跑一个 50 个运动副级别的工位,通信周期设为 10ms,MCD 固定步长 10ms,CPU 占用约 60%,整体流畅度满意。
6. 常见问题速查与避坑经验
6.1 连接失败类问题
我把过去几年在虚拟调试里遇到的高频问题整理成一张速查表,大概率能覆盖刚开始做这个方向时遇到的大部分问题:
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
| TIA Portal 下载程序时找不到虚拟 PLC | 虚拟网卡未启用或 IP 不在同一网段 | 启用虚拟网卡,将 IP 改为与 PLCSIM Advanced 实例同一网段 |
| MCD 信号适配器连不上 PLCSIM | 实例未启动,或 PLCSIM 版本比 MCD 版本旧 | 先启动实例,再在 MCD 里点击连接,必要时重启两个软件 |
| 启动仿真后模型不动 | 所有运动副未定义,或没有 PLC 输出信号注入 | 检查运动副列表和信号映射表,用 MCD 内部信号直接强制控制测试 |
| 信号列表刷新不出来 | MCD 项目里没有任何外部信号定义 | 检查需要交互的信号是否已经勾选“外部”属性 |
| 联调一段时间后通信断开 | 虚拟网卡驱动休眠或 PLCSIM 实例崩溃 | 关闭系统网卡的节能选项,重启 PLCSIM 实例 |
这里特别提一下防火墙。Windows 防火墙默认会拦截很多西门子组件之间的内部通信。我遇到过 MCD 每次启动都提示找不到 PLCSIM 的情况,最后发现是防火墙把 Memory Map 服务拦了。处理办法是直接把三个核心程序(UGS 相关进程、PLCSIM 相关进程、TIA Portal 相关进程)都加入防火墙白名单,省心。
6.2 信号不通与逻辑对不上问题
信号映射做好了但控制器收不到,这是虚拟调试里最折磨人的问题。因为从表面看,两边配置都没有报错,但信号就是不通。
我的排查路径非常固定,按顺序检查:
- 在 MCD 的信号表里,确认该信号状态已经变为 Active 或 Connected。
- 在 PLCSIM Advanced 实例的“PLCSIM 变量”视图里,查找对应 I 区或 Q 区地址的实际值,看值是否已经变化。
- 在 TIA Portal 的在线监控里,读一下程序块里的输入输出变量。
- 如果前三步都正常但逻辑没反应,检查程序中是不是有中间变量或使能条件夹在信号和逻辑之间。
这套排查下来,80% 的问题都出在第一步和第二步之间:MCD 侧信号没有真正连接到 PLCSIM。原因往往是信号列表里存在重名,或者某个信号在 MCD 项目重新加载之后丢失了外部属性。遇到这种情况,最有效的办法是把所有信号重新映射一遍,不要试图只修那一个有问题的信号。因为信号映射表内部有一致性校验,单点修复经常会引发其他信号错位。
6.3 运动发散、穿模与模型异常
第三种典型问题是模型表现异常。如果你发现某个部件在仿真开始时突然弹开、或者部件之间穿模,或者运动过程出现剧烈抖动,这基本是模型定义的问题,和 PLC 程序无关。
运动发散最常见的原因是“运动副冲突”:同一个物体被两个运动副同时约束了,比如滑块已经被添加了滑动副,又被人为加了一个固定副。MCD 求解器碰到这种矛盾约束,会产生数值奇异,表现出来就是部件瞬间飞出去。处理方式是检查装配导航器里的运动副列表,删除多余约束。
穿模问题通常有两个来源。一是该做碰撞体的部件没有做碰撞体,物体之间直接穿过;二是碰撞体类型选得太简单,比如用包围盒代替精确碰撞体,导致包围盒边缘有间隙,视觉上看起来还没碰到就穿透了。我的习惯是:直接参与动作的部件全部用凸碰撞体,宁可多一点计算量,也不让穿模干扰调试判断。
还有一种特别容易忽略的情况:模型中的单位不一致。有些三维模型导入后在转换过程中把毫米变成了米,导致 MCD 里的物理引擎计算尺度完全错乱。遇到这种问题,去 MCD 里查看模型的单位设置和重力系数,确认是毫米制且重力方向为 Y 轴负方向,这个细节几乎能解决一半的“模型莫名乱飞”问题。
7. 向 NX 二次开发与自动化工具链延伸
7.1 UG NX 二次开发能做什么
我在前文多次提到,信号映射是虚拟调试最耗时、也最琐碎的一环。当你只有两三个工位时,手工映射还能接受;但当你面对一条有十几个工位的产线,每个工位都有几十个信号时,手工映射几乎是不可完成的任务。这时候就要上 NX 二次开发。
UG NX 的二次开发技术栈比较成熟。传统方案主要是 NX Open C++ 和 NX Open .NET,现在也支持通过 Python 脚本调用,比如借助 NX Open Python 或 NX Open API,做一些自动化的模型操作。对虚拟调试来说,最有价值的三类自动化是:
- 自动遍历模型中的运动副和信号,生成标准化的信号映射表。
- 自动批量创建碰撞体和运动副,减少重复性手工劳动。
- 自动为信号适配器创建与 PLC 变量的匹配关系,并生成映射报告。
这些自动化工具的核心价值,不是帮你省一两天时间,而是让虚拟调试这件事真正可复制。可复制的意思是:你可以把一个工位验证过的信号映射标准,套用到所有同类型工位上,让整个团队的调试质量保持一致。
7.2 搭建一个简易信号自动绑定工具
我最近在项目里实践过一种轻量级方案:直接通过 NX 的 API 读取 MCD 内部对象信息,再配合 Python 脚本生成一份 CSV 格式的信号映射草表。这份草表整理好 PLC 地址后,可以批量导入到 MCD 信号适配器里,或者给 PLCSIM Advanced 的 API 使用。
大致思路是:先用 NX Open 的查询接口遍历装配导航器,识别所有带“Joint”“Sensor”前缀的对象,自动生成对象名与信号名的对应关系。然后根据对象名前缀映射 PLC 地址,比如名为“Cylinder_A_Extend_Cmd”的信号,自动映射为 Q0.0;“Cylinder_A_Extended”自动映射为 I0.0。这种方式对信号命名规范的项目效果极好,相当于把人工对照变成了纯脚本处理。
这里分享一个关键经验:命名规范决定自动化上限。如果你的三维模型里全叫 Body1、Body2,那个脚本写出来的映射表基本不能看,还需要人工重命名。所以做虚拟调试项目,第一步不是在软件里操作,而是先定一套命名规范,让机械工程师在建模时就遵守。比如:
- 气缸部件统一为:Cylinder_[工位代码]_[功能描述]_Cylinder
- 传感器统一为:Sensor_[工位代码][检测目标][位置]
- 运动副统一为:[类型][工位代码][功能描述]_[序号]
这套规范一旦建立起来,整个项目的虚拟调试效率会提升一个量级,而且后期出文档、做维护也会轻松很多。
7.3 对团队和项目的影响:虚拟调试带来的改变
做完一个完整的 UG NX 与 PLC-1500 在环虚拟测试项目之后,最明显的感受是:机械设计和电气设计之间的沟通方式变了。以前是机械交图、电气接线,出了问题互相推诿;现在是两边坐在一起,对着同一个虚拟模型跑程序,看到哪个动作不合理,当场就能定位是机械结构的问题还是 PLC 逻辑的问题。
这种变化对项目的影响是结构性的。设计变更的成本在虚拟世界里被压到了极低,很多以前不敢试的结构方案、不敢跑的动作时序,现在都敢大胆验证。我记得一个电池模组线的项目,就是因为虚拟调试时发现机械手爪闭合顺序会导致工件表面刮擦,才在开模之前改了夹爪结构。如果在真实设备上才发现这个问题,模具费用和工期损失都难以挽回。
还有一个容易被忽略的价值:虚拟调试的过程本身就是一套完整的测试文档。每一次联调运行的记录、每一个信号波形的截图、每一份问题排查的记录,都是后期设备验收和维护的宝贵资料。对交付型项目来说,这份资料是客户信任的基石;对内部项目来说,这份资料是团队能力升级的种子。
回头再看这条链路——UG NX 负责把机械世界数字化,PLC-1500 负责把控制逻辑数字化,在环虚拟测试则负责让这两个数字化世界能够在电脑里真实地“对话”。我做了这么多年自动化项目,最深的体会是:越复杂的设备,越需要提前暴露问题。而虚拟调试就是目前成本最低、效果最直接的问题暴露手段。如果你手头正好有设备项目在推进,我强烈建议抽一两周时间把这个链路搭起来,你会回来感谢我的。