我經(jīng)常跟做MBD開發(fā)的朋友說(shuō):
MBD軟件開發(fā)中一定要做SIL。
為什么這么說(shuō)?下面我來(lái)掰扯掰扯。
MSIL測(cè)試的背景
SIL測(cè)試的目的是為了驗(yàn)證自動(dòng)生成的代碼和用于代碼生成的模型的一致性,做這項(xiàng)測(cè)試的初衷是因?yàn)榇a生成過(guò)程可能會(huì)引入錯(cuò)誤。注意,我這里提到的代碼生成過(guò)程出錯(cuò),這里面可能涵蓋兩方面的錯(cuò)誤:
來(lái)自于代碼生成工具本身:代碼生成工具作為一款軟件,它和其他所有軟件一樣,都是可能有bug的,沒(méi)有哪個(gè)軟件公司可以承諾自己公司的軟件產(chǎn)品沒(méi)有bug,MathWorks也不例外;
來(lái)自于代碼生成用戶:代碼生成過(guò)程是一個(gè)可以定制化的過(guò)程,用戶在這個(gè)過(guò)程中可能做一些自己的定制,如果定制化的內(nèi)容沒(méi)有經(jīng)過(guò)嚴(yán)格、充分的驗(yàn)證,那么也是很容易引入bug的。
并且,相比之下,第二種錯(cuò)誤發(fā)生的概率會(huì)更大一些。
既然這個(gè)過(guò)程可能引入bug,那么,即便是正確的模型,也可能被生成出來(lái)不正確的代碼。為了防止這類bug,SIL測(cè)試是有必要做的。當(dāng)然,也有人說(shuō)他們對(duì)代碼生成過(guò)程不做定制,并且,他們也充分信任MathWorks的代碼生成工具。
我們選擇了代碼生成工具,選擇了代碼生成的開發(fā)模式,我們自然是信任代碼生成工具的。問(wèn)題是,信任不能保證代碼生成工具就不發(fā)生錯(cuò)誤,盡管代碼生成工具發(fā)生錯(cuò)誤的概率非常小,小到很多用戶可能從來(lái)沒(méi)有遇到過(guò),但概率小不代表沒(méi)有,咱們中國(guó)有句老話,叫做“以防萬(wàn)一”,即便是非常小概率發(fā)生的事情,可一旦發(fā)生,很可能會(huì)帶來(lái)很嚴(yán)重的后果。如果可以通過(guò)增加一個(gè)環(huán)節(jié),在基本上不增加開發(fā)成本的情況下,就可以驗(yàn)證代碼和模型的一致性,就可以避免代碼生成過(guò)程出錯(cuò)導(dǎo)致的最終結(jié)果出錯(cuò),那我們又有什么理由拒絕呢?
沒(méi)錯(cuò),SIL就是這樣一種測(cè)試,基本上不增加你的開發(fā)時(shí)間,又能夠“以防萬(wàn)一”。
M為什么SIL測(cè)試能夠“以防萬(wàn)一”
如上圖所示,SIL測(cè)試是對(duì)比測(cè)試,測(cè)試過(guò)程中,我們給代碼編譯成的可執(zhí)行文件和用于代碼生成的模型相同的輸入,我們觀測(cè)它們的輸出是否一致,如果輸入信號(hào)的數(shù)據(jù)量足夠大,能夠覆蓋各種路徑,涵蓋各種信號(hào)范圍,并且兩者的輸出結(jié)果一致,我們可以大致認(rèn)為代碼和模型做行為上是一致的。
M為什么SIL基本上不增加開發(fā)時(shí)間
測(cè)試用例創(chuàng)建
SIL測(cè)試發(fā)生在代碼生成之后,我們知道,代碼生成的前提是模型經(jīng)過(guò)充分驗(yàn)證,所以SIL測(cè)試階段,模型的單元測(cè)試早已完成,我們可以復(fù)用模型單元測(cè)試時(shí)使用的測(cè)試用例,所以,測(cè)試過(guò)程中耗時(shí)最多的測(cè)試用例設(shè)計(jì)環(huán)節(jié)在SIL測(cè)試的時(shí)候就不再是問(wèn)題。
前面我們提到,SIL測(cè)試的測(cè)試數(shù)據(jù)越多越好,如果我們認(rèn)為單元測(cè)試的測(cè)試用例不夠多,沒(méi)有關(guān)系,除了使用單元測(cè)試的測(cè)試用例之外,還可以通過(guò)工具自動(dòng)產(chǎn)生測(cè)試用例,在MathWorks工具鏈中,Simulink Design Verifier就可以用于自動(dòng)生成測(cè)試用例。注意,我在SIL測(cè)試的時(shí)候提到自動(dòng)產(chǎn)生測(cè)試用例,這種測(cè)試用例不能用于功能測(cè)試,因?yàn)檫@種測(cè)試用例不能表達(dá)功能意義,但卻能滿足覆蓋率要求。我們做SIL測(cè)試的時(shí)候,驗(yàn)證的就是相同的測(cè)試輸入條件下,代碼和模型產(chǎn)生出相同的輸出,所以這個(gè)環(huán)節(jié)沒(méi)有必要關(guān)心功能,這個(gè)環(huán)節(jié)里,我們希望有覆蓋各種狀況的大量數(shù)據(jù)。
測(cè)試過(guò)程的執(zhí)行
在有了測(cè)試用例之后,可以通過(guò)幾行命令執(zhí)行測(cè)試過(guò)程。假如我們使用了如下命令
slvnvmakeharness(‘demo_model’)
創(chuàng)建了測(cè)試框架,如下圖:
假如測(cè)試數(shù)據(jù)已經(jīng)導(dǎo)入到SignalBuilder模塊,那么,SIL測(cè)試只需執(zhí)行如下命令:
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);
兩次仿真的結(jié)果被分別保存在model_output和SIL_output里面,對(duì)比這兩個(gè)變量,并給出報(bào)告,就算是完成SIL過(guò)程了。這里compare_and_report()不是MATLAB內(nèi)置的函數(shù),需要用戶按照自己的要求自行編寫,無(wú)非是把兩次仿真的結(jié)果做對(duì)比,并生成報(bào)告,僅此而已。
現(xiàn)在可以理解我為什么一直強(qiáng)調(diào)一定要做SIL的原因了吧?因?yàn)椋?/p>
SIL不增加開發(fā)時(shí)間,又能夠做到“以防萬(wàn)一”。
往期 | 老胡專欄
為什么要基于模型設(shè)計(jì)?
自動(dòng)代碼生成五大原則
說(shuō)說(shuō)代碼生成中的數(shù)據(jù)管理
什么樣的模型算正確的模型?
簡(jiǎn)單說(shuō)說(shuō)MIL、SIL、PIL和HIL
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7067瀏覽量
89127 -
輸入信號(hào)
+關(guān)注
關(guān)注
0文章
458瀏覽量
12575
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論