4. 从桌面仿真到实时仿真的模型改造
桌面仿真与实时仿真最本质的差别在于:桌面仿真中,Simulink 求解器可以自由决定每一步的计算时刻,只要在给定容差内满足精度要求即可;而实时仿真中,求解器必须在每个固定采样时刻到来之前完成该步的全部计算,并把结果通过 I/O 接口输出到外部硬件。因此,把普通 Simulink 模型改造成可实时运行的模型,核心工作可以归纳为三条主线:I/O 接口替换、采样时间统一、连续与离散系统转换。这三条主线不是彼此独立的,它们共同决定了模型能否在实时目标机上稳定运行。
一、I/O 接口替换:从“理想信号源”到“真实硬件通道”
桌面仿真中,我们习惯用 Step、Sine Wave、Constant 等理想信号源作为输入,用 Scope、To Workspace 作为输出。这些模块在实时仿真中并不存在对应的物理通道。实时仿真的输入来自 ADC 采样、编码器计数、CAN 报文或串口数据,输出则要写入 DAC、PWM 寄存器、GPIO 或通信接口。
改造时,第一步是把理想信号源替换为实时 I/O 模块。以常见的 Speedgoat 或 dSPACE 目标机为例,输入侧通常使用 Analog Input、Encoder Input、CAN Receive 等模块,输出侧使用 Analog Output、PWM Output、CAN Transmit 等模块。替换时要注意三个关键参数:通道号、电压/电流范围、分辨率与偏置。例如,一个 0~5 V 的模拟输入通道,若传感器输出为 0~10 V,就必须在模型中加入分压或增益修正,否则实时运行时会直接饱和或损坏接口。
此外,I/O 模块的采样时间必须与模型步长一致。很多初学者会把 I/O 模块的采样时间设为 -1(继承),这在桌面仿真中没问题,但在实时仿真中可能导致接口读写与求解器步长不同步,出现数据错位或丢帧。建议显式设置 I/O 模块的采样时间等于模型基础采样时间 Ts。
二、采样时间统一:多速率模型的实时化处理
桌面仿真中,模型里同时存在 0.001 s、0.01 s、0.1 s 等多个采样时间是常见现象。Simulink 求解器会自动处理这些多速率任务,但在实时仿真中,每个采样任务都对应一个实际的中断服务程序,任务过多会导致 CPU 负载过高,甚至错过截止时间。
改造时,首先要识别模型中的所有采样时间。可以在 Simulink 中执行 Simulink.BlockDiagram.getSampleTimes 或使用 Sample Time Legend 查看。然后根据控制器的实际需求,把采样时间归并为少数几个速率。通常建议:基础采样时间用于主控制回路,慢采样时间用于滤波、监控或通信,两者之间保持整数倍关系。例如,主控制回路用 1 ms,慢速监控用 10 ms,这样实时调度器可以按 1 ms 周期运行,每 10 个周期执行一次慢速任务。
对于必须保留的多速率结构,可以使用 Rate Transition 模块处理跨速率信号传递。注意:Rate Transition 模块要显式设置“确保数据完整性”选项,否则在实时运行中可能出现数据撕裂。如果模型中有 Zero-Order Hold 或 Unit Delay 模块,也要检查其采样时间是否与所在速率一致。
三、连续与离散系统转换:把“连续”变成“可计算”
实时仿真中,连续系统必须被离散化,因为实时目标机只能在离散时刻计算。Simulink 提供了两种方式:一是使用 Discrete 模块库中的离散积分器、离散传递函数等;二是使用 c2d 函数把连续传递函数离散化。
以连续传递函数 G(s) = 1/(0.1s + 1) 为例,若采样时间 Ts = 0.001 s,使用零阶保持器(ZOH)离散化后得到:
G(z) = (1 - exp(-Ts/0.1)) / (z - exp(-Ts/0.1))
= 0.00995 / (z - 0.99005)
在 Simulink 中,可以用 Discrete Transfer Fcn 模块实现,分子系数设为 [0.00995],分母系数设为 [1 -0.99005],采样时间设为 0.001。如果模型中有多个连续环节,建议逐个离散化,而不是把整个系统一次性离散化,这样便于调试和验证。
对于连续积分器,可以用 Discrete-Time Integrator 替代,选择前向欧拉、后向欧拉或梯形法。前向欧拉最简单,但稳定性较差;后向欧拉和梯形法稳定性更好,但计算量略大。在实时仿真中,通常优先选择后向欧拉或梯形法,以兼顾稳定性和精度。
四、改造后的模型检查清单
完成上述改造后,建议按以下清单逐项检查,确保模型具备实时运行条件:
- 所有输入输出是否已替换为实时 I/O 模块,通道号、量程、偏置是否正确;
- 模型基础采样时间是否已设置为目标机支持的周期,如 0.001 s;
- 是否存在未显式设置采样时间的模块,尤其是 I/O 和 Rate Transition;
- 连续模块是否已全部替换为离散模块,离散化方法是否合适;
- 模型是否包含代数环,若有,是否已加入
Unit Delay或Memory模块; - 模型是否包含可变步长求解器,实时仿真必须使用固定步长求解器;
- 模型是否包含
To Workspace、Scope等非实时模块,应替换为实时数据记录模块。
下面这张图概括了从桌面模型到实时模型的三条改造主线及其关键操作,可以作为改造过程中的对照参考。
完成改造后,建议先在桌面环境中用固定步长求解器运行一次,确认模型没有代数环、没有未定义采样时间、没有连续模块残留。然后下载到实时目标机,观察 CPU 负载是否低于 80%,I/O 数据是否与预期一致。若 CPU 负载过高,应优先检查是否有不必要的多速率任务或高频率 I/O 读写。只有通过实时运行验证,模型才算真正完成了从桌面仿真到实时仿真的改造。