一、MBD中的SIL
在MBD開發流程中,大家熟知的MIL、SIL、PIL、HIL這幾類在環測試方法,貫穿於整個開發過程,每種在環測試都有其關注的重點。例如MIL測試往往的關注的是在現有測試用例輸入下的的功能實現及測試覆蓋度情況,又如SIL關注的通常是生成的代碼與模型間的一致性。
今天起就討論一下在Simulink中SIL的幾種實現方式
![手把手教你,Simulink中的SIL實現方式](http://p2.ttnews.xyz/loading.gif)
二、Simulink實現SIL的幾種方式
SIL測試驗證通常是在MIL測試之後,也就是說已經有了MIL測試的測試框架以及測試用例、測試結果,在進行SIL測試驗證時,可沿用MIL測試框架,使用同樣的測試用例,對比MIL與SIL的測試結果,即可判斷模型與代碼是否一致。
在Simulink中實現SIL驗證,有三種方式可以採用
1、基於頂層模型進行SIL仿真驗證
2、基於模型引用進行SIL仿真驗證
3、基於SIL Block進行SIL仿真驗證
針對MIL測試時採用的不同測試框架,可採取上述三種方式進行SIL測試,編寫相應的腳本,實現自動化測試。
本片文章先對這兩種方法進行一個簡要的介紹和示例演示,後續文章會再對一些細節進行展開說明,以及實現整個MIL-->SIL的自動化測試以及輸出報告的思路等內容
三、Top-Model實現SIL驗證測試
Top Model,即如下圖所示樣式
![手把手教你,Simulink中的SIL實現方式](http://p2.ttnews.xyz/loading.gif)
這種測試框架中Test Case輸入在Workspace中進行定義,並打開測試模型的Load for workspace選項
模型的Simulation Mode為Normal模式時即進行MIL測試,Software-in-the-Loop (SIL)時即進行SIL測試。
為提高測試效率,實現自動化測試,可通過腳本方式進行相關測試環境的設置,執行仿真並保存仿真結果供後續輸出分析報告。
以下示例代碼可以實現最基本的自動測試過程(MIL測試和SIL測試),可以在此基礎上擴展更多的自動化處理功能。
model_name=gcs;
set_param(model_name,'StopTime','end_time');
set_param(model_name,'SolverType','Fixedstep')
set_param(model_name,'Solver','FixedStepDiscrete');
set_param(model_name,'FixedStep','0.01');
set_param(model_name,'SystemTargetFile','ert.tlc');
set_param(model_name,'PortableWordSizes','off');
set_param(model_name,'TargetHWDeviceType','Custom Processor->MATLAB Host Processor');
set_param(model_name,'ProdEqTarget','off');
set_param(model_name,'GenerateReport','on');
set_param(model_name,'LaunchReport','off');
set_param(model_name,'CodeExecutionProfiling','off');
set_param(model_name,'LoadExternalInput','on');
set_param(model_name,'ExternalInput',['input1,input2']);% MIL Simulation
setset_param(model_name,'SimulationMode','Normal');
[~,~,MIL_Out] = sim(model_name);% SIL Simulation
setset_param(model_name,'SimulationMode','Software-in-the-Loop (SIL)');
[~,~,SIL_Out] = sim(model_name);
上述代碼中的MIL_Out、SIL_Out 分別是MIL和SIL測試的結果,可以用最基本的plot函數輸出測試結果以及對比結果,如以下示例代碼:
fig1 = figure;
subplot(3,1,1),
plot(MIL_Out),
title('Output for Normal Simulation')
subplot(3,1,2), plot(SIL_Out),
title('Output for SIL Simulation')
subplot(3,1,3),
plot(MIL_Out-SIL_Out),
title('Difference Between Normal and SIL');
因為SIL測試主要是進行代碼與模型之間的一致性驗證,所以這裡只需對MIL_Out和SIL_Out求差值。
如果事先定義好一個Tolerance值,我們只要看下Difference between Normal and SIL這一結果就可以了,如果差值超過了Tolerance值,就認為SIL測試不能通過,模型與代碼之間不一致。
四、基於模型引用實現SIL驗證測試
採用Model Reference方式,即如下圖所示
Test Case可以使用Signal Builder構造,也可以使用From Workspace模塊
MIL測試時,Model Reference模塊Block Parameters中的Simulation mode為Normal
如果需要進行SIL測試,則只需將模塊的Simulation mode選為SIL模式,Code Interface可選擇Model Reference或者Top model兩種不同的方式
為了方便MIL和SIL結果進行對比,我們可以將上面待測的Model Reference模塊直接複製一個到當前模型下,並將其設置為SIL模式,如下圖:
Model為MIL模型,Model(SIL)為SIL模型,同時整個模型的Simulation mode為Normal,仿真時,首先會進行代碼生成操作,並使用當前的編譯器進行編譯,我們只需對上面兩個模塊的仿真輸出結果進行比較即可,這裡我們使用了Data Logging方式。
仿真結束後,打開Simulink Data Inspector,對兩個輸出結果進行Compare
SDI中自動繪製出比較結果
在SDI中我們也可以設置Tolerance值,例如:
上面對兩種比較常用的SIL實現方式進行了簡要說明,實際開發過程中,我們可以根據自己的需要採用不同的方式來實現SIL測試驗證。
當然,如果我們有Simulink Test工具箱的話,很多工作可以實現自動化,測試用例測試結果的管理也更方便,但萬變不離其宗,SIL測試的一些方法還都是通用的。
閱讀更多 助力China純電動之夢 的文章