4. SIL环境搭建与工程配置
MIL阶段验证的是算法逻辑本身,模型在Simulink等宿主环境中以解释或加速模式运行,浮点精度、采样周期、数据类型都由宿主统一管理。进入SIL后,控制算法必须变成一段能在目标处理器上真实执行的二进制代码,由目标编译器编译、目标运行时调度,并通过I/O仿真接口与虚拟被控对象交换数据。这一节要解决的核心问题就是:如何把MIL模型中的控制算法"搬"到目标环境里,并让它在SIL框架下跑起来、跑得对。
一、从模型到SIL可执行代码的两条路径
把控制算法变成SIL可执行代码,工程上有两条主流路径,选择哪条取决于模型形态和验证目标。
路径A:自动代码生成。适用于算法已在Simulink/Stateflow中建模、且模型已按代码生成规范整理(如使用Embedded Coder、配置定点数据类型、消除不可生成模块)。典型流程是:配置模型为固定步长求解器、设置目标硬件为"ert.tlc"、指定系统目标文件与代码生成报告,然后生成C代码与头文件。这条路径的优点是模型与代码同源,后续若模型修改可快速重新生成;缺点是生成代码的可读性和可追溯性依赖模型规范程度。
路径B:手工移植。适用于算法原本以C/C++手写、或模型中含有大量无法自动生成的查表/状态机逻辑。做法是把MIL中验证过的算法逻辑按目标平台的编码规范重写为C函数,保持输入输出接口与MIL一致,再接入SIL运行时。这条路径灵活,但必须建立"模型—代码"的对应关系文档,否则后续SIL与MIL结果比对时无法定位差异来源。
无论走哪条路径,SIL代码的接口必须与MIL模型严格对齐:输入端口数量、数据类型、采样周期、单位、量纲都要一致。这是后续MIL/SIL结果比对能成立的前提。
二、目标编译器与运行时配置
SIL代码要在目标处理器上运行,就必须用目标编译器编译。以常见的TI C2000系列DSP为例,工程配置通常包含以下关键项:
编译器:TI C2000 CGT (cl2000)
优化等级:-O2(SIL阶段建议与量产一致)
浮点支持:--float_support=fpu32(若目标含FPU)
运行时库:rts2800_fpu32.lib
链接命令文件:F2837xD_FLASH_lnk.cmd(按实际芯片修改)
采样中断:EPWM1 触发 ADC,ADC EOC 触发控制ISR
ISR周期:100 μs(对应10 kHz控制频率)
这里有几个容易出问题的点。第一,优化等级必须与量产一致,否则SIL通过但量产失败,或反之。第二,浮点支持选项要与目标芯片实际能力匹配,若目标无FPU却开了fpu32,链接会报错或运行异常。第三,中断周期和触发源要明确,SIL阶段常用定时器模拟,但量产可能由PWM或ADC触发,两者时序差异需要在SIL中提前暴露。
运行时配置还包括栈大小、堆使用策略、看门狗设置。SIL阶段建议先关闭看门狗或延长超时,避免调试过程中被复位干扰;但量产配置必须单独记录,不能把SIL的宽松配置直接带入量产。
三、I/O仿真接口的搭建
SIL与MIL最大的区别在于:MIL中模型直接读写工作空间变量,而SIL中算法代码运行在目标上,输入输出必须通过I/O仿真接口传递。常见做法有三种:
- 文件回放/记录:把MIL阶段记录的输入激励存为CSV或MAT文件,SIL运行时逐周期读取作为输入,输出写回文件。适合离线批量比对,实现简单,但不支持实时交互。
- 共享内存/管道:目标仿真器与宿主仿真环境通过共享内存或命名管道交换数据。适合需要实时观察中间变量的场景,配置稍复杂。
- 硬件在环接口卡:用真实DAC/ADC或FPGA接口卡连接目标板与宿主,模拟传感器和执行器信号。最接近真实工况,但需要额外硬件,成本最高。
选择哪种接口,取决于SIL验证的目标。如果只是验证算法在目标编译器下的数值行为,文件回放足够;如果要验证时序、中断响应、外设交互,则需要更接近硬件的接口。
四、配置检查与首次运行
工程配置完成后,不要直接跑完整测试用例。建议先做一次"最小闭环"验证:给一个恒定输入(如阶跃信号),观察SIL输出是否与MIL在相同输入下的输出一致。若不一致,按以下顺序排查:数据类型是否一致、采样周期是否一致、初始化条件是否一致、编译器优化是否改变了浮点运算顺序。
下面这张图展示了从MIL模型到SIL可执行代码的完整配置链路,以及各环节的关键检查点。
五、常见配置陷阱与排查顺序
SIL环境搭建中最常见的失败不是算法错误,而是配置不一致。以下按排查优先级列出典型问题:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| SIL输出与MIL偏差大 | 数据类型不一致(double vs single) | 检查模型端口数据类型与代码变量声明 |
| 输出相位滞后 | 采样周期或ISR周期不一致 | 对比MIL步长与SIL中断周期配置 |
| 首次输出异常后恢复 | 初始化条件或状态变量未复位 | 检查初始化函数与MIL初始条件 |
| 链接报错 | 浮点支持选项与芯片不匹配 | 确认芯片FPU能力与编译器选项 |
| 运行中复位 | 看门狗超时或栈溢出 | SIL阶段先关看门狗,检查栈使用峰值 |
排查时建议遵循"从接口到内部、从静态到动态"的顺序:先确认输入输出接口对齐,再确认初始化状态一致,最后才怀疑算法逻辑本身。绝大多数SIL与MIL的差异都发生在接口和配置层,而不是算法层。
完成上述配置后,SIL环境就具备了运行条件。下一步是用最小闭环验证配置正确性,再逐步扩展到完整测试用例。配置阶段多花时间对齐接口和参数,后续比对阶段就能少花时间排查"假差异"。