Simulink是基于時間序列的仿真系統,因此在我們進行單元測試的時候,往往會輸入一組時間相關的數據,通過Signal Builder、Signal Editor我們可以做到快速地創建一組時間序列數據。但是有的時候,我們更加關注軟件某些時刻的行為,且測試的觸發取決于一定的先決條件。這個時候,我們就需要基于場景的測試了。在Simulink中,Test Sequence/Test Assessment就很好地滿足了這一需求。我們今天主要聚焦于使用Test Sequence完成場景測試的編輯,以及對Test Sequence進行代碼生成。
使用Test Sequence
首先創建一個簡單的模型,實現一個簡單的功能:把輸入乘以2之后再輸出。這里我們可以選擇通過創建Harness來測試,在創建時勾選使用Test Sequence來驅動。
但是我們這里不選擇自動創建,而是手動創建Test Sequence,這樣我們能夠更好地體會它的功能。
新建一個測試專用的模型,并把待測試的目標模型引用進來,再創建一個空白的Test Sequence模塊。可以從引用模型的接口看到,該模型需要一個函數調用和一個輸入數據進行驅動。我們在Test Sequence模塊中完成這一工作。
打開Test Sequence模塊,可以看到左側欄是一些標識符的定義,右側就是場景編輯界面。每一條測試都是由步驟名、步驟動作、轉移條件、下一步驟組成,操作起來很像狀態機,語句也都是MATLAB語言,非常自然。
下面嘗試編輯一個場景:初始時(t=0),輸入賦值為0;t = 1時刻,輸入賦值為1,同時調用一次Step函數;t = 5時刻,輸入賦值為2,同時調用一次Step函數。我們第一次寫出來的Test Sequence如下所示。
連接好測試模型,設置為離散求解器,步長為0.2,仿真時間為10s,記錄輸出值以及事件。
運行仿真,查看Sequence Viewer如下。遺憾地發現,Step函數并沒有像我們預期的那樣,在1s和5s時刻運行一遍。這是因為Simulink還是基于時間序列的仿真,并不能真的只在1s和5s各自運行一次。Test Sequence只是提供了一些方便的場景編輯功能,在上面那種寫法中,Simulink維持了Step在每個時刻進行調用的設置。對于數據也是同樣的道理,雖然用戶只設置了一次,但是往后的仿真時間步會延續該次設置值,并持續產生數據。
因此,正確的寫法應該是如下所示。這樣能夠保證,Step函數真的只在期望的時刻發生調用了。
對Test Sequence生成代碼
Test Sequence模塊無疑是非常好用的工具,那么是否可以應用到SIL的測試場景中呢?答案是可以的。Test Sequence模塊可以生成代碼,這樣我們就可以得到一個C代碼的測試驅動程序。我們把上述Test Sequence模塊拷貝到一個新的Simulink模型中,并進行如下的配置,就可以生成我們想要的驅動代碼形式了。
這里注意以下幾點:
- Test Sequence模塊既輸出了信號,也輸出了函數調用,如果希望能夠在代碼中看到函數調用,就必須構造一個Function Call Subsystem和Function Caller來承接這個函數調用,如下所示。
- 對于輸出的信號如果有特殊的接口形式要求(比如某個全局變量,或者接口函數),那么可以通過Simulink自定義存儲類來實現,綁定此信號線和一個Simulink.Signal對象。像下面這樣,可以讓輸出為一個全局變量x;也可以是一個標準的RTE接口。
- 要注意驅動模型的仿真步長一定要和被測對象進行匹配。因為本Test Sequence模塊是放在一個定速率模型中,其運行節奏是由步長決定的,代碼生成中也可以看到,Test Sequence中所謂t == 1 ,after( 1 , sec)也都會轉換到相應的步長上。因此如果步長配置錯誤會導致測試驅動的節奏錯誤。(額外提一點,包含Test Sequence的模型配置成導出函數模型或AUTOSAR模型的話,在生成代碼上有困難。)
-
仿真器
+關注
關注
14文章
1019瀏覽量
83932 -
MATLAB語言
+關注
關注
0文章
12瀏覽量
8715 -
simulink仿真
+關注
關注
0文章
75瀏覽量
8611 -
sequence
+關注
關注
0文章
23瀏覽量
2862 -
求解器
+關注
關注
0文章
77瀏覽量
4557
發布評論請先 登錄
相關推薦
評論