李延紅,張書朋,李 成
(中國重型汽車集團有限公司技術發展中心,山東 濟南 250101)
在汽車嵌入式軟件V模式開發中,應用層代碼一般會采用基于模型的開發 (Model-Based Development,MBD)模式實現。即利用美國邁斯沃克 (MathWorks)公司研發的工業標準建模工具MATLAB建立算法模型,經過浮點模型和定點模型測試完成后,會通過自動生成代碼工具Embedded coder自動生成代碼。本文對基于模型的開發MBD模式中大量重復性操作工作效率低問題,進行自動化腳本工具開發,并通過發動機后處理控制算法模型進行腳本工具應用驗證。1 基于MBD軟件開發
隨著汽車嵌入式軟件復雜程度的增加、系統開發周期的逐漸縮短,基于MBD軟件開發模式逐漸替代傳統C代碼開發方式。基于MBD軟件開發模式可以用建模工具對復雜邏輯進行設計,使得系統需求分析與軟硬件開發結合更加緊密,系統分析可以直接與設計結合;在軟件開發仿真開始,開發人員就可以調試邏輯,加快調試進度;可以自動生成代碼,避免手工編碼方式可能存在的低級錯誤;模型建立后,可利用快速原型仿真,加快需求設計完善;模型可移植性高,可迅速建立系統設計模塊庫,節約開發成本。
基于MBD軟件開發流程,開發汽車嵌入式軟件依次經過系統設計、模型設計、C代碼生成編譯、硬件代碼生成調試、硬件在環、實車測試6個步驟。在實車測試之前,模型設計階段完成之后,會對應系統功能設計進行MIL(model in the loop,模型在環)測試,從模型仿真階段驗證模型功能實現滿足系統功能定義;C代碼生成編譯階段完成后,會對應模型設計進行SIL(software in the loop,代碼在環)測試,從代碼階段驗證模型與生成代碼功能一致性;硬件代碼生成調試階段完成后,會對應C代碼生成編譯階段進行PIL(processor in the loop,處理器在環)測試,驗證模型與運行在目標處理器上的代碼功能一致性;硬件在環階段,會對應系統功能定義進行HIL(hardware in the loop,硬件在環)測試,用物理模型控制器和控制模型控制器聯合驗證是否滿足系統功能定義。基于MBD開發流程如圖1所示。
由圖1可見,基于MBD開發嵌入式軟件時,基于系統功能定義準確搭建模型、保證代碼生成與模型一致性是關鍵。由于要達到準確搭建模型、保證代碼與模型一致,要求按照MBD開發流程進行大量重復性操作,因此有必要進行模型開發自動化腳本工具開發,以便提高工作效率。

圖1 基于MBD軟件開發流程
基于MBD流程進行嵌入式軟件模型開發時,一般經過浮點模型搭建、浮點模型規范化、浮點模型測試、浮點模型多模型檢查、定點模型搭建、定點模型規范化、定點模型測試、定點模型多模型檢查、代碼生成、代碼測試、代碼集成11個步驟。基于MBD模型開發流程如圖2所示。
1)步驟1:浮點模型搭建
首先根據系統功能定義進行浮點double數據類型模型搭建,模型復雜程度隨著功能不同而不同。汽車嵌入式軟件開發中一般會遵循MISRA C規范,規范要求模塊使用和模型可視兩方面。規范使用Simulink模塊在搭建過程中可以通過使用模型庫來提高效率,由于模塊庫會不斷更新,因此在搭建模型時需要使用最新版本模塊庫。規范模型可視化對應到Simulink中搭建模型時需要將模型分層、信號線上需要顯示信號名稱、信號線需要對齊。由于模型分層會造成不同層子系統之間輸入輸出口需要手動連接,還會造成連接后的信號線凌亂。
浮點模型搭建過程自動化需求為:模塊庫版本確認、懸空的輸入輸出口信號線連接、輸入輸出口信號線對齊、模型頂層信號線上添加變量名稱、非模型頂層信號線上添加信號繼承標志以顯示信號變量名稱、刪除冗余變量。
2)步驟2:浮點模型規范化檢查
浮點模型規范化檢查采用Simulink工具Model Advisor來實現。由于Simulink工具Model Advisor檢查涵蓋的規范較廣,開發人員很難確定檢查項。
浮點模型規范化檢查過程自動化需求為:自動調用Model Advisor和自動選擇符合本項目要求的檢查項來檢查模型規范符合度。
3)步驟3:浮點模型測試
浮點模型測試過程中會首先用Simulink工具Simulink Design Verifier進行形式檢查,然后用Simulink工具Simulink Test進行功能驗證。由于測試會根據結果反復,需要多次手動打開測試工具,在功能驗證階段多次手動導入測試用例及測試結果。

圖2 基于MBD模型開發流程
在浮點模型測試過程自動化需求為:自動調用Simulink Design Verifier對模型進行形式化檢查、自動調用Simulink Test搭建測試模型、導入測試用例、運行及保存測試結果。
4)步驟4:浮點模型多模型檢查
浮點模型多模型檢查主要是核對接口信號是否存在遺漏或者重復的情況。
在浮點模型多模型檢查過程自動化需求為:批量提取模型接口信號名稱、核對接口信號來源及去處、檢查所有模型中全局系統常數數值沖突。
5)步驟5:定點模型搭建
由于浮點模型均是double類型,生成代碼占用空間大且執行效率低,因此在保證代碼效率、數據精度和數據范圍前提下需要將浮點模型轉換為定點模型。浮點模型轉換為定點模型過程中需要對每個信號及模塊定標,工作繁瑣且容易產生錯誤。
定點模型搭建過程自動化需求為:建立數據對象、關聯數據字典和模型中的數據對象、定標整數常數模塊為最短長度的整型類型、自動定標輸出線上有測量變量的模塊為“向后繼承”屬性、將子系統設置為原子子系統。
6)步驟6:定點模型規范化
定點模型規范化檢查主要分為用Simulink工具Model Advisor來實現定點部分檢查以及定標合理性檢查。
定點模型規范化過程自動化需求為:自動調用Model Advisor檢查、頂層輸入必須有信號且關聯、減法輸出類型設定不為無符號數、數據類型為浮點或超過32位。
7)步驟7:定點模型測試
定點測試方法與浮點測試相同,測試結果要與浮點測試結果對比以便核對定點過程中的精度損失是否在允許范圍內。
在定點模型測試過程自動化需求為:自動調用Simulink Design Verifier進行形式化檢查、自動調用Simulink Test進行功能測試、進行定點模型和浮點模型測試結果對比。
8)步驟8:定點模型多模型檢查
定點模型多模型檢查主要是核對接口信號及全局系統常數是否存在數據類型沖突。
定點模型多模型檢查過程自動化需求為:批量提取模型接口信號名稱、核對接口信號數據類型、檢查全局系統常數數據類型。
9)步驟9:代碼生成
代碼生成通過Simulink工具Embedder Coder來實現,不同經驗開發人員單獨使用代碼生成工具時花費時間不同,造成開發周期增長;自動生成的代碼中包含全局變量的定義和聲明,導致全局變量會重復定義和聲明;自動生成的代碼會自動放置在模型所在文件夾下新建‘模型名_ert_rtw’文件夾,導致集成時讀取不方便。
代碼生成過程自動化需求為:自動調用自動生成代碼模板配置批量生成代碼、將所有模型生成代碼放到一個文件夾。
10)步驟10:代碼測試
代碼測試通過SIL進行,即將模型自動生成的C代碼封裝為可以在MATLAB環境中執行的S函數模塊,代替定點模型進行測試。
代碼測試過程自動化需求為:自動調用SIL測試,進行SIL測試和定點模型測試結果對比。
11)步驟11:代碼集成
代碼集成是將生成代碼放置在代碼編譯環境中集成,手動操作容易造成版本失誤。
代碼集成過程自動化需求為:生成全局系統常數聲明文件、自動生成A2L文件。
MALTAB自帶的M語言采用解釋執行的方式,繼承了計算、可視化以及數據表達式相似的編程環境,降低編程所需難度并節省時間。M語言提供的函數能夠控制模型仿真、獲取和設置模型及模塊的屬性,還支持模型的打開、關閉、保存以及模塊的拷貝、移動、刪除及信號線的連接和斷開。
本文采用M語言編寫各功能函數,通過GUI可視化界面函數調用的方式實現。
1)建模輔助腳本GUI可視化界面
自動化工具可讀性非常重要,本文利用GUI制作了自動化工具運行可視化界面。按照MBD開發過程中自動化需求逐條體現在界面以checkbox形式顯示,運行界面圖如圖3所示。MBD開發單個功能模型時,運用本自動化工具需要先將模型打開。然后按照自動化需求勾選check box,點擊pushbutton屬性運行按鈕即可完成自動化操作。

圖3 建模輔助腳本工具運行界面圖
開發時首先通過guide命令創建空GUI界面,然后將每條自動化需求以checkbox形式進行界面設計,實現時是pushbutton屬性運行按鈕回調函數調用功能函數來實現,實現代碼如圖4所示。
2)自動化功能函數
M語言提供的函數可以控制模型仿真,獲取和設置模型、模塊的屬性等功能,自動化功能函數是利用M語言本身提供的函數獲取功能自動化對象,然后增加判斷邏輯實現。

圖4 自動化工具調用自動化需求功能函數代碼示例
浮點模型搭建過程中自動化需求均是對模型中的Simulink模塊的屬性進行修改,基本采用find_system、get_param、set_param函數來實現。用find_system函數來找到要自動化實現的模塊路徑或句柄,用get_param獲取自動化模塊名或者屬性,用set_param函數來實現模塊參數設置。自動化需求模型頂層信號線增加變量名稱代碼如圖5所示。

圖5 模型頂層信號線增加變量名稱代碼示例圖
浮點模型規范化檢查是針對自動調用Model Advisor工具來實現的,用ModelAdvisor工具中函數來實現,如ModelAdvisor.Run為運行Model Advisor工具,圖6為自動調用Model Advisor工具代碼示例圖。

圖6 自動調用Model Advisor工具代碼示例圖
浮點模型測試是自動調用Simulink工具Simulink Design Verifier和Simulink工具Simulink Test。自動調用Simulink工具Simulink Design Verifier直接采用sldvrun函數來實現,Simulink工具Simulink Test工具調用采用sltest.harness.create函數來創建測試模型,導入測試用例進行測試。
浮點模型多模型檢查實現時首先用find_sysytem函數提取找到各個子模塊輸入輸出變量和全局系統常數,然后用strcmp函數對比較輸入輸出來源及系統常數數值。
定點模型搭建過程中的建立數據對象時是利用mpt.Signal函數和mpt.Parameter函數來創建,代碼示例可見圖7。數據對象關聯、自動定標整數、自動定標為向后繼承及設置為原子子系統均是對模型或者模塊進行設置,基本采用find_system、get_param、set_param函數來實現。
定點模型規范化實現自動調用Model Advisor檢查時代碼基本與浮點模型規范化代碼一致,設置CheckIDList來實現不同測試配置。
頂層輸入信號關聯、減法輸出類型設定不為無符號數、數據類型為浮點或超過32位判斷可通過find_sysytem函數及strcmp函數來實現。
定點模型測試測試實現與浮點模型測試實現代碼基本一致,實現定點模型和浮點模型測試結果對比通過strcmp函數來實現。
定點模型多模型檢查實現與浮點模型多模型檢查實現代碼基本一致,通過find_sysytem函數及strcmp函數來實現。
代碼生成過程自動調用自動生成代碼模板配置批量生成代碼實現時是首先用open函數打開第一個模型,然后對該模型進行生成代碼配置及生成代碼,保存,然后再打開下一個模型直至結束。單獨模型生成代碼配置及生成代碼實現代碼示例如圖8所示。

圖7 建立數據對象代碼示例

圖8 單獨模型生成代碼配置及生成代碼實現代碼示例
將所有模型生成代碼放到一個文件夾是依次循環將所有模型生成代碼文件放到一個文件夾,單個模型生成代碼放到一個文件夾代碼實現示例如圖9所示。

圖9 單個模型生成代碼放到一個文件夾代碼實現示例
代碼測試過程實現調用SIL測試,進行SIL測試和定點模型測試結果對比時首先創建測試模型,然后進行正常測試和SIL測試,最后進行結果對比。示例代碼如圖10所示。

圖10 SIL測試實現代碼示例
代碼集成過程實現生成全局系統常數聲明文件時與生成數據對象代碼基本一致,使用mpt.Parameter來實現。自動生成A2L文件是將自動生成代碼中單獨子模塊生成的A2L文件組成為一個A2L文件,刪去重復生成的變量,并利用編譯代碼生成的MAP文件進行地址替換。在替換地址時首先要進行變量識別,識別過程采用正則表達式實現。識別標定量正則表達式部分代碼示例如圖11所示。

圖11 識別標定量正則表達式代碼示例
以某型發動機后處理再生開關故障判斷模型為例,由于正常情況下后處理再生開關按下之后10s之內會自動彈起,當后處理再生開關按下狀態持續大于20s則認為后處理再生開關處于按下卡滯狀態。當發動機后處理再生開關處于按下卡滯狀態時,會導致再生請求一直存在,發動機后處理顆粒捕集器存在燒熔的風險。
按照功能定義手工搭建模型如圖12所示。

圖12 手工搭建浮點原始模型
從圖12可見,該模塊使用了模塊庫,但是明顯不是最新版本模塊庫,輸入輸出口信號凌亂、信號線上無變量名。
運行自動化腳本工具勾選項如圖13所示,點擊運行模型變化為圖14所示。

圖13 浮點功能建模自動化工具運行界面
由圖14可見,執行完自動化操作后,模型替換為最新版本模塊庫,輸入輸出口信號整齊,信號線上添加了變量名,模型封裝為子系統且子系統變量名默認取模型名。當存在多個子系統時模型名后依次加序號區別。
本文針對MBD模式開發過程中大量重復性工作導致的效率低問題進行開發自動化腳本工具,采用MATLAB/M語言來實現。本文的MBD軟件開發自動化腳本工具提高了開發人員工作效率,降低了對開發人員針對MBD開發模式的專業程度,細節化操作選項靈活組合提高了腳本復用率。該自動化腳本工具開發方法為同領域嵌入式軟件自動化開發提供了借鑒參考。

圖14 浮點功能建模自動化執行后模型圖