3. 被控对象模型开发与集成

在HIL(硬件在环)系统中,被控对象模型是连接真实控制器与虚拟环境的桥梁。控制器输出的PWM、CAN报文或模拟电压,需要由被控对象模型实时计算成电机转速、液压压力、电池SOC等物理量,再通过I/O板卡回馈给控制器。因此,被控对象模型的质量直接决定了HIL测试的可信度。本节围绕Simulink/AMESim建模、模型接口定义、代码生成、实时性校验与模型版本管理五个关键环节展开。

一、建模工具选型:Simulink与AMESim的分工

被控对象建模并非单一工具可以覆盖。工程实践中常见的做法是:控制逻辑、信号处理、电气系统用Simulink/Stateflow建模;液压、气动、热管理、多体动力学等物理域用AMESim建模。两者通过FMI/FMU标准进行联合仿真或模型交换。

以新能源汽车电机控制器HIL为例,被控对象包括:永磁同步电机(电气+机械)、减速器(机械)、电池包(电化学+热)、冷却回路(液压+热)。其中电机与电池的电特性适合Simulink建模,冷却回路和减速器润滑适合AMESim建模。若全部用Simulink搭建,液压管路动态需要大量微分方程,建模效率低且精度难以保证;若全部用AMESim,控制信号接口和代码生成又不够灵活。

选型原则:能用成熟物理库描述的跨域对象优先用AMESim;需要与控制器信号紧密耦合、需要频繁修改逻辑的部分优先用Simulink。两者通过FMU接口集成时,需注意FMU的输入输出端口数量、采样步长和求解器类型是否匹配。

二、模型接口定义:从信号清单到端口映射

接口定义是模型集成中最容易出错的环节。一个典型的HIL被控对象模型接口包含三类信号:

  • 控制器输出→模型输入:如PWM占空比、使能信号、目标扭矩、CAN指令帧。
  • 模型输出→控制器输入:如实际转速、母线电流、温度、故障标志、CAN状态帧。
  • 模型内部参数/标定量:如电机定子电阻、电感、转动惯量、电池内阻、冷却液比热容。

接口定义需要形成一份信号映射表,明确每个信号的名称、方向、数据类型、物理单位、量程、采样率和I/O通道。例如:

信号名方向类型单位量程采样率I/O通道
MCU_PWM_A控制器→模型uint16%0~10010 kHzPWM_IN_0
MotorSpeed模型→控制器int16rpm-12000~120001 kHzDAC_OUT_1
BusCurrent模型→控制器uint16A0~5001 kHzDAC_OUT_2
CoolantTemp模型→控制器int16℃-40~150100 HzCAN_MSG_0x18

接口定义完成后,需要在Simulink模型顶层建立对应的Inport/Outport,并配置信号属性(数据类型、采样时间)。对于AMESim模型,则需要在FMU导出时勾选对应的输入输出变量,并确保变量名与信号映射表一致。

三、代码生成:从模型到实时可执行代码

Simulink模型无法直接在实时目标机上运行,必须通过Embedded Coder生成C代码,再编译为实时目标机可加载的模块。代码生成的关键配置包括:

  • 求解器选择:定步长求解器(如ode4或ode1),步长与HIL仿真步长一致,通常为0.1 ms~1 ms。
  • 数据类型:所有信号必须显式指定数据类型,避免自动推导导致double类型在实时目标机上性能下降。
  • 代码优化:开启“inline parameters”和“remove root level I/O”,减少函数调用开销。
  • 目标硬件:选择与实时目标机匹配的硬件配置,如Speedgoat、dSPACE或NI PXI。

对于AMESim模型,通常导出为FMU 2.0 Co-Simulation格式,由HIL平台的FMU导入功能加载。此时需注意FMU的通信步长与Simulink模型的步长匹配,否则会出现代数环或数值不稳定。

% Simulink代码生成配置示例
cs = getActiveConfigSet('MotorPlant');
set_param(cs, 'Solver', 'FixedStepDiscrete');
set_param(cs, 'FixedStep', '0.0005');  % 0.5 ms
set_param(cs, 'SystemTargetFile', 'ert.tlc');
set_param(cs, 'TargetLang', 'C');
set_param(cs, 'GenCodeOnly', 'on');
set_param(cs, 'InlineParams', 'on');
rtwbuild('MotorPlant');

四、实时性校验:模型能否在步长内算完

实时性校验的核心问题是:模型在每一个仿真步长内,能否完成全部计算并输出结果?如果计算时间超过步长,就会发生超时(overrun),导致HIL系统时序错乱,控制器可能接收到错误或延迟的信号。

校验方法分为静态分析和动态测试两类。静态分析通过Simulink的“Execution Time”报告估算模型的计算负载;动态测试则在实时目标机上运行模型,通过CPU占用率、任务执行时间等指标判断。工程上通常要求模型计算时间不超过步长的50%,留出余量给I/O通信和操作系统调度。

若发现超时,可采取以下措施:降低模型复杂度(如用查表替代微分方程)、增大步长(需评估精度损失)、将部分模型拆分到多个CPU核心并行计算、或使用定点数替代浮点数。

被控对象模型开发与集成流程 Simulink建模 电机/电池/控制逻辑 定步长离散求解器 显式数据类型 AMESim建模 液压/热/多体动力学 物理库元件组合 FMU 2.0导出 接口定义 信号映射表 方向/类型/单位/量程 采样率/I/O通道 Inport/Outport配置 代码生成 Embedded Coder ert.tlc目标 FMU导入/联合仿真 编译为实时模块 实时性校验 计算时间 ≤ 50%步长 CPU占用率监测 超时(overrun)检测 优化:查表/定点/多核 版本管理 Git/SVN仓库 模型+代码+标定数据 版本号与HIL配置绑定 变更记录与追溯 迭代优化:模型修正/参数调整 关键约束:模型步长 = HIL仿真步长;接口信号名与I/O通道一一对应;版本号与测试用例绑定

五、模型版本管理:让每一次测试都可追溯

HIL测试中,同一个控制器版本可能对应多个被控对象模型版本。如果模型版本管理混乱,会出现“测试通过了但不知道用的是哪个模型”的问题。因此,被控对象模型必须纳入版本控制系统,与控制器软件版本、HIL配置版本形成对应关系。

版本管理的基本要求包括:

  • 模型文件、生成代码、标定数据三者必须同版本提交,不能只提交模型而遗漏生成的C代码或A2L文件。
  • 版本号规则建议采用“主版本.次版本.修订号”,主版本变更表示接口不兼容,次版本变更表示功能增加但接口兼容,修订号表示参数修正或bug修复。
  • 变更记录需注明修改内容、修改人、修改日期、关联的测试用例编号。
  • 与HIL配置绑定:在HIL测试报告中记录模型版本号,确保测试结果可复现。
常见问题:模型更新后未重新生成代码,导致HIL上运行的仍是旧版本;或AMESim FMU更新后未同步更新Simulink中的FMU导入模块,造成接口不匹配。建议在CI流水线中加入“模型版本一致性检查”步骤,自动比对模型文件哈希值与生成代码的版本标记。

六、集成检查清单

在模型交付HIL测试前,建议逐项确认以下内容:

检查项判断依据常见问题
接口信号完整性信号映射表与模型Inport/Outport一一对应遗漏故障标志信号
数据类型一致性模型信号类型与I/O板卡配置匹配double类型导致精度或性能问题
步长匹配模型步长 = HIL仿真步长AMESim FMU步长与Simulink不一致
实时性余量计算时间 ≤ 50%步长复杂液压模型超时
版本一致性模型/代码/标定数据版本号相同代码未重新生成
初始状态模型初始条件与控制器上电状态匹配转速初始值不为零导致控制器误判

被控对象模型的开发与集成是一个迭代过程。第一版模型往往只关注功能正确性,后续再逐步优化实时性和精度。关键是在每个迭代周期结束时,都确保模型版本、接口定义和测试结果三者一致,这样才能让HIL测试真正成为控制器验证的可信手段。