李延紅,張書朋,李 成
(中國重型汽車集團有限公司技術(shù)發(fā)展中心,山東 濟南 250101)
在汽車嵌入式軟件V模式開發(fā)中,應(yīng)用層代碼一般會采用基于模型的開發(fā) (Model-Based Development,MBD)模式實現(xiàn)。即利用美國邁斯沃克 (MathWorks)公司研發(fā)的工業(yè)標準建模工具MATLAB建立算法模型,經(jīng)過浮點模型和定點模型測試完成后,會通過自動生成代碼工具Embedded coder自動生成代碼。本文對基于模型的開發(fā)MBD模式中大量重復(fù)性操作工作效率低問題,進行自動化腳本工具開發(fā),并通過發(fā)動機后處理控制算法模型進行腳本工具應(yīng)用驗證。1 基于MBD軟件開發(fā)
隨著汽車嵌入式軟件復(fù)雜程度的增加、系統(tǒng)開發(fā)周期的逐漸縮短,基于MBD軟件開發(fā)模式逐漸替代傳統(tǒng)C代碼開發(fā)方式?;贛BD軟件開發(fā)模式可以用建模工具對復(fù)雜邏輯進行設(shè)計,使得系統(tǒng)需求分析與軟硬件開發(fā)結(jié)合更加緊密,系統(tǒng)分析可以直接與設(shè)計結(jié)合;在軟件開發(fā)仿真開始,開發(fā)人員就可以調(diào)試邏輯,加快調(diào)試進度;可以自動生成代碼,避免手工編碼方式可能存在的低級錯誤;模型建立后,可利用快速原型仿真,加快需求設(shè)計完善;模型可移植性高,可迅速建立系統(tǒng)設(shè)計模塊庫,節(jié)約開發(fā)成本。
基于MBD軟件開發(fā)流程,開發(fā)汽車嵌入式軟件依次經(jīng)過系統(tǒng)設(shè)計、模型設(shè)計、C代碼生成編譯、硬件代碼生成調(diào)試、硬件在環(huán)、實車測試6個步驟。在實車測試之前,模型設(shè)計階段完成之后,會對應(yīng)系統(tǒng)功能設(shè)計進行MIL(model in the loop,模型在環(huán))測試,從模型仿真階段驗證模型功能實現(xiàn)滿足系統(tǒng)功能定義;C代碼生成編譯階段完成后,會對應(yīng)模型設(shè)計進行SIL(software in the loop,代碼在環(huán))測試,從代碼階段驗證模型與生成代碼功能一致性;硬件代碼生成調(diào)試階段完成后,會對應(yīng)C代碼生成編譯階段進行PIL(processor in the loop,處理器在環(huán))測試,驗證模型與運行在目標處理器上的代碼功能一致性;硬件在環(huán)階段,會對應(yīng)系統(tǒng)功能定義進行HIL(hardware in the loop,硬件在環(huán))測試,用物理模型控制器和控制模型控制器聯(lián)合驗證是否滿足系統(tǒng)功能定義。基于MBD開發(fā)流程如圖1所示。
由圖1可見,基于MBD開發(fā)嵌入式軟件時,基于系統(tǒng)功能定義準確搭建模型、保證代碼生成與模型一致性是關(guān)鍵。由于要達到準確搭建模型、保證代碼與模型一致,要求按照MBD開發(fā)流程進行大量重復(fù)性操作,因此有必要進行模型開發(fā)自動化腳本工具開發(fā),以便提高工作效率。
圖1 基于MBD軟件開發(fā)流程
基于MBD流程進行嵌入式軟件模型開發(fā)時,一般經(jīng)過浮點模型搭建、浮點模型規(guī)范化、浮點模型測試、浮點模型多模型檢查、定點模型搭建、定點模型規(guī)范化、定點模型測試、定點模型多模型檢查、代碼生成、代碼測試、代碼集成11個步驟?;贛BD模型開發(fā)流程如圖2所示。
1)步驟1:浮點模型搭建
首先根據(jù)系統(tǒng)功能定義進行浮點double數(shù)據(jù)類型模型搭建,模型復(fù)雜程度隨著功能不同而不同。汽車嵌入式軟件開發(fā)中一般會遵循MISRA C規(guī)范,規(guī)范要求模塊使用和模型可視兩方面。規(guī)范使用Simulink模塊在搭建過程中可以通過使用模型庫來提高效率,由于模塊庫會不斷更新,因此在搭建模型時需要使用最新版本模塊庫。規(guī)范模型可視化對應(yīng)到Simulink中搭建模型時需要將模型分層、信號線上需要顯示信號名稱、信號線需要對齊。由于模型分層會造成不同層子系統(tǒng)之間輸入輸出口需要手動連接,還會造成連接后的信號線凌亂。
浮點模型搭建過程自動化需求為:模塊庫版本確認、懸空的輸入輸出口信號線連接、輸入輸出口信號線對齊、模型頂層信號線上添加變量名稱、非模型頂層信號線上添加信號繼承標志以顯示信號變量名稱、刪除冗余變量。
2)步驟2:浮點模型規(guī)范化檢查
浮點模型規(guī)范化檢查采用Simulink工具Model Advisor來實現(xiàn)。由于Simulink工具Model Advisor檢查涵蓋的規(guī)范較廣,開發(fā)人員很難確定檢查項。
浮點模型規(guī)范化檢查過程自動化需求為:自動調(diào)用Model Advisor和自動選擇符合本項目要求的檢查項來檢查模型規(guī)范符合度。
3)步驟3:浮點模型測試
浮點模型測試過程中會首先用Simulink工具Simulink Design Verifier進行形式檢查,然后用Simulink工具Simulink Test進行功能驗證。由于測試會根據(jù)結(jié)果反復(fù),需要多次手動打開測試工具,在功能驗證階段多次手動導(dǎo)入測試用例及測試結(jié)果。
圖2 基于MBD模型開發(fā)流程
在浮點模型測試過程自動化需求為:自動調(diào)用Simulink Design Verifier對模型進行形式化檢查、自動調(diào)用Simulink Test搭建測試模型、導(dǎo)入測試用例、運行及保存測試結(jié)果。
4)步驟4:浮點模型多模型檢查
浮點模型多模型檢查主要是核對接口信號是否存在遺漏或者重復(fù)的情況。
在浮點模型多模型檢查過程自動化需求為:批量提取模型接口信號名稱、核對接口信號來源及去處、檢查所有模型中全局系統(tǒng)常數(shù)數(shù)值沖突。
5)步驟5:定點模型搭建
由于浮點模型均是double類型,生成代碼占用空間大且執(zhí)行效率低,因此在保證代碼效率、數(shù)據(jù)精度和數(shù)據(jù)范圍前提下需要將浮點模型轉(zhuǎn)換為定點模型。浮點模型轉(zhuǎn)換為定點模型過程中需要對每個信號及模塊定標,工作繁瑣且容易產(chǎn)生錯誤。
定點模型搭建過程自動化需求為:建立數(shù)據(jù)對象、關(guān)聯(lián)數(shù)據(jù)字典和模型中的數(shù)據(jù)對象、定標整數(shù)常數(shù)模塊為最短長度的整型類型、自動定標輸出線上有測量變量的模塊為“向后繼承”屬性、將子系統(tǒng)設(shè)置為原子子系統(tǒng)。
6)步驟6:定點模型規(guī)范化
定點模型規(guī)范化檢查主要分為用Simulink工具Model Advisor來實現(xiàn)定點部分檢查以及定標合理性檢查。
定點模型規(guī)范化過程自動化需求為:自動調(diào)用Model Advisor檢查、頂層輸入必須有信號且關(guān)聯(lián)、減法輸出類型設(shè)定不為無符號數(shù)、數(shù)據(jù)類型為浮點或超過32位。
7)步驟7:定點模型測試
定點測試方法與浮點測試相同,測試結(jié)果要與浮點測試結(jié)果對比以便核對定點過程中的精度損失是否在允許范圍內(nèi)。
在定點模型測試過程自動化需求為:自動調(diào)用Simulink Design Verifier進行形式化檢查、自動調(diào)用Simulink Test進行功能測試、進行定點模型和浮點模型測試結(jié)果對比。
8)步驟8:定點模型多模型檢查
定點模型多模型檢查主要是核對接口信號及全局系統(tǒng)常數(shù)是否存在數(shù)據(jù)類型沖突。
定點模型多模型檢查過程自動化需求為:批量提取模型接口信號名稱、核對接口信號數(shù)據(jù)類型、檢查全局系統(tǒng)常數(shù)數(shù)據(jù)類型。
9)步驟9:代碼生成
代碼生成通過Simulink工具Embedder Coder來實現(xiàn),不同經(jīng)驗開發(fā)人員單獨使用代碼生成工具時花費時間不同,造成開發(fā)周期增長;自動生成的代碼中包含全局變量的定義和聲明,導(dǎo)致全局變量會重復(fù)定義和聲明;自動生成的代碼會自動放置在模型所在文件夾下新建‘模型名_ert_rtw’文件夾,導(dǎo)致集成時讀取不方便。
代碼生成過程自動化需求為:自動調(diào)用自動生成代碼模板配置批量生成代碼、將所有模型生成代碼放到一個文件夾。
10)步驟10:代碼測試
代碼測試通過SIL進行,即將模型自動生成的C代碼封裝為可以在MATLAB環(huán)境中執(zhí)行的S函數(shù)模塊,代替定點模型進行測試。
代碼測試過程自動化需求為:自動調(diào)用SIL測試,進行SIL測試和定點模型測試結(jié)果對比。
11)步驟11:代碼集成
代碼集成是將生成代碼放置在代碼編譯環(huán)境中集成,手動操作容易造成版本失誤。
代碼集成過程自動化需求為:生成全局系統(tǒng)常數(shù)聲明文件、自動生成A2L文件。
MALTAB自帶的M語言采用解釋執(zhí)行的方式,繼承了計算、可視化以及數(shù)據(jù)表達式相似的編程環(huán)境,降低編程所需難度并節(jié)省時間。M語言提供的函數(shù)能夠控制模型仿真、獲取和設(shè)置模型及模塊的屬性,還支持模型的打開、關(guān)閉、保存以及模塊的拷貝、移動、刪除及信號線的連接和斷開。
本文采用M語言編寫各功能函數(shù),通過GUI可視化界面函數(shù)調(diào)用的方式實現(xiàn)。
1)建模輔助腳本GUI可視化界面
自動化工具可讀性非常重要,本文利用GUI制作了自動化工具運行可視化界面。按照MBD開發(fā)過程中自動化需求逐條體現(xiàn)在界面以checkbox形式顯示,運行界面圖如圖3所示。MBD開發(fā)單個功能模型時,運用本自動化工具需要先將模型打開。然后按照自動化需求勾選check box,點擊pushbutton屬性運行按鈕即可完成自動化操作。
圖3 建模輔助腳本工具運行界面圖
開發(fā)時首先通過guide命令創(chuàng)建空GUI界面,然后將每條自動化需求以checkbox形式進行界面設(shè)計,實現(xiàn)時是pushbutton屬性運行按鈕回調(diào)函數(shù)調(diào)用功能函數(shù)來實現(xiàn),實現(xiàn)代碼如圖4所示。
2)自動化功能函數(shù)
M語言提供的函數(shù)可以控制模型仿真,獲取和設(shè)置模型、模塊的屬性等功能,自動化功能函數(shù)是利用M語言本身提供的函數(shù)獲取功能自動化對象,然后增加判斷邏輯實現(xiàn)。
圖4 自動化工具調(diào)用自動化需求功能函數(shù)代碼示例
浮點模型搭建過程中自動化需求均是對模型中的Simulink模塊的屬性進行修改,基本采用find_system、get_param、set_param函數(shù)來實現(xiàn)。用find_system函數(shù)來找到要自動化實現(xiàn)的模塊路徑或句柄,用get_param獲取自動化模塊名或者屬性,用set_param函數(shù)來實現(xiàn)模塊參數(shù)設(shè)置。自動化需求模型頂層信號線增加變量名稱代碼如圖5所示。
圖5 模型頂層信號線增加變量名稱代碼示例圖
浮點模型規(guī)范化檢查是針對自動調(diào)用Model Advisor工具來實現(xiàn)的,用ModelAdvisor工具中函數(shù)來實現(xiàn),如ModelAdvisor.Run為運行Model Advisor工具,圖6為自動調(diào)用Model Advisor工具代碼示例圖。
圖6 自動調(diào)用Model Advisor工具代碼示例圖
浮點模型測試是自動調(diào)用Simulink工具Simulink Design Verifier和Simulink工具Simulink Test。自動調(diào)用Simulink工具Simulink Design Verifier直接采用sldvrun函數(shù)來實現(xiàn),Simulink工具Simulink Test工具調(diào)用采用sltest.harness.create函數(shù)來創(chuàng)建測試模型,導(dǎo)入測試用例進行測試。
浮點模型多模型檢查實現(xiàn)時首先用find_sysytem函數(shù)提取找到各個子模塊輸入輸出變量和全局系統(tǒng)常數(shù),然后用strcmp函數(shù)對比較輸入輸出來源及系統(tǒng)常數(shù)數(shù)值。
定點模型搭建過程中的建立數(shù)據(jù)對象時是利用mpt.Signal函數(shù)和mpt.Parameter函數(shù)來創(chuàng)建,代碼示例可見圖7。數(shù)據(jù)對象關(guān)聯(lián)、自動定標整數(shù)、自動定標為向后繼承及設(shè)置為原子子系統(tǒng)均是對模型或者模塊進行設(shè)置,基本采用find_system、get_param、set_param函數(shù)來實現(xiàn)。
定點模型規(guī)范化實現(xiàn)自動調(diào)用Model Advisor檢查時代碼基本與浮點模型規(guī)范化代碼一致,設(shè)置CheckIDList來實現(xiàn)不同測試配置。
頂層輸入信號關(guān)聯(lián)、減法輸出類型設(shè)定不為無符號數(shù)、數(shù)據(jù)類型為浮點或超過32位判斷可通過find_sysytem函數(shù)及strcmp函數(shù)來實現(xiàn)。
定點模型測試測試實現(xiàn)與浮點模型測試實現(xiàn)代碼基本一致,實現(xiàn)定點模型和浮點模型測試結(jié)果對比通過strcmp函數(shù)來實現(xiàn)。
定點模型多模型檢查實現(xiàn)與浮點模型多模型檢查實現(xiàn)代碼基本一致,通過find_sysytem函數(shù)及strcmp函數(shù)來實現(xiàn)。
代碼生成過程自動調(diào)用自動生成代碼模板配置批量生成代碼實現(xiàn)時是首先用open函數(shù)打開第一個模型,然后對該模型進行生成代碼配置及生成代碼,保存,然后再打開下一個模型直至結(jié)束。單獨模型生成代碼配置及生成代碼實現(xiàn)代碼示例如圖8所示。
圖7 建立數(shù)據(jù)對象代碼示例
圖8 單獨模型生成代碼配置及生成代碼實現(xiàn)代碼示例
將所有模型生成代碼放到一個文件夾是依次循環(huán)將所有模型生成代碼文件放到一個文件夾,單個模型生成代碼放到一個文件夾代碼實現(xiàn)示例如圖9所示。
圖9 單個模型生成代碼放到一個文件夾代碼實現(xiàn)示例
代碼測試過程實現(xiàn)調(diào)用SIL測試,進行SIL測試和定點模型測試結(jié)果對比時首先創(chuàng)建測試模型,然后進行正常測試和SIL測試,最后進行結(jié)果對比。示例代碼如圖10所示。
圖10 SIL測試實現(xiàn)代碼示例
代碼集成過程實現(xiàn)生成全局系統(tǒng)常數(shù)聲明文件時與生成數(shù)據(jù)對象代碼基本一致,使用mpt.Parameter來實現(xiàn)。自動生成A2L文件是將自動生成代碼中單獨子模塊生成的A2L文件組成為一個A2L文件,刪去重復(fù)生成的變量,并利用編譯代碼生成的MAP文件進行地址替換。在替換地址時首先要進行變量識別,識別過程采用正則表達式實現(xiàn)。識別標定量正則表達式部分代碼示例如圖11所示。
圖11 識別標定量正則表達式代碼示例
以某型發(fā)動機后處理再生開關(guān)故障判斷模型為例,由于正常情況下后處理再生開關(guān)按下之后10s之內(nèi)會自動彈起,當后處理再生開關(guān)按下狀態(tài)持續(xù)大于20s則認為后處理再生開關(guān)處于按下卡滯狀態(tài)。當發(fā)動機后處理再生開關(guān)處于按下卡滯狀態(tài)時,會導(dǎo)致再生請求一直存在,發(fā)動機后處理顆粒捕集器存在燒熔的風險。
按照功能定義手工搭建模型如圖12所示。
圖12 手工搭建浮點原始模型
從圖12可見,該模塊使用了模塊庫,但是明顯不是最新版本模塊庫,輸入輸出口信號凌亂、信號線上無變量名。
運行自動化腳本工具勾選項如圖13所示,點擊運行模型變化為圖14所示。
圖13 浮點功能建模自動化工具運行界面
由圖14可見,執(zhí)行完自動化操作后,模型替換為最新版本模塊庫,輸入輸出口信號整齊,信號線上添加了變量名,模型封裝為子系統(tǒng)且子系統(tǒng)變量名默認取模型名。當存在多個子系統(tǒng)時模型名后依次加序號區(qū)別。
本文針對MBD模式開發(fā)過程中大量重復(fù)性工作導(dǎo)致的效率低問題進行開發(fā)自動化腳本工具,采用MATLAB/M語言來實現(xiàn)。本文的MBD軟件開發(fā)自動化腳本工具提高了開發(fā)人員工作效率,降低了對開發(fā)人員針對MBD開發(fā)模式的專業(yè)程度,細節(jié)化操作選項靈活組合提高了腳本復(fù)用率。該自動化腳本工具開發(fā)方法為同領(lǐng)域嵌入式軟件自動化開發(fā)提供了借鑒參考。
圖14 浮點功能建模自動化執(zhí)行后模型圖