3. 被测对象建模与接口抽象
虚拟调试的核心难点不在于仿真软件本身,而在于“被测对象到底长什么样、从哪里下手”。一台真实设备包含机械结构、电气回路、PLC 控制逻辑和现场总线通信四层内容,如果直接把这些全部塞进仿真环境,测试用例将无从下手。因此,本节要解决的是:如何把物理设备逐层抽象成可建模、可观测、可驱动的对象,并从中提取出自动化测试真正需要的接口。
一、四层建模视角
被测对象建模可以按四个层次展开,每层关注的对象和交付物不同:
- 机械层:关注运动学与几何关系,例如气缸行程、伺服轴位置、夹具开合角度。建模时通常用简化几何体或运动学关节表达,不必追求外观逼真,但必须保证行程、限位、干涉关系正确。
- 电气层:关注执行器与传感器的电气行为,例如接触器吸合、电磁阀得电、光电开关输出高低电平。这一层决定仿真能否正确反映“输出命令—物理动作—反馈信号”的因果链。
- 控制逻辑层:关注 PLC 程序中的状态机、互锁、时序。建模时通常保留真实 PLC 程序,仅把 I/O 映射到仿真信号,从而保证逻辑一致性。
- 信号接口层:关注数据如何进出被测对象,包括 OPC UA 节点、Profinet 过程映像、MQTT 主题。这一层是自动化测试脚本直接操作的边界。
四层之间是逐层映射关系:机械动作由电气执行器驱动,电气执行器由控制逻辑输出控制,控制逻辑的输入输出又通过信号接口暴露给测试系统。理解这条链路,才能判断一个测试用例应该在哪一层施加激励、在哪一层采集响应。
二、从物理对象到可操作接口
建模完成后,真正驱动自动化测试的是“接口清单”。一个可操作的被测接口至少包含四类信息:
- 激励点:测试脚本可以写入的信号,例如启动按钮、模式选择、目标位置设定值。
- 观测点:测试脚本可以读取的信号,例如到位传感器、报警字、实际速度。
- 时序约束:从激励到响应允许的时间窗口,例如“启动后 800 ms 内夹紧到位”。
- 判据阈值:判断通过与否的量化条件,例如位置误差 ≤ 0.5 mm、报警码等于 0。
以一台气动夹紧工位为例,其接口清单可整理如下(示例参数,非实测值):
| 接口名 | 方向 | 协议/地址 | 数据类型 | 用途 |
|---|---|---|---|---|
| Clamp_Cmd | 写 | OPC UA: ns=2;s=Clamp.Cmd | Boolean | 发出夹紧命令 |
| Clamp_Pos | 读 | OPC UA: ns=2;s=Clamp.Pos | Float (mm) | 读取夹爪位置 |
| Clamp_Done | 读 | Profinet: I 2.0 | Boolean | 到位反馈 |
| Alarm_Code | 读 | MQTT: line1/clamp/alarm | Int16 | 报警码订阅 |
| Cycle_Time | 读 | MQTT: line1/clamp/cycle | Float (ms) | 节拍统计 |
这张表就是测试脚本与仿真模型之间的“合同”。脚本只依赖接口名和语义,不关心底层是 OPC UA 还是 Profinet,从而在协议更换时保持用例稳定。
三、通信协议在测试中的角色
三种协议在虚拟调试测试中承担不同职责,不能互相替代:
- OPC UA:适合作为测试主通道。它支持结构化节点、读写方法调用和订阅,测试脚本可以按语义路径直接访问变量,适合做参数化激励和状态观测。其信息模型还能携带单位、量程等元数据,便于自动生成判据。
- Profinet:适合验证实时 I/O 行为。它反映的是 PLC 过程映像的字节级布局,测试脚本通过读写 I/O 字节来模拟传感器和采集执行器状态,最接近真实硬件的时序特性,适合做响应时间和抖动测试。
- MQTT:适合做事件与统计数据的旁路采集。报警、节拍、能耗等非实时信息通过主题发布,测试系统订阅后用于趋势分析和异常回溯,不参与实时闭环控制。
实践建议:把 OPC UA 作为“控制与观测主通道”,Profinet 作为“实时 I/O 校验通道”,MQTT 作为“事件记录通道”。三者并行使用,而不是二选一。
四、建模与接口提取的实际流程
以一个包含上料、夹紧、加工、下料四个工位的装配单元为例,可按以下方式落地:
- 先画机械简图,标出每个运动部件的行程和限位,确定需要仿真的自由度数量。
- 为每个执行器建立电气映射:电磁阀得电 → 气缸伸出 → 到位传感器置位,并记录典型响应时间(示例:伸出 350 ms,缩回 300 ms)。
- 保留真实 PLC 程序,建立 I/O 映射表,把物理地址替换为仿真变量地址。
- 按工位整理接口清单,标注方向、协议、数据类型和判据。
- 用一条最小用例验证链路:写 Clamp_Cmd=TRUE,订阅 Clamp_Done,检查 800 ms 内是否变为 TRUE,并读取 Clamp_Pos 是否在 0.5 mm 误差内。
# 示例:OPC UA 读写与判据检查(伪代码)
client.write("ns=2;s=Clamp.Cmd", True)
t0 = now()
while now() - t0 < 0.8:
if client.read("ns=2;s=Clamp.Done"):
break
pos = client.read("ns=2;s=Clamp.Pos")
assert abs(pos - target) <= 0.5, "位置超差"
assert client.read("ns=2;s=Alarm.Code") == 0, "存在报警"
这段脚本体现了接口抽象的价值:测试逻辑只关心“写命令、等反馈、查位置、验报警”,底层是 OPC UA 还是 Profinet 由适配层处理。当被测对象从仿真切换到真实设备时,只需替换通信适配器,用例本身无需重写。
常见误区:把机械模型做得过于精细,却忽略了电气响应延时和 PLC 扫描周期。虚拟调试测试中,时序误差往往比几何误差更容易导致误判,建模时应优先保证信号链的时间特性正确。
总结来看,被测对象建模的关键不是“画得多像”,而是“接口是否可操作、时序是否可信、判据是否可量化”。机械、电气、控制逻辑、信号接口四层各司其职,最终收敛为一份可被测试脚本直接使用的接口清单,这才是自动化测试能够稳定运行的基础。