作者:JACK(来源:IN4汽车人)
在基于模型的软件工程(MBSE)中,我们经常会谈到MIL/SIL/PIL和HIL,很多新入门者常常会搞混它们的含义,笔者撰写本文的目的是概要性的介绍XIL之间的区别与联系,尽我所能把它们讲清楚。
术语定义:
-
MIL:Model in loop, 验证控制算法模型是否准确地实现了功能需求
-
SIL: Software in loop, 在PC上验证代码实现的功能是否与模型一致
-
PIL: Processor in loop, 在目标处理器上验证代码实现的功能是否与模型一致
-
HIL: Hardware in loop, 在ECU/EPP/整套系统上验证代码实现的功能是否与需求定义一致。
几个常见问题:
-
这四个测试名字里都有in the loop,那么是不是一定要有闭环?
-
NO,某些控制算法实现的功能本身就是不带闭环的,比如接收到某信号后点亮某某灯,在这种情况下就不需要闭环。
-
是不是一定要有被控对象模型?
-
NO,在笔者有限的认知里
(1) 大部分狭义的的MIL(End2End Test)是需要带被控对象模型的(也有例外,如上文讲的某功能知识控制一个灯的开关,大没有必要建一个灯泡的模型),广义的MIL一般不care被控对象模型;
是不是MIL一定要用浮点数,SIL一定要用定点数?
-
No. 有些公司进行开发时直接跳过浮点模型用定点建模,在这种情况下,MIL也是用定点数进行测试;dsp和最新的MCU的浮点运算功能都已经很强大,支持用浮点数生成(编写)的代码,在这种情况下SIL也是用浮点来测试。
-
不是模型生成的代码可不可以做SIL?
-
Yes,前面已经讲了SIL不一定需要被控对象模型,手写代码也可以做SIL,只是测试用例需要提前根据功能定义好。
(一) MIL
MIL就是模型在环,通俗一点理解就是对模型在模型的开发环境下(如simulink)进行仿真,通过输入一系列的测试用例,验证模型是否满足了设计的功能需求。MIL是所有测试中最关键的,因为MIL的test accept criterion必须源于功能需求,没有其它的东西可以参考。而SIL/PIL的测试用例往往都是借用MIL的测试用例,一旦在MIL这个阶段的使用了错误测试用例,这个Bug很有可能会最终流出去,即便所有的测试都通过了。
a) 狭义的MIL
狭义的MIL一般指针对带被控对象模型,实现整个控制功能的模型进行End to End的测试。
如下图,电机控制的MIL模型有MotorController和PlantModel两个子模型组成:
PlantModel又包含:
-
Predriver
-
Mosfet全桥
-
电流采样电路
-
PMSM电机
-
电机位置传感器采集电路
运行simulink仿真,比如我们设定电池电压13V,电机转速800rpm,指令力矩2Nm,在scope中我们电机输出了较理想的正弦波,输出力矩也稳定在2Nm左右,如下:
做到这一步,MIL就算结束了吗?非也非也,MIL还有一个重要的任务是为SIL和PIL的testcase收集test vectors(TV)。仿真的侧重点在于功能是否已正确实现,而MIL在simulation的基础上,还要把所有的输入输出保存起来作为测试向量将来给SIL/PIL使用。
以MotorController为被控对象,让我们看看下表:
b) 广义的MIL
在软件测试领域还有一个很重要的概念是测试覆盖度,对于ASIL级别比较高的产品,一般都需要MCDC测试覆盖度100%,而如果模型比较复杂的话,往往前文所述的狭义的MIL很难达到100%的测试覆盖度,因此我们还需要对某一个具体的子功能模块特别设置一些测试用例来测试,在这种情况下,往往不使用PlantModel。
(二) SIL
SIL是一种等效性测试,测试的目的是验证代码与控制模型在所有功能上是完全一致的。其基本原则一般是使用与MIL完全相同的测试用例输入,将MIL的测试输出与SIL的测试输出进行对比,考察二者的偏差是否在可接受的范围之内?
因此这个测试的目的就决定了带不带被控对象模型并不是那么重要。SIL测试一般都在PC上完成,对代码的编译器一般都是LCC,SDK,MSC等这些。
至于SIL的实现方法,那真是五花八门多种多样了:
-
将代码封装成S function在simulink中进行比较
-
用Matlan GUI开发自定义MIL&SIL工具,完成simulink仿真、S-funtion仿真及比较功能(大部分工作都在后台完成,不用那么多鼠标键盘操作)
-
Matlab中通过将模型转换为SIL模型
set_param(model_name, ‘SimulationMode’,’Software-in-the-loop’)
-
使用Targetlink工具箱(死鬼死贵的说)
-
使用基于Microsoft Visual Studio或基于VSC环境开发的其它第三方测试工具,如MxVDev
-
使用与Matlab和Targetlink无缝链接的第三方工具,如BTC
(三) PIL
PIL测试与SIL测试的不同在于软件是使用的目标MCU的编译器(Tasking)进行编译链接,也需要运行在目标板上,其基本工作原理如下。
其测试通过准则是,使用与SIL相同的测试用例输入进行测试时,比较PIL和SIL的输出,如果两者之差在容许范围之内,则测试通过。
此外,PIL测试还能够测量某个功能模块的程序运行时间、堆栈(系统和用户)使用情况等等如下图,这些数据在所有软件功能模块集成之前对软件CPU Load、软件是否有跑飞的风险都是有非常大的帮助的。
篇幅所限,本文先写到这里。下一篇将以EPS为例来专题讨论这三个层级的HIL。
课程上线,关注IND4汽车人下载APP
《新能源汽车解读及动力构型》
,