我們在使用MBD開發軟件的過程中,經常會聽到MIL、SIL、PIL和HIL等In-the-Loop測試,這幾種測試之間到底是什麼關系,分别做什麼事情,下面我來簡單說說。
1模型在環測試(MIL)
圖1:模型在環測試(MIL)示意圖
如圖1所示,如果在模型中,将控制算法模型和被控對象模型連起來形成閉環,就是我們經常說的MIL,顧名思義,在模型層面上實現閉環測試。這種測試通常發生在兩種場景之下,一是系統工程師為了驗證算法,使用控制算法模型控制被控對象模型;另外一種是軟件工程師做模型級别的集成測試。當然,MIL測試的前提是要有被控對象模型,搭建被控對象模型或者采購現成的被控對象模型都可以。
2軟件在環測試(SIL)
SIL測試,這裡的是指控制策略模型轉換成的C代碼編譯之後的軟件。我們可以想象,對于圖1,如果我們把控制策略模型替換成由控制策略模型轉換得到的C代碼編譯後的DLL文件,如果我們使用了和MIL測試時相同的測試用例,如果我們的測試用例足夠多,如果我們得到了和MIL測試相同的結果,那麼我們是不是可以認為我們生成的C代碼就和用于代碼生成的模型是一緻的呢?沒錯,SIL測試的目的就是為了驗證自動生成的代碼和用于代碼生成的模型中行為上是一緻的。
也就是說SIL測試是一種等效性測試,既然是等效性測試,那麼我們就沒必要搭建圖1那樣的閉環模型,而可以用圖2實現等效性測試:
圖2:軟件在環測試(SIL)示意圖
其實提供了SIL仿真模式,所以,我們可以用更方便的方式實現SIL測試,使用(,’’,’-in-the-loop(SIL)’)設置算法模型的仿真模式為SIL,然後對比模式下的輸出結果即可,并且這樣做有助于過程自動化。如圖3所示:
圖3:選擇SIL仿真模式測試
3處理器在環測試(PIL)
SIL測試是驗證代碼和模型的一緻性,代碼運行在平台上,某種程度上說,這并不能保證代碼到目标處理器上的運行結果也能夠和模型保持一緻。所以,就有了PIL測試。
PIL和SIL的不同之處在于,SIL将生成的代碼通過DLL的方式運行在平台上,而PIL,是将生成的代碼運行到目标處理器上,兩種模式使用的編譯器也是不同的,SIL使用的就是下的編譯器,比如 C++或者LCC編譯器,而PIL使用的是目标編譯器。
前面說過,等效性測試的目的是為了防止代碼生成過程出錯,同樣,編譯過程也可能出錯,編譯器也可能有bug,綜合模型測試、SIL測試和PIL測試的結果,也可以幫助我們發現編譯器出錯可能引入的bug。
SIL和PIL是等效性測試,測試的目的是為了驗證自動生成的代碼和模型具有相同的行為,既然如此,對于SIL和PIL的測試用例就沒有功能意義上的要求,隻要要求代碼和模型輸入的測試數據相同即可,當然希望數據量足夠大,能夠覆蓋各種路徑以及各種信号範圍。
另外,因為PIL測試中代碼運行在實際的控制器上,所以PIL測試除了可以驗證代碼和模型是否一緻之外,還可以獲得算法在實際控制器上的最長運行時間,而這個最長時間的價值,做嵌入式實時軟件開發的工程師都懂得。
4硬件在環測試(HIL)
最後再說一下HIL測試,很多人會把HIL和PIL混淆,也有人認為PIL是一種簡化的HIL,理由是PIL測試的時候也需要引入硬件。這種理解是錯誤的。PIL和HIL測試的目的是不同的,PIL用于測試軟件和模型是否一緻,而HIL是用于測試控制器系統的,控制器系統包括了硬件、底層軟件和應用層軟件。HIL測試通常将一個被測控制器和工控機相連,工控機上運行着被控對象的模型,并且模拟出被控對象的一些電氣特性。在HIL場景下,被測試的控制器并不知道和它相連的是一台工控機,它會認為自己連接的就是真實的實物對象。
MIL、SIL、PIL三種測試都是和MBD開發模式下特有的,而HIL不同,無論你是否使用MBD開發,都可能需要做HIL,不是所有的應用都需要做HIL,但是以下兩種情況建議做HIL,1)在控制器軟硬件不成熟的條件下,運行出錯可能會導緻人身傷害或者重大财産損失的,2)在開發過程中,被控對象開發滞後于控制器開發的情況。另外,HIL測試通常比實物測試更節省成本,比如,做汽油機台架測試,需要有大量的汽油消耗,而通過HIL測試汽油機控制器,就沒有汽油消耗。但這并不是說HIL可以替代實物測試,HIL測試之後,通常會跟着做實物測試。
差不多了吧,如果記不住上面的大段文字,就請記住下面3點:
記住3點
1. MIL用于測算法
2. SIL和PIL用于測代碼(和模型的一緻性)
3. HIL用于測控制器系統
有話要說...