1. 课程导入与全景认知

在控制系统开发中,Simulink 早已不只是“画框图做仿真”的工具。当模型需要与真实硬件、真实时间节拍发生关系时,它就进入了实时仿真与硬件在环(HIL)的领域。本课程的目标,是让你从“能跑通模型”走到“能把模型部署到实时目标机上,并与真实控制器或真实被控对象闭环运行”。

一、什么是实时仿真

普通 Simulink 仿真追求的是“结果正确”,仿真时间可以比真实时间快很多,也可以慢很多。实时仿真则增加了一个硬约束:模型的计算必须在规定的采样周期内完成,并且与真实时间同步。例如设定步长为 1 ms,那么每一步计算、I/O 读写、通信都必须在 1 ms 内结束,否则就会产生“超时(overrun)”。

实时仿真通常分为两类:

  • 软实时:在 Windows/Linux 通用操作系统上运行,超时不会造成灾难性后果,适合算法验证与快速原型。
  • 硬实时:在专用实时内核或实时目标机(如 Speedgoat、dSPACE、NI PXI)上运行,超时被严格禁止,适合安全相关与量产前验证。

判断实时性是否达标,核心看三个指标:采样周期、最坏执行时间(WCET)、超时次数。一般要求 WCET 不超过周期的 50%~70%,留出余量给 I/O 与通信抖动。

二、什么是HIL(硬件在环)

HIL 是 Hardware-in-the-Loop 的缩写。它的基本结构是:真实的控制器(ECU) + 实时仿真机(运行被控对象模型) + 信号接口。控制器以为自己连接的是真实的电机、电池或整车,实际上连接的是实时机上运行的被控对象模型。这样可以在没有真实被控对象的情况下,安全、可重复地测试控制器的功能、边界与故障响应。

HIL 的典型价值体现在三类场景:

  • 控制器测试:在真实 ECU 上验证控制逻辑,覆盖正常、边界、故障工况。
  • 快速控制原型(RCP):把 Simulink 控制算法直接部署到实时目标机,驱动真实被控对象。
  • 系统集成验证:多控制器、多总线(CAN、LIN、Ethernet)联合闭环,验证通信与协同逻辑。

三、Simulink 在实时仿真与HIL中的角色

Simulink 在这条链路中承担“模型来源”和“部署入口”两个角色。你写的控制算法、被控对象、信号处理、状态机,最终都要通过 Simulink Coder 生成 C 代码,再由 Embedded Coder 做产品级优化,最后通过 Simulink Real-Time 或第三方实时平台下载到目标机运行。整个过程中,模型不是“参考文档”,而是可执行、可部署、可复现的工程资产。

因此,模型本身的质量直接决定部署成败。以下问题在实时部署中会被放大:

  • 使用了不支持代码生成的模块(如 Interpreted MATLAB Function)。
  • 采样周期不统一,导致多速率系统在实时任务中难以调度。
  • 代数环、过零检测、变步长求解器在实时环境中不可用或代价过高。
  • 数据类型为 double,而目标机 I/O 是 int16 或 single,造成精度与溢出问题。

四、完整工具链与学习路径

本课程围绕一条主线展开:建模 → 配置 → 代码生成 → 实时部署 → 闭环调试 → 结果判读。工具链上,你会依次接触 Simulink、Stateflow、Simulink Coder、Embedded Coder、Simulink Real-Time、HDL Coder(选学),以及目标机硬件与 I/O 模块。学习路径上,先建立实时概念与模型规范,再进入代码生成与目标机配置,最后完成 HIL 闭环与故障注入测试。

实时仿真与HIL部署全景链路 Simulink 建模 控制算法 / 状态机 被控对象模型 信号 / 总线定义 定步长 / 离散化 数据类型与接口 代码生成配置 代码生成与部署 Simulink Coder Embedded Coder C/C++ 目标代码 Simulink Real-Time 目标机下载 实时任务调度 HIL 闭环运行 实时目标机 被控对象模型 I/O 驱动 / 通信 真实控制器 ECU 控制逻辑 CAN / 模拟 / 数字 信号接口 电压 / 电流 / 总线 激励信号 反馈信号 结果判读:超时次数 / 跟踪误差 / 故障响应 周期余量 ≥ 30% 视为实时性达标 模型 部署 学习路径:实时概念 → 模型规范 → 代码生成 → 目标机配置 → HIL 闭环 → 故障注入 → 结果判读

五、一个最小可运行的HIL示例

为了让你对参数有直观感受,这里给出一个教学示例(参数为合理假设,非实测结果)。被控对象为一阶惯性环节,时间常数 0.1 s,控制器为 PI,采样周期 1 ms,目标机为 Speedgoat Baseline,I/O 为模拟输入 0~5 V 对应 0~1000 rpm。

被控对象:G(s) = 1 / (0.1s + 1)
控制器:Kp = 2.0,Ki = 20
采样周期:Ts = 1 ms
目标机:Speedgoat Baseline
模拟输入:0~5 V → 0~1000 rpm
模拟输出:0~5 V → 0~10 N·m
CAN 通信:500 kbps,周期 10 ms

部署后,你需要在 Simulink Real-Time 的 Host 端观察三件事:任务执行时间是否稳定小于 0.7 ms;超时计数是否为 0;阶跃响应的上升时间是否接近 0.1 s 量级。如果执行时间接近 1 ms 或出现超时,优先检查模型中的连续模块、代数环和未离散化的传递函数。

提示:实时仿真不是“把仿真跑快一点”,而是“让模型在真实时间约束下可预测地运行”。模型规范、数据类型、采样周期和 I/O 接口,是决定部署成败的四个关键点。

六、本课程你将获得的能力

完成本课程后,你应该能够独立完成以下任务:将 Simulink 模型配置为可代码生成的实时模型;使用 Simulink Coder 生成 C 代码并检查代码报告;在 Simulink Real-Time 中建立目标机连接、下载模型并启动实时运行;搭建 HIL 闭环,注入传感器故障与通信丢帧;根据执行时间、超时计数和跟踪误差判断系统是否达标。这些能力不是孤立的工具操作,而是一条从模型到硬件的完整工程链路。