3. 仿真模型基础
在 SysML 与仿真模型协同工程中,模型能否被正确“执行”,取决于它采用哪种仿真范式。仿真范式不是软件菜单里的一个选项,而是对系统时间行为、状态更新方式和求解机制的约定。选错范式,模型可能能编译、能运行,却给出物理上无意义的结果。本节从连续时间、离散事件、混合系统三类范式出发,说明它们各自的状态演化规律,并落到 Modelica、Simulink、FMI 三种常见技术的分工与协同方式上。
一、三类仿真范式的本质区别
连续时间仿真假设系统状态随时间连续变化,用微分方程或微分代数方程描述。典型对象是电路、机械传动、热传导、流体回路。其核心是求解器对状态变量积分:给定状态初值 x(t0) 和导数 dx/dt = f(x, u, t),求解器按步长推进。步长可以是固定的,也可以由误差控制自适应变化。连续仿真的关键参数是求解器类型(如显式/隐式)、相对容差、绝对容差和初始步长。容差过松会掩盖快速动态,过紧则显著增加计算量。
离散事件仿真假设系统状态只在离散时刻发生跳变,事件之间状态保持不变。典型对象是排队系统、生产调度、通信协议、任务状态机。其核心是事件调度:维护一个按时间排序的事件队列,每次取出最早事件,推进仿真时钟到该时刻,执行事件处理并可能产生新事件。离散事件仿真不关心事件之间的“连续过程”,而关心事件发生的顺序、时刻和条件。关键参数是事件优先级、同时事件的确定性处理规则,以及随机分布的种子。
混合系统仿真同时包含连续动态和离散跳变,是工程系统最常见的形态。例如一个温控系统:加热器功率连续变化,但恒温器在温度越过阈值时触发开关跳变。混合仿真的难点在于事件检测与状态重置:求解器必须识别连续变量何时穿越阈值(零交叉检测),在穿越点暂停积分、执行离散动作、重置状态,再继续积分。若事件检测不准确,会出现“错过跳变”或“反复穿越”的数值抖动。
二、Modelica:方程级、非因果的混合建模
Modelica 的核心特征是“方程建模、非因果”。建模者写的是 v = R*i、m*der(v) = F 这样的等式,而不是赋值语句。工具在编译期通过符号处理决定哪些变量是状态、哪些是代数变量,并完成方程排序。这使同一个电阻模型既能用于计算电流,也能用于反推电压,复用性远高于因果框图。
Modelica 对混合系统的支持体现在事件机制上。例如一个理想开关可以用 if 表达式描述:
model Thermostat
Real T(start = 20);
Boolean heating;
equation
heating = T < 22;
der(T) = if heating then 0.5 else -0.2;
when T > 24 then
reinit(T, 24);
end when;
end Thermostat;
这里 heating 是离散布尔量,der(T) 根据它切换。当温度越过 24 时,when 触发 reinit 重置状态。仿真时工具会自动检测 T > 24 的零交叉点,在穿越处暂停并执行重置。需要注意的是,when 条件只在事件瞬间为真时执行一次,不会持续触发,这与 if 的连续判断有本质区别。
三、Simulink:因果框图与求解器配置
Simulink 采用因果信号流建模,模块有明确的输入输出方向。连续部分用积分器模块表达,离散部分用单位延迟、零阶保持器表达,离散逻辑可用 Stateflow 状态机描述。Simulink 的求解器选择直接影响混合仿真的正确性:
- ode45:显式变步长,适合非刚性连续系统,遇到频繁事件时效率下降。
- ode15s:隐式变步长,适合刚性系统,如包含快慢时间尺度的热-电耦合模型。
- ode1/ode4:定步长,适合需要与离散控制器严格同步的实时或代码生成场景。
混合仿真中还需设置“过零检测”选项。若关闭过零检测,求解器可能直接跨过阈值,导致开关动作丢失。一个实用的检查方法是:把阈值附近的连续变量记录下来,确认仿真轨迹在阈值处确实发生了方向改变,而不是平滑穿过。
四、FMI:跨工具协同的接口标准
FMI(Functional Mock-up Interface)解决的是“不同工具建的模型如何一起仿真”。它定义了两类接口:
| 类型 | 含义 | 求解器归属 | 典型用途 |
|---|---|---|---|
| FMI for Model Exchange (ME) | 导出方程,不带走求解器 | 导入方主求解器 | 需要统一求解、紧耦合的系统 |
| FMI for Co-Simulation (CS) | 导出模型 + 自带求解器 | 导出方自带 | 工具封装、松耦合协同 |
CS 模式下,主仿真器在每个通信步长调用 FMU 的 doStep,FMU 内部用自己的求解器推进到该步长末尾,再交换输入输出。通信步长是协同仿真的关键参数:步长过大,耦合变量在步内被冻结,可能引入能量不守恒或数值不稳定;步长过小,则调用开销上升。工程上常从系统最快时间常数的 1/10 到 1/20 起步,再通过步长减半对比结果是否收敛来确定。
五、范式选择与协同建模的落地建议
面对一个具体系统,可以按以下顺序判断:先看状态是否连续变化,若是则用连续范式;再看是否存在只在特定时刻发生的逻辑跳变,若有则升级为混合;若系统本质是排队、调度、协议交互,状态在事件间不变,则用离散事件。SysML 侧的状态机图、活动图适合描述离散逻辑和事件顺序,而参数图、约束块适合描述连续方程,两者通过 FMI 或工具原生接口对接。
实际协同中,建议把连续物理模型封装为 FMU,把离散控制逻辑保留在 SysML 状态机或 Simulink Stateflow 中,由主仿真器统一调度。这样既保留了各工具的专业能力,又通过标准接口控制了集成复杂度。需要强调的是,无论采用哪种范式,都应先明确时间基准、单位制和事件优先级约定,否则跨工具协同极易出现“时间对不齐、单位不一致、事件顺序不确定”三类问题。