Simulink是基于時(shí)間序列的仿真系統(tǒng),因此在我們進(jìn)行單元測(cè)試的時(shí)候,往往會(huì)輸入一組時(shí)間相關(guān)的數(shù)據(jù),通過(guò)Signal Builder、Signal Editor我們可以做到快速地創(chuàng)建一組時(shí)間序列數(shù)據(jù)。但是有的時(shí)候,我們更加關(guān)注軟件某些時(shí)刻的行為,且測(cè)試的觸發(fā)取決于一定的先決條件。這個(gè)時(shí)候,我們就需要基于場(chǎng)景的測(cè)試了。在Simulink中,Test Sequence/Test Assessment就很好地滿足了這一需求。我們今天主要聚焦于使用Test Sequence完成場(chǎng)景測(cè)試的編輯,以及對(duì)Test Sequence進(jìn)行代碼生成。
使用Test Sequence
首先創(chuàng)建一個(gè)簡(jiǎn)單的模型,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的功能:把輸入乘以2之后再輸出。這里我們可以選擇通過(guò)創(chuàng)建Harness來(lái)測(cè)試,在創(chuàng)建時(shí)勾選使用Test Sequence來(lái)驅(qū)動(dòng)。
但是我們這里不選擇自動(dòng)創(chuàng)建,而是手動(dòng)創(chuàng)建Test Sequence,這樣我們能夠更好地體會(huì)它的功能。
新建一個(gè)測(cè)試專用的模型,并把待測(cè)試的目標(biāo)模型引用進(jìn)來(lái),再創(chuàng)建一個(gè)空白的Test Sequence模塊??梢詮囊媚P偷?a target="_blank">接口看到,該模型需要一個(gè)函數(shù)調(diào)用和一個(gè)輸入數(shù)據(jù)進(jìn)行驅(qū)動(dòng)。我們?cè)赥est Sequence模塊中完成這一工作。
打開(kāi)Test Sequence模塊,可以看到左側(cè)欄是一些標(biāo)識(shí)符的定義,右側(cè)就是場(chǎng)景編輯界面。每一條測(cè)試都是由步驟名、步驟動(dòng)作、轉(zhuǎn)移條件、下一步驟組成,操作起來(lái)很像狀態(tài)機(jī),語(yǔ)句也都是MATLAB語(yǔ)言,非常自然。
下面嘗試編輯一個(gè)場(chǎng)景:初始時(shí)(t=0),輸入賦值為0;t = 1時(shí)刻,輸入賦值為1,同時(shí)調(diào)用一次Step函數(shù);t = 5時(shí)刻,輸入賦值為2,同時(shí)調(diào)用一次Step函數(shù)。我們第一次寫(xiě)出來(lái)的Test Sequence如下所示。
連接好測(cè)試模型,設(shè)置為離散求解器,步長(zhǎng)為0.2,仿真時(shí)間為10s,記錄輸出值以及事件。
運(yùn)行仿真,查看Sequence Viewer如下。遺憾地發(fā)現(xiàn),Step函數(shù)并沒(méi)有像我們預(yù)期的那樣,在1s和5s時(shí)刻運(yùn)行一遍。這是因?yàn)镾imulink還是基于時(shí)間序列的仿真,并不能真的只在1s和5s各自運(yùn)行一次。Test Sequence只是提供了一些方便的場(chǎng)景編輯功能,在上面那種寫(xiě)法中,Simulink維持了Step在每個(gè)時(shí)刻進(jìn)行調(diào)用的設(shè)置。對(duì)于數(shù)據(jù)也是同樣的道理,雖然用戶只設(shè)置了一次,但是往后的仿真時(shí)間步會(huì)延續(xù)該次設(shè)置值,并持續(xù)產(chǎn)生數(shù)據(jù)。
因此,正確的寫(xiě)法應(yīng)該是如下所示。這樣能夠保證,Step函數(shù)真的只在期望的時(shí)刻發(fā)生調(diào)用了。
對(duì)Test Sequence生成代碼
Test Sequence模塊無(wú)疑是非常好用的工具,那么是否可以應(yīng)用到SIL的測(cè)試場(chǎng)景中呢?答案是可以的。Test Sequence模塊可以生成代碼,這樣我們就可以得到一個(gè)C代碼的測(cè)試驅(qū)動(dòng)程序。我們把上述Test Sequence模塊拷貝到一個(gè)新的Simulink模型中,并進(jìn)行如下的配置,就可以生成我們想要的驅(qū)動(dòng)代碼形式了。
這里注意以下幾點(diǎn):
- Test Sequence模塊既輸出了信號(hào),也輸出了函數(shù)調(diào)用,如果希望能夠在代碼中看到函數(shù)調(diào)用,就必須構(gòu)造一個(gè)Function Call Subsystem和Function Caller來(lái)承接這個(gè)函數(shù)調(diào)用,如下所示。
- 對(duì)于輸出的信號(hào)如果有特殊的接口形式要求(比如某個(gè)全局變量,或者接口函數(shù)),那么可以通過(guò)Simulink自定義存儲(chǔ)類來(lái)實(shí)現(xiàn),綁定此信號(hào)線和一個(gè)Simulink.Signal對(duì)象。像下面這樣,可以讓輸出為一個(gè)全局變量x;也可以是一個(gè)標(biāo)準(zhǔn)的RTE接口。
- 要注意驅(qū)動(dòng)模型的仿真步長(zhǎng)一定要和被測(cè)對(duì)象進(jìn)行匹配。因?yàn)楸綯est Sequence模塊是放在一個(gè)定速率模型中,其運(yùn)行節(jié)奏是由步長(zhǎng)決定的,代碼生成中也可以看到,Test Sequence中所謂t == 1 ,after( 1 , sec)也都會(huì)轉(zhuǎn)換到相應(yīng)的步長(zhǎng)上。因此如果步長(zhǎng)配置錯(cuò)誤會(huì)導(dǎo)致測(cè)試驅(qū)動(dòng)的節(jié)奏錯(cuò)誤。(額外提一點(diǎn),包含Test Sequence的模型配置成導(dǎo)出函數(shù)模型或AUTOSAR模型的話,在生成代碼上有困難。)
-
仿真器
+關(guān)注
關(guān)注
14文章
1035瀏覽量
85180 -
MATLAB語(yǔ)言
+關(guān)注
關(guān)注
0文章
12瀏覽量
8766 -
simulink仿真
+關(guān)注
關(guān)注
0文章
75瀏覽量
8754 -
sequence
+關(guān)注
關(guān)注
0文章
23瀏覽量
2991 -
求解器
+關(guān)注
關(guān)注
0文章
79瀏覽量
4721
發(fā)布評(píng)論請(qǐng)先 登錄
基于base test如何來(lái)構(gòu)造測(cè)試用例
CCS打開(kāi)simulink生成的dsp代碼
Simulink模型生成代碼
通過(guò)一個(gè)簡(jiǎn)單的Simulink模型生成代碼
手把手教你SIMULINK代碼生成
MATLAB/SIMULINK生成嵌入式代碼有哪些步驟
Simulink 自動(dòng)代碼生成原理分享
MathWorks推出新款代碼生成工具Simulink
MBD的Simulink使用技巧:詳解代碼生成中的模型與代碼(2)

利用Simulink自動(dòng)生成STM32串口代碼

simulink自動(dòng)生成ROS代碼

Simulink自動(dòng)生成代碼現(xiàn)階段的學(xué)習(xí)筆記

評(píng)論