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可执行代码的完整配置链路,以及各环节的关键检查点。

MIL模型 → SIL可执行代码 配置链路 路径A:自动代码生成 Simulink模型 固定步长 / 定点化 Embedded Coder ert.tlc / 代码报告 生成C代码 + 头文件 + 接口描述 检查:端口类型 / 采样周期 / 单位 路径B:手工移植 MIL算法逻辑 查表 / 状态机 / 手写C 按目标规范重写 接口对齐 / 类型一致 C函数 + 接口文档 建立模型—代码对应关系 SIL可执行代码(目标编译器编译) cl2000 -O2 --float_support=fpu32 → .out 目标运行时 ISR调度 / 栈 / 看门狗 I/O仿真接口 文件回放 / 共享内存 / HIL卡 MIL/SIL结果比对 恒定输入 → 阶跃 → 全用例 关键检查点:数据类型一致 · 采样周期一致 · 初始化条件一致 · 优化等级与量产一致 · 中断触发源明确 首次运行建议:恒定输入 → 阶跃响应 → 逐项排查差异来源

五、常见配置陷阱与排查顺序

SIL环境搭建中最常见的失败不是算法错误,而是配置不一致。以下按排查优先级列出典型问题:

现象 可能原因 排查方法
SIL输出与MIL偏差大 数据类型不一致(double vs single) 检查模型端口数据类型与代码变量声明
输出相位滞后 采样周期或ISR周期不一致 对比MIL步长与SIL中断周期配置
首次输出异常后恢复 初始化条件或状态变量未复位 检查初始化函数与MIL初始条件
链接报错 浮点支持选项与芯片不匹配 确认芯片FPU能力与编译器选项
运行中复位 看门狗超时或栈溢出 SIL阶段先关看门狗,检查栈使用峰值

排查时建议遵循"从接口到内部、从静态到动态"的顺序:先确认输入输出接口对齐,再确认初始化状态一致,最后才怀疑算法逻辑本身。绝大多数SIL与MIL的差异都发生在接口和配置层,而不是算法层。

工程建议:为每个SIL工程建立一份配置基线文档,记录编译器版本、优化等级、浮点选项、中断周期、栈大小、看门狗状态。这份文档在后续SIL与HIL、量产阶段对比时是定位差异的第一手依据。

完成上述配置后,SIL环境就具备了运行条件。下一步是用最小闭环验证配置正确性,再逐步扩展到完整测试用例。配置阶段多花时间对齐接口和参数,后续比对阶段就能少花时间排查"假差异"。