劉杰暢,黃兵鋒,羅永革,李崢,盛俏,楊蕓蕓
(1.湖北汽車工業學院汽車工程學院 汽車動力傳動與電子控制湖北省重點實驗室,湖北 十堰 442002;2.東風汽車集團股份有限公司技術中心,湖北 武漢 430056)
在汽車V型開發模式中,動力性和經濟性計算是整車設計及總成、零部件匹配的重要一環。目前,針對傳統車、純電動、混合動力及燃料電池等車型的計算理論和仿真平臺較為完善,其中使用最廣的是ADVISOR和AVL Cruise。前者可自由配置計算任務,后者可從汽車建模開始,參數配置精細到零部件,軟件的仿真自由度更大,但同時降低了便捷性。企業中,通常需要對大量車型進行動力性經濟性指標驗證,每次仿真前重新對每一款車型進行細致的參數配置會降低工作效率。為在滿足功能的前提下提高仿真便捷性,Excel成為企業中較為普遍的計算平臺[1],但其無法避免人工輸入導致容易出錯且精度不高。本文結合Matlab強大的計算性能和C#友好的人機交互特性,以Simulink為仿真內核,Winform應用窗體為仿真界面,平臺繼承了ADVISOR和Cruise的仿真對象的通用性、動力總成的可調性、計算指標的可自定義性。并以數據庫提取整車參數的方式作為創新點,避免了繁雜的參數設置,實現了工程實用性與功能性的平衡。
Microsoft Visual C# 是 Microsoft 專門為. NET 平臺而開發的一種強大的、面向對象的語言,可方便快捷的在. NET公共語言運行庫 ( common language runtime, CLR) 上創建Windows應用 程序[2]。C# 簡單、功能強大、類型安全,可縮短軟件開發周期,但是在數值計算分析和曲線繪圖方面的操作繁瑣,功能薄弱。
將數據可視化和數值計算功能集成在一起的 Matlab軟件被廣泛地應用于圖像處理、控制系統、數學建模等領域,具有強大精準的仿真計算能力。Maltab的函數庫種類豐富,且接口設計完善,結構開放易于擴充,但Matlab軟件在用戶界面上的開發功能比較簡單、執行效率低,難以實現底層數據輸入輸出的管理。Matlab軟件在用戶界面的功能上的開發還比較簡單,執行效率低,難以實現底層的數據輸入輸出的管理[3]。
為保證軟件的便捷性和工程實用性并兼顧軟件開發周期和成本,利用Matlab提供的API接口和C#COM組件將兩者聯合,充分發揮各自優勢,同時將主程序與仿真內核隔離開來,方便了后續的代碼修改和升級。
Matlab軟件提供了三種應用程序接口(API)方式[4]:1)調用Matlab模塊所生成的動態鏈接庫(DLL)。2)通過引用Matlab COM組件,訪問Matlab內置函數。3)利用 Matlab 編譯器來創建 C #語言共享庫,創建一個能提供方法入口的包裝類[5]。其中,方法一的編程接口和編程方式較特殊,需另外學習,降低了開發周期。方法三使用的函數有一定局限性,僅限于數學函數庫且無法使用 Matlab強大的圖形處理功能[6]。而方法二是嵌入式編程,調試簡單方便,不需要進行復雜的接口設計,并能執行所有Matlab命令,因此本文選用第二種方式, 結果證明此方法能在縮短開發周期的同時充分發揮Matlab強大函數庫的優勢。
方法二的調用原理如下:利用.NET 環境的運算庫可調用包裝(Runtime Callable Wrapperm, RCW),將 COM 組件提供的 COM 接口轉換為與.NET 框架兼容的接口,使托管客戶端(C#)在調用一個 COM 組件時認為是在自身的環境中調用對象,而不需要處理 COM 特性。通過 RCW,C#可以在.NET 環境下作為一個 COM 應用的客戶端訪問 COM組件,提出數據請求。實現步驟如下:
1)添加 COM(Matlab Application(Version7.11) Type Library)引用。加入對程序集文件“MWArray.dll”的引用,并加入命名空間:
usingMathWorks.Matlab.NET.Arrays;
using MathWorks.Matlab.NET.Utility
2)在Main函數中添加如下代碼:
MLApp.MLAppClass matlab = new MLApp. MLApp Class();
利用Matlab com組件中的函數執行Matlab命令,所調用的函數及功能如下表1所示:

表1 Matlab com組件調用函數

圖1 軟件架構設計
平臺的仿真對象涵蓋傳統汽車、混合動力、純電動汽車、燃料電池汽車四大類型。為提高工程實用性,避免繁雜的參數設置,平臺需支持Excel格式和數據庫格式的參數導入導出功能。平臺以C#應用窗體(Winform)作為人機交互界面,以Simulink程序作為仿真內核,并將指標計算的函數封裝,通過Matlab的COM組件執行運算。軟件架構設計如圖1所示:
根據軟件的需求定義,采用 “自上而下”的模塊式開發流程完成各個子系統架構,模塊設計、數據流和接口設計。軟件的流程圖如圖2所示:

圖2 軟件流程圖
指標的仿真分三個過程:1.汽車配置。2.計算指標配置.3.執行運算顯示結果。考慮到界面的友好性,將主界面針對過程1和2分為兩個窗口。如圖3所示。建模部分可從外部導入數據也可手動填寫,計算指標根據汽車類型的選擇而變化,通過工具欄中的Matlab按鈕調用仿真內核開始計算。整個界面主體突出,交互友好,使用方便。

圖3 軟件主界面
平臺的計算對象涉及傳統車、純電動、混合動力、燃料電池汽車,因此仿真內核的參數高達 470個。為實現 C#與matlab平臺的大量數據傳輸,采用C#類屬性反射遍歷技術。
反射是C#.NET的一種重要機制,它表示在程序運行時對一個程序集的類型元數據的使用,好比我們可以將一個程序集進行映像,在此映像中我們可以從中獲取需要的類型元數據,從而完成相應的功能[7]。
對應某個類的實例化的對象采用遍歷反射技術,可以動態地取得類的成員:類、接口、結構、枚舉和委托等。建立變量類,通過反射技術訪問變量的get、set屬性,獲取變量名和相應的值,便可進行跨平臺傳輸。關鍵代碼如下:

數據管理涉及用戶登錄,文件新建、打開、保存。歷史記錄存儲、對比等。仿真過程中,車輛的輸入參數及結果狀態如圖4所示。

圖4 窗體切換時的數據狀態圖
狀態圖中的變量定義如下表:

表2
對于非靜態變量,每一次狀態的轉換,都需要實例化一個新的變量類,而變量類中的數據量龐大,結構復雜, C#提供的淺拷貝函數只對頂級對象進行復制,不足以滿足克隆全部數據的要求,但深拷貝技術術不僅可以復制對象,還可以復制其子對象。
利用這一技術編寫拷貝構造函數,實現基于同一類的其他對象的構造和初始化,從而將同類變量在不同窗體和不同狀態之間完整傳遞。代碼應用序列化和反序列化的思路將變量逐個檢索并復制。
軟件對一輛EV汽車進行了動力經濟性仿真,配置了車型參數,定制了計算任務。在參數、計算任務均相同的情況下,將采用了混合編程技術的仿真平臺計算結果與仿真內核獨立運行的結果進行對比,如表3:

表3 平臺與仿真內核結果對比
結果表明采用C#調用Matlab的混合編程方式對計算結果不會產生影響。并且,良好的人機交互界面使仿真更為簡單,同時與Excel數據的交互避免了繁雜的參數設置,增強了工程實用性,說明C#與Matlab混合編程技術在整車動力性經濟性仿真中的應用是切實可行的。
系統以人機交互界面調用仿真內核的形式將車型及任務配置程序與動力性經濟性計算模型隔離開來,通過嚴格定義的接口相連,降低了代碼耦合性,從而提升了功能擴展性。仿真內核以Simulink作為建模平臺,可充分發揮matlab強大的計算性能。界面采用C#winform應用窗體,利用C#COM組件調用matlab運行仿真內核,將matlab強大的仿真性能和c#友好的人機交互界面統一起來,揚長避短,在有限的開發周期內充分發揮兩者的優勢。
通過C#調用Matlab進行的性能仿真與Matlab單獨仿真的計算結果完全一致,證明了本文的方法可行,且為整車性能仿真平臺的開發提供了新思路。
[1] 謝衛兵. MATLAB在汽車動力性、經濟性仿真中的應用[A]. 全國各省區市機械工程學會、云南省機械工程學會.2015年第五屆全國地方機械工程學會學術年會暨中國制造2025發展論壇論文集[C].全國各省區市機械工程學會、云南省機械工程學會:2015:18.
[2] 馬煜,陳海軍.Visual C#.NET 案例開發集錦[M].北京:電子工業出版社, 2008.
[3] 柯彪,高躍飛,羅炳華,徐鳳軍.C#與MATLAB混合編程在內彈道設計中的應用[J].彈箭與制導學報,2013,(05):129-132.
[4] 秦春影,喻曉鋒,仝海燕,唐淑萍. C#與Matlab集成方式的比較研究[J].洛陽理工學院學報(自然科學版),2011,21(04):42-46.
[5] 張望.一種基于COM的改進組件創建的研究[D].西南大學,2010.
[6] 楊成,申麗然,李雪耀. Matlab引擎的VC++6.0接口調用及其面向對象編程[J].應用科技,2001,(11):41-44.
[7] 斯梅切爾.C#和.NET2.0實戰:平臺.語言與框架[M].施凡.人民郵電出版社.2008.168-169.