2. 虚拟设备建模基础

在PLC与虚拟设备联合调试工程中,虚拟设备并不是“假设备”,而是对真实执行机构、传感器或工艺单元的可计算替身。它至少承担三件事:向PLC提供与真实设备一致的输入/输出接口,按物理或工艺规律更新内部状态,并把状态变化反馈给调试系统。理解虚拟设备,关键不是记住某个软件的操作按钮,而是建立“接口—行为—状态”三位一体的建模视角。

一、虚拟设备的概念边界

虚拟设备通常由三部分构成:接口层负责与PLC交换信号,例如数字量输入DI、数字量输出DO、模拟量输入AI、模拟量输出AO;行为层决定输出如何随输入和时间变化,例如电机启停、气缸伸缩、温度惯性上升;状态层保存设备当前所处的位置、速度、温度、压力、报警等变量。三者缺一不可:只有接口没有行为,虚拟设备只是信号映射表;只有行为没有接口,PLC无法驱动它;只有状态没有更新规则,调试时看到的永远是静止画面。

需要特别区分“虚拟设备”与“仿真模型”。仿真模型可以只追求物理精度,而虚拟设备必须优先保证接口时序和信号语义与真实设备一致。例如真实变频器收到启动命令后,通常先输出“运行中”反馈,再经过加速时间达到设定频率;虚拟设备若忽略这个时序,PLC程序中的联锁和延时判断就会在调试中失效。

二、常见类型与适用场景

按信号形态,虚拟设备可分为四类。第一类是开关量执行器,如接触器、电磁阀、指示灯,其行为模型是“命令—反馈—延时”关系。第二类是模拟量执行器,如变频器、比例阀、加热器,需要处理量程映射、斜率限制和惯性环节。第三类是传感器类,如接近开关、光电开关、编码器、温度变送器,其核心是“物理位置/过程量→电信号”的转换关系。第四类是工艺单元类,如输送线、机械手、反应釜,通常由多个执行器和传感器组合而成,具有内部顺序和互锁逻辑。

选择哪种类型,取决于调试目标。若只验证PLC的启停和联锁逻辑,开关量执行器加传感器即可;若要验证PID回路和模拟量处理,必须引入带惯性和量程的模拟量模型;若要验证整线节拍和故障恢复,则需要工艺单元级模型。

三、行为模型的建立方法

行为模型的核心是定义“输入—状态—输出”的更新规则。以三相异步电机为例,PLC输出Q0.0为启动命令,Q0.1为停止命令,虚拟设备需要维护内部状态run、speed和fault。一个可用的简化模型如下:

// 电机虚拟设备行为模型(示例参数)
// 输入:start_cmd, stop_cmd, overload
// 状态:run, speed, fault
// 输出:run_fb, speed_ai, fault_fb

if (overload == 1) {
    fault = 1;
    run = 0;
    speed = 0;
} else if (start_cmd == 1 && stop_cmd == 0 && fault == 0) {
    run = 1;
    // 加速过程:每周期增加 5% 额定转速
    speed = min(speed + 5, 100);
} else if (stop_cmd == 1 || start_cmd == 0) {
    run = 0;
    // 减速过程:每周期减少 8% 额定转速
    speed = max(speed - 8, 0);
}

run_fb = run;
speed_ai = speed * 27648 / 100;  // 映射到西门子S7模拟量量程
fault_fb = fault;

这段模型虽然简单,但已经包含真实调试中必须观察的三个要素:命令优先级(过载优先于启动)、动态过程(加速和减速不是瞬间完成)、量程映射(内部百分比转换为PLC模拟量原始值)。在联合调试中,PLC程序若使用speed_ai做PID反馈,就能看到接近真实的调节过程,而不是理想阶跃。

四、接口抽象方法

接口抽象的目标是让PLC程序“感觉不到”对面是虚拟设备还是真实设备。常用做法是定义统一的接口描述表,把每个信号的方向、数据类型、地址、量程、默认值和更新周期固定下来。例如:

信号名方向数据类型PLC地址量程/含义
start_cmdPLC→虚拟设备BOOLQ0.01=启动
stop_cmdPLC→虚拟设备BOOLQ0.11=停止
run_fb虚拟设备→PLCBOOLI0.01=运行中
speed_ai虚拟设备→PLCINTIW640~27648对应0~100%
fault_fb虚拟设备→PLCBOOLI0.11=故障

接口抽象的关键原则有三条。第一,方向不可混淆:PLC输出到虚拟设备的信号,虚拟设备只能读不能写;虚拟设备反馈给PLC的信号,PLC只能读不能写。第二,量程和单位必须与真实设备一致,否则PID参数和报警阈值全部失效。第三,更新周期要匹配PLC扫描周期,通常虚拟设备以10~50ms周期更新,过快会增加通信负担,过慢会丢失短脉冲。

在联合调试初期,建议先只实现接口层,用强制变量验证PLC的输入输出映射是否正确;确认无误后再加入行为层,逐步增加惯性和延时,避免问题混在一起难以定位。

五、从模型到调试的闭环

一个完整的虚拟设备建模流程可以概括为:明确设备类型和调试目标→列出全部接口信号并制表→定义状态变量和更新规则→实现行为模型→与PLC建立通信→施加测试用例并观察反馈。判断模型是否可用,不看它是否“像真的”,而看它能否让PLC程序中的关键逻辑被正确触发和验证。例如,当PLC发出启动命令后,虚拟设备应在设定延时内返回运行反馈;当模拟过载信号时,故障反馈应置位并切断运行状态;当给定模拟量输出时,反馈值应按量程线性对应。只有这些判断点全部通过,虚拟设备才具备参与联合调试的资格。

虚拟设备建模:接口—行为—状态三层结构 PLC 程序 Q0.0 启动命令 Q0.1 停止命令 Q0.2 过载模拟 IW64 速度反馈 I0.0 运行反馈 虚拟设备(电机模型) 接口层:信号映射与量程转换 BOOL / INT / 0~27648 ↔ 0~100% 行为层:状态更新规则 过载优先 → 启动/停止判断 → 加速/减速斜坡 speed = min(speed+5,100) / max(speed-8,0) 状态层:run / speed / fault 保存当前运行状态、转速百分比、故障标志 命令 命令 激励 反馈 反馈 调试判断:命令发出后反馈是否按时序返回;模拟量是否按量程线性对应;故障时是否切断运行

把上述结构落实到工程中,虚拟设备就不再是零散脚本,而是一个可复用、可替换、可验证的调试对象。后续无论面对气缸、变频器还是整条输送线,都可以沿用“接口表—行为规则—状态变量—测试用例”的同一套建模思路,只是行为层的复杂度和状态数量不同。