05.23 基於Embedded Coder的ECU數據管理系統開發

0 引言

基於模型的ECU軟件開發愈加重要[1-2]。對於發動機ECU系統來說,查表模塊要滿足離線數據燒寫和在線標定兩方面的需求:離線燒寫時將查表模塊數據全部定義到固定的Flash區域中,在燒寫時,燒寫工具將該Flash區域的數據全部燒寫為新的值;進行在線標定時,內存管理模塊將Flash中的查表模塊數據拷貝到RAM中,標定RAM中的查表模塊數據,並且讓發動機ECU軟件讀取RAM中的查表模塊數據。因此,需要在查表插值函數中,先通過內存管理模塊得到查表模塊的實際地址,再進行查表插值計算,返回查表結果。而Simulink自帶的Lookup Table模塊,在生成代碼時會自動生成查表插值函數,但是該函數無法調用底層的內存管理模塊,只能使用Flash中的查表模塊數據進行計算,無法滿足在線標定的需求。因此針對原有的底層模塊,自定義開發與之匹配的Simulink查表模塊是十分有必要的。另外,借鑑傳統手寫代碼中有益的經驗,在MATLAB/Simulink環境下開發數據字典對模型中的變量及數據類型進行管理可以減少模型定點化工作,提升開發速度。

Simulink提供了名為Simulink的包(Package),用於描述變量的名稱、維數、物理值、取值範圍、單位、描述以及數據類型的名稱[3]。Simulink包在生成代碼時不支持變量的Flash段定義,而是將模型中的變量當做普通變量來處理。另一方面,不同類型的標定變量的存儲結構與查表差值函數的接口定義、數據讀取方法直接相關。尤其對於曲線和曲面變量,Simulink生成代碼時會將模型中的每個變量獨立定義,這就導致屬於同一CUR/MAP的軸參數等出現分散定義的情況,地址不一定連續,順序也很可能是混亂的,這對於查表插值函數的影響相對較小,調整函數接口即可順利讀取到變量的軸數據地址,但是這將給a2l文件的生成帶來極大麻煩,因為很難通過軟件來識別分析每個軸變量分別屬於哪個CUR/MAP,也就無法生成正確的描述信息來描述標定變量。所以要設計專門的包將標定變量定義到指定的Flash段中,從而儘可能減小對已有查表插值函數的改動,並且便於手工修改變量,最大限度兼容已有的手寫代碼的變量結構定義方式。

MATLAB中可以表示浮點數和定點數變量,浮點數變量有兩種表示方法:一種是矩陣類型的變量,使用雙精度浮點數,可在m語言和Simulink中使用;另一種是Parameter數據類,可在Simulink中使用。定點數變量也有兩種表示方法:一種是Parameter數據類;另一種是fi對象,適用於m語言。所以本文使用Parameter數據類來表示數據類型[4-5]。另外,根據從前手寫代碼的經驗和規則,使用斜率和偏移來定義定點數,使用單精度浮點數來表示浮點數,並將以前使用的數據類型都導入到MATLAB中。

1.2 變量及其存儲實現

在Embedded Coder自動生成代碼時,要儘可能按照不同查表模塊結構定義方式生成變量。基於Embedded Coder的包自定義適合單片機的包,使得Simulink模型中的變量的各項屬性滿足在代碼生成時的各種要求。建立包的過程如圖1所示。

基于Embedded Coder的ECU数据管理系统开发

首先創建一個自定義的包,在該包上定義所需的數據類:定義Parameter數據類用於表達標定變量,定義Signal數據類用於表達監控變量。各數據類的屬性會默認繼承Simulink包中相應數據類的屬性。發動機電控系統的查表模塊必須定義在指定的Flash段空間內,所以需要定義數據類的自定義儲存類CSC(Custom Storage Class)來定製變量的儲存屬性,例如數據類型(結構體或非結構體)、內存塊Memory Section(定義變量聲明和定義所在的儲存區域)、鏈接屬性(是否聲明為外部變量)等屬性。

2 創建查表模塊

查表模塊用於在模型中使用定點或浮點數據查表進行建模仿真,在創建查表模塊時可以分為兩個步驟:查表模塊的封裝和相應的底層內存管理模塊封裝。

2.1 查表模塊封裝

查表模塊要在Simulink中進行使用,在Simulink環境中可以封裝S函數來實現自定義功能。使用C語言編寫查表模塊的S函數。查表模塊S函數模塊的開發流程如圖2所示,主要分為編寫S函數文件和S函數模塊封裝兩部分。下面以曲線(Curve)模塊為例來詳細描述如何創建查表模塊。

基于Embedded Coder的ECU数据管理系统开发

曲線插值查表模塊含有1個輸入、1個輸出和7個參數,7個參數分別為:(1)CUR的x軸變量;(2)CUR的y軸變量;(3)CUR的x軸數據類型;(4)CUR的y軸數據類型;(5)CUR的x軸數據類型編號;(6)CUR的y軸數據類型編號;(7)CUR名稱。

首先,根據曲線插值查表模塊的特性編寫S函數的C源代碼,其中須包含Simulink規定的必須有的宏定義和頭文件,針對查表模塊還應當包含定點數相關的頭文件等;實現參數的獲取和設置的各種回調方法,具體包括:

(1)初始化回調:設置S函數的參數信息、狀態信息、輸入輸出端口信息、採樣時間信息、工作向量信息、仿真選項,具體流程如圖3所示。

基于Embedded Coder的ECU数据管理系统开发

(2)參數檢查回調,用來檢查x軸數據類型名稱、維數、單調性是否有效,檢查y軸數據類型名稱是否有效、維數是否與x軸一致,具體流程如圖4所示。

基于Embedded Coder的ECU数据管理系统开发

(3)採樣時間回調:設置採樣時間信息,具體流程如圖5所示。

(4)運行時參數回調:用來建立運行時參數(Run-Time Parameter),即將CUR的軸變量註冊成為運行時參數以獲取其儲存值,具體流程如圖6所示。

(5)輸出回調:用來獲取輸入、CUR數據,設置輸出,流程如圖7所示。

(6)RTW回調:用戶來將參數傳遞給RTW文件,具體流程如圖8所示。

基于Embedded Coder的ECU数据管理系统开发基于Embedded Coder的ECU数据管理系统开发

然後,將C源代碼編譯為mex文件。在Simulink中自建模塊庫,使用S-Function模塊完成參數封裝,並與mex文件鏈接,完成查表模塊的封裝。

2.2 底層內存管理模塊封裝

繼續以曲線插值查表模塊為例,為使該模塊生成的代碼能夠與底層庫中的查表插值函數和內存管理函數相結合,定義以下接口方式使得曲線插值查表模塊生成如下格式的代碼來調用查表插值函數:

輸出=曲線查表插值函數(x軸Flash地址,x軸點數,x輸入)

在底層庫的查表插值函數中,首先調用內存管理模塊的接口函數,根據CUR的Flash地址查得其RAM地址,再讀取RAM地址中的CUR,進行查表插值。在代碼生成時,CUR模塊要生成兩部分代碼:一是要生成頭文件中的查表插值函數的聲明語句,只需生成一遍;二是對於每個CUR模塊生成一次查表插值函數調用語句。底層內存管理模塊封裝具體流程如圖9所示。

基于Embedded Coder的ECU数据管理系统开发

3 仿真與代碼實驗

在發動機控制系統中使用的數據類型基本上是定點數數據類型。本節以無符號、16位、斜率為2-5、偏移為0的定點類型為例,研究運用定點數所建立的查表模塊在仿真和生成代碼中的表現。實驗通過兩個定點數進行加法、減法、乘法、除法的不溢出和溢出計算來比較定點運算在仿真和代碼中的表現。仿真設計如圖10所示。

基于Embedded Coder的ECU数据管理系统开发

實驗中,定點數a_fixed等於1,通過Lookp_1D_CUR查表模塊得出輸出為7.11,由於該定點類型的精度為0.031 25,因此查表得出的輸出為7.125。另一個定點數b_fixed等於11.7,同樣也丟失了一些精度,但在工程應用中還可以接受。從圖10中可以看出,對於不溢出的加法、減法、乘法、不除0除法運算,計算結果受兩個輸入的影響也損失了一定精度。除0在理論上是不存在的,仿真實驗中計算結果為2 047.968 75,即儲存值達到最大值為65 535。d_fixed+e_fixed實驗了溢出加法計算,a_fixed查表後的結果減去b_fixed實驗了溢出減法計算,d_fixed與f_fixed相乘實驗了溢出乘法計算,其結果如圖10所示,與理論計算結果一致。

將該實驗模型生成代碼後查看其代碼的表現,結果顯示在進行加法、減法、乘法計算時,單片機中的計算結果與前述仿真結果一致。在進行除法計算時,單片機中的計算結果為:如果被除數小於除數,則結果為0,否則結果為商的整數部分。這與仿真結果明顯不同。這是因為Simulink的除法模塊在進行除法計算時,是先將除數與被除數當做浮點數來計算浮點形式的商,然後再用定點類型來顯示這個商。這是定點代碼在代碼中的表現與在仿真中的表現的最大差異處。

4 結論

本文基於Embedded Coder 進行了發動機的變量存儲管理、查表模塊封裝和底層內存管理模塊封裝,從而定製了生成代碼中的變量定義方式和儲存方式,並將其與底層庫中的查表插值函數接口相匹配,使得查表模塊可以進行仿真計算、離線數據標定,其生成發動機控制代碼能夠支持在線標定和離線燒寫。仿真和代碼實驗結果表明,所建查表模塊可以滿足開發需求;定點數在仿真和代碼中的表示都會損失一定的精度;定點數在仿真和代碼中進行加法、減法、乘法計算結果一致,除法計算會有差異。

參考文獻

[1] DILLABER E,KENDRICK L,JIN W,et al.Pragmatic strategies for adopting model-based design for embedded applications[J].SAE Technical Paper,2010,2010-01-0935.

[2] HODGE G,YE J,STUART W.Multi-tar-get modeling for embedded software devel-opment for automotive applications[J].SAE Technical Paper,2004,2004-01-0269.

[3] The Math Works Inc.Embedded Coder reference[Z].2015.

[4] ERKKINEN T.Fixed-point ECU development with model-based design[J].SAE Technical Paper,2008,2008-01-0744.

[5] REDDY V,NADARAJAH S,BEALS G.Tips for fixed-point modeling and code generation for simulink[EB/OL].[2017-10-23].http://cn.mathworks.com/matlabcentral/fileexchange/7197-tips-for-fixed-point-modeling-and-code-generation-for-simulink-6.

作者信息:

陰晉冠1,蘇鐵熊1,馮雲鵬2,劉 濤3,賈 利3,周慧芳3,張豔崗1

(1.中北大學 機電工程學院,山西 太原030051;

2.北京特種車輛研究所,北京100072;3.中國北方發動機研究所,天津300400)


分享到:


相關文章: