我经常跟做MBD开发的朋友说:
MBD软件开发中一定要做SIL。
为什么这么说?下面我来掰扯掰扯。
MSIL测试的背景
SIL测试的目的是为了验证自动生成的代码和用于代码生成的模型的一致性,做这项测试的初衷是因为代码生成过程可能会引入错误。注意,我这里提到的代码生成过程出错,这里面可能涵盖两方面的错误:
来自于代码生成工具本身:代码生成工具作为一款软件,它和其他所有软件一样,都是可能有bug的,没有哪个软件公司可以承诺自己公司的软件产品没有bug,MathWorks也不例外;
来自于代码生成用户:代码生成过程是一个可以定制化的过程,用户在这个过程中可能做一些自己的定制,如果定制化的内容没有经过严格、充分的验证,那么也是很容易引入bug的。
并且,相比之下,第二种错误发生的概率会更大一些。
既然这个过程可能引入bug,那么,即便是正确的模型,也可能被生成出来不正确的代码。为了防止这类bug,SIL测试是有必要做的。当然,也有人说他们对代码生成过程不做定制,并且,他们也充分信任MathWorks的代码生成工具。
我们选择了代码生成工具,选择了代码生成的开发模式,我们自然是信任代码生成工具的。问题是,信任不能保证代码生成工具就不发生错误,尽管代码生成工具发生错误的概率非常小,小到很多用户可能从来没有遇到过,但概率小不代表没有,咱们中国有句老话,叫做“以防万一”,即便是非常小概率发生的事情,可一旦发生,很可能会带来很严重的后果。如果可以通过增加一个环节,在基本上不增加开发成本的情况下,就可以验证代码和模型的一致性,就可以避免代码生成过程出错导致的最终结果出错,那我们又有什么理由拒绝呢?
没错,SIL就是这样一种测试,基本上不增加你的开发时间,又能够“以防万一”。
M为什么SIL测试能够“以防万一”
如上图所示,SIL测试是对比测试,测试过程中,我们给代码编译成的可执行文件和用于代码生成的模型相同的输入,我们观测它们的输出是否一致,如果输入信号的数据量足够大,能够覆盖各种路径,涵盖各种信号范围,并且两者的输出结果一致,我们可以大致认为代码和模型做行为上是一致的。
M为什么SIL基本上不增加开发时间
测试用例创建
SIL测试发生在代码生成之后,我们知道,代码生成的前提是模型经过充分验证,所以SIL测试阶段,模型的单元测试早已完成,我们可以复用模型单元测试时使用的测试用例,所以,测试过程中耗时最多的测试用例设计环节在SIL测试的时候就不再是问题。
前面我们提到,SIL测试的测试数据越多越好,如果我们认为单元测试的测试用例不够多,没有关系,除了使用单元测试的测试用例之外,还可以通过工具自动产生测试用例,在MathWorks工具链中,Simulink Design Verifier就可以用于自动生成测试用例。注意,我在SIL测试的时候提到自动产生测试用例,这种测试用例不能用于功能测试,因为这种测试用例不能表达功能意义,但却能满足覆盖率要求。我们做SIL测试的时候,验证的就是相同的测试输入条件下,代码和模型产生出相同的输出,所以这个环节没有必要关心功能,这个环节里,我们希望有覆盖各种状况的大量数据。
测试过程的执行
在有了测试用例之后,可以通过几行命令执行测试过程。假如我们使用了如下命令
slvnvmakeharness(‘demo_model’)
创建了测试框架,如下图:
假如测试数据已经导入到SignalBuilder模块,那么,SIL测试只需执行如下命令:
test_frame_name=‘demo_model_harness’;
set_param(test_frame_name,‘SaveOutput’,‘on’);
set_param(test_frame_name,‘OutputSaveName’,’model_output’);
set_param(‘demo_model_harnss/TestUnit’,’SimulationMode’,’Normal’);
sim(test_frame_name);
set_param(test_frame_name,‘OutputSaveName’,’SIL_output’);
set_param(‘demo_model_harnss/TestUnit’,’SimulationMode’,’Software-in-the-Loop(SIL)’);
sim(test_frame_name);
compare_and_report(model_output,SIL_output);
两次仿真的结果被分别保存在model_output和SIL_output里面,对比这两个变量,并给出报告,就算是完成SIL过程了。这里compare_and_report()不是MATLAB内置的函数,需要用户按照自己的要求自行编写,无非是把两次仿真的结果做对比,并生成报告,仅此而已。
现在可以理解我为什么一直强调一定要做SIL的原因了吧?因为:
SIL不增加开发时间,又能够做到“以防万一”。
往期 | 老胡专栏
为什么要基于模型设计?
自动代码生成五大原则
说说代码生成中的数据管理
什么样的模型算正确的模型?
简单说说MIL、SIL、PIL和HIL
全部0条评论
快来发表一下你的评论吧 !