
Simulink是基于時間序列的仿真系統(tǒng),因此在我們進(jìn)行單元測試的時候,往往會輸入一組時間相關(guān)的數(shù)據(jù),通過Signal Builder、Signal Editor我們可以做到快速地創(chuàng)建一組時間序列數(shù)據(jù)。但是有的時候,我們更加關(guān)注軟件某些時刻的行為,且測試的觸發(fā)取決于一定的先決條件。這個時候,我們就需要基于場景的測試了。在Simulink中,Test Sequence/Test Assessment就很好地滿足了這一需求。我們今天主要聚焦于使用Test Sequence完成場景測試的編輯,以及對Test Sequence進(jìn)行代碼生成。
使用Test Sequence
首先創(chuàng)建一個簡單的模型,實(shí)現(xiàn)一個簡單的功能:把輸入乘以2之后再輸出。這里我們可以選擇通過創(chuàng)建Harness來測試,在創(chuàng)建時勾選使用Test Sequence來驅(qū)動。


但是我們這里不選擇自動創(chuàng)建,而是手動創(chuàng)建Test Sequence,這樣我們能夠更好地體會它的功能。
新建一個測試專用的模型,并把待測試的目標(biāo)模型引用進(jìn)來,再創(chuàng)建一個空白的Test Sequence模塊??梢詮囊媚P偷?a target="_blank">接口看到,該模型需要一個函數(shù)調(diào)用和一個輸入數(shù)據(jù)進(jìn)行驅(qū)動。我們在Test Sequence模塊中完成這一工作。

打開Test Sequence模塊,可以看到左側(cè)欄是一些標(biāo)識符的定義,右側(cè)就是場景編輯界面。每一條測試都是由步驟名、步驟動作、轉(zhuǎn)移條件、下一步驟組成,操作起來很像狀態(tài)機(jī),語句也都是MATLAB語言,非常自然。

下面嘗試編輯一個場景:初始時(t=0),輸入賦值為0;t = 1時刻,輸入賦值為1,同時調(diào)用一次Step函數(shù);t = 5時刻,輸入賦值為2,同時調(diào)用一次Step函數(shù)。我們第一次寫出來的Test Sequence如下所示。

連接好測試模型,設(shè)置為離散求解器,步長為0.2,仿真時間為10s,記錄輸出值以及事件。

運(yùn)行仿真,查看Sequence Viewer如下。遺憾地發(fā)現(xiàn),Step函數(shù)并沒有像我們預(yù)期的那樣,在1s和5s時刻運(yùn)行一遍。這是因為Simulink還是基于時間序列的仿真,并不能真的只在1s和5s各自運(yùn)行一次。Test Sequence只是提供了一些方便的場景編輯功能,在上面那種寫法中,Simulink維持了Step在每個時刻進(jìn)行調(diào)用的設(shè)置。對于數(shù)據(jù)也是同樣的道理,雖然用戶只設(shè)置了一次,但是往后的仿真時間步會延續(xù)該次設(shè)置值,并持續(xù)產(chǎn)生數(shù)據(jù)。

因此,正確的寫法應(yīng)該是如下所示。這樣能夠保證,Step函數(shù)真的只在期望的時刻發(fā)生調(diào)用了。


對Test Sequence生成代碼
Test Sequence模塊無疑是非常好用的工具,那么是否可以應(yīng)用到SIL的測試場景中呢?答案是可以的。Test Sequence模塊可以生成代碼,這樣我們就可以得到一個C代碼的測試驅(qū)動程序。我們把上述Test Sequence模塊拷貝到一個新的Simulink模型中,并進(jìn)行如下的配置,就可以生成我們想要的驅(qū)動代碼形式了。

這里注意以下幾點(diǎn):
- Test Sequence模塊既輸出了信號,也輸出了函數(shù)調(diào)用,如果希望能夠在代碼中看到函數(shù)調(diào)用,就必須構(gòu)造一個Function Call Subsystem和Function Caller來承接這個函數(shù)調(diào)用,如下所示。

- 對于輸出的信號如果有特殊的接口形式要求(比如某個全局變量,或者接口函數(shù)),那么可以通過Simulink自定義存儲類來實(shí)現(xiàn),綁定此信號線和一個Simulink.Signal對象。像下面這樣,可以讓輸出為一個全局變量x;也可以是一個標(biāo)準(zhǔn)的RTE接口。


- 要注意驅(qū)動模型的仿真步長一定要和被測對象進(jìn)行匹配。因為本Test Sequence模塊是放在一個定速率模型中,其運(yùn)行節(jié)奏是由步長決定的,代碼生成中也可以看到,Test Sequence中所謂t == 1 ,after( 1 , sec)也都會轉(zhuǎn)換到相應(yīng)的步長上。因此如果步長配置錯誤會導(dǎo)致測試驅(qū)動的節(jié)奏錯誤。(額外提一點(diǎn),包含Test Sequence的模型配置成導(dǎo)出函數(shù)模型或AUTOSAR模型的話,在生成代碼上有困難。)


-
仿真器
+關(guān)注
關(guān)注
14文章
1045瀏覽量
86538 -
MATLAB語言
+關(guān)注
關(guān)注
0文章
12瀏覽量
8805 -
simulink仿真
+關(guān)注
關(guān)注
0文章
75瀏覽量
8920 -
sequence
+關(guān)注
關(guān)注
0文章
23瀏覽量
3141 -
求解器
+關(guān)注
關(guān)注
0文章
84瀏覽量
4885
發(fā)布評論請先 登錄
基于base test如何來構(gòu)造測試用例
使用Simulink自動生成浮點(diǎn)運(yùn)算HDL代碼(Part 1)
Simulink模型生成代碼
通過一個簡單的Simulink模型生成代碼
手把手教你SIMULINK代碼生成
MATLAB/SIMULINK生成嵌入式代碼有哪些步驟
Simulink 自動代碼生成原理分享
MathWorks推出新款代碼生成工具Simulink
MBD的Simulink使用技巧:詳解代碼生成中的模型與代碼(2)
simulink自動生成ROS代碼
Simulink自動生成代碼現(xiàn)階段的學(xué)習(xí)筆記

Simulink Test Sequence場景測試和代碼生成步驟
評論