手把手教你,Simulink中的SIL实现方式

一、MBD中的SIL

在MBD开发流程中,大家熟知的MIL、SIL、PIL、HIL这几类在环测试方法,贯穿于整个开发过程,每种在环测试都有其关注的重点。例如MIL测试往往的关注的是在现有测试用例输入下的的功能实现及测试覆盖度情况,又如SIL关注的通常是生成的代码与模型间的一致性。

今天起就讨论一下在Simulink中SIL的几种实现方式

手把手教你,Simulink中的SIL实现方式

二、Simulink实现SIL的几种方式

SIL测试验证通常是在MIL测试之后,也就是说已经有了MIL测试的测试框架以及测试用例、测试结果,在进行SIL测试验证时,可沿用MIL测试框架,使用同样的测试用例,对比MIL与SIL的测试结果,即可判断模型与代码是否一致。

在Simulink中实现SIL验证,有三种方式可以采用

1、基于顶层模型进行SIL仿真验证

2、基于模型引用进行SIL仿真验证

3、基于SIL Block进行SIL仿真验证

针对MIL测试时采用的不同测试框架,可采取上述三种方式进行SIL测试,编写相应的脚本,实现自动化测试。

本片文章先对这两种方法进行一个简要的介绍和示例演示,后续文章会再对一些细节进行展开说明,以及实现整个MIL-->SIL的自动化测试以及输出报告的思路等内容

三、Top-Model实现SIL验证测试

Top Model,即如下图所示样式

手把手教你,Simulink中的SIL实现方式

这种测试框架中Test Case输入在Workspace中进行定义,并打开测试模型的Load for workspace选项

手把手教你,Simulink中的SIL实现方式

手把手教你,Simulink中的SIL实现方式

模型的Simulation Mode为Normal模式时即进行MIL测试,Software-in-the-Loop (SIL)时即进行SIL测试。

手把手教你,Simulink中的SIL实现方式

为提高测试效率,实现自动化测试,可通过脚本方式进行相关测试环境的设置,执行仿真并保存仿真结果供后续输出分析报告。

以下示例代码可以实现最基本的自动测试过程(MIL测试和SIL测试),可以在此基础上扩展更多的自动化处理功能。

model_name=gcs;

set_param(model_name,'StopTime','end_time');

set_param(model_name,'SolverType','Fixedstep')

set_param(model_name,'Solver','FixedStepDiscrete');

set_param(model_name,'FixedStep','0.01');

set_param(model_name,'SystemTargetFile','ert.tlc');

set_param(model_name,'PortableWordSizes','off');

set_param(model_name,'TargetHWDeviceType','Custom Processor->MATLAB Host Processor');

set_param(model_name,'ProdEqTarget','off');

set_param(model_name,'GenerateReport','on');

set_param(model_name,'LaunchReport','off');

set_param(model_name,'CodeExecutionProfiling','off');

set_param(model_name,'LoadExternalInput','on');

set_param(model_name,'ExternalInput',['input1,input2']);% MIL Simulation

setset_param(model_name,'SimulationMode','Normal');

[~,~,MIL_Out] = sim(model_name);% SIL Simulation

setset_param(model_name,'SimulationMode','Software-in-the-Loop (SIL)');

[~,~,SIL_Out] = sim(model_name);

上述代码中的MIL_Out、SIL_Out 分别是MIL和SIL测试的结果,可以用最基本的plot函数输出测试结果以及对比结果,如以下示例代码:

fig1 = figure;

subplot(3,1,1),

plot(MIL_Out),

title('Output for Normal Simulation')

subplot(3,1,2), plot(SIL_Out),

title('Output for SIL Simulation')

subplot(3,1,3),

plot(MIL_Out-SIL_Out),

title('Difference Between Normal and SIL');

因为SIL测试主要是进行代码与模型之间的一致性验证,所以这里只需对MIL_Out和SIL_Out求差值。

如果事先定义好一个Tolerance值,我们只要看下Difference between Normal and SIL这一结果就可以了,如果差值超过了Tolerance值,就认为SIL测试不能通过,模型与代码之间不一致。

手把手教你,Simulink中的SIL实现方式

四、基于模型引用实现SIL验证测试

采用Model Reference方式,即如下图所示

手把手教你,Simulink中的SIL实现方式

Test Case可以使用Signal Builder构造,也可以使用From Workspace模块

MIL测试时,Model Reference模块Block Parameters中的Simulation mode为Normal

手把手教你,Simulink中的SIL实现方式

如果需要进行SIL测试,则只需将模块的Simulation mode选为SIL模式,Code Interface可选择Model Reference或者Top model两种不同的方式

手把手教你,Simulink中的SIL实现方式

为了方便MIL和SIL结果进行对比,我们可以将上面待测的Model Reference模块直接复制一个到当前模型下,并将其设置为SIL模式,如下图:

手把手教你,Simulink中的SIL实现方式

Model为MIL模型,Model(SIL)为SIL模型,同时整个模型的Simulation mode为Normal,仿真时,首先会进行代码生成操作,并使用当前的编译器进行编译,我们只需对上面两个模块的仿真输出结果进行比较即可,这里我们使用了Data Logging方式。

仿真结束后,打开Simulink Data Inspector,对两个输出结果进行Compare

手把手教你,Simulink中的SIL实现方式

SDI中自动绘制出比较结果

手把手教你,Simulink中的SIL实现方式

在SDI中我们也可以设置Tolerance值,例如:

手把手教你,Simulink中的SIL实现方式

上面对两种比较常用的SIL实现方式进行了简要说明,实际开发过程中,我们可以根据自己的需要采用不同的方式来实现SIL测试验证。

当然,如果我们有Simulink Test工具箱的话,很多工作可以实现自动化,测试用例测试结果的管理也更方便,但万变不离其宗,SIL测试的一些方法还都是通用的。


分享到:


相關文章: