汪 偉,莫官旭,申 健,謝勇波,王文明
(長沙中車智馭新能源科技有限公司, 湖南 長沙 410036)
汽車控制器之間的通信主要通過CAN(controller area network)總線實現(xiàn)。隨著汽車功能的不斷豐富,控制器數(shù)量逐漸增多,CAN報文信息交互頻繁,所需處理的數(shù)據(jù)越來越多;而傳統(tǒng)軟件開發(fā)方式存在開發(fā)時間長、代碼量大、易出錯和不易擴展的不足。另外,在基于模型設計[1-2]的軟件開發(fā)中,模型生成代碼的變量不便與CAN底層函數(shù)的參數(shù)關聯(lián),需將模型生成代碼中的變量一一賦值至手寫代碼的底層函數(shù)中使用。
基于模型的設計是嵌入式軟件快速開發(fā)的一種方式,在Simulink環(huán)境下使用模塊庫搭建控制策略模型,使用RTW(real-time workshop)將模型生成代碼,再編譯燒寫到嵌入式控制器中運行。相比編輯C代碼的嵌入式軟件開發(fā)方式,基于模型的設計可視性更高、移植性更強,并且可在Simulink上對邏輯進行仿真,簡化測試工作。若通過Simulink模塊實現(xiàn)CAN報文收發(fā)、裝載與解析功能,則能有效提高開發(fā)效率和代碼可靠性,增強軟件移植性[3-4]。據(jù)此,本文使用Simulink的S函數(shù)(S-Function)并編寫相應的M語言腳本和由目標語言編譯器(target language compiler, TLC)轉換的TLC文件,設計了一種基于自動代碼生成技術的CAN底層模塊庫,用于實現(xiàn)控制器的CAN通道初始化和CAN報文的接收與發(fā)送、解析與裝載。
在Simulink環(huán)境中,需要設計S-Function和與之關聯(lián)的TLC文件,以達到生成自定義格式代碼的目的[5-7]。首先,在Matlab中編輯M語言腳本并在模塊中調用,用于處理傳入模塊的數(shù)據(jù)和設置顯示在模塊上的字符;然后,在TLC文件中對這些數(shù)據(jù)如何生成代碼以及所需包含的頭文件進行描述,從而在生成的C代碼中調用控制器底層函數(shù),其原理如圖1所示。
圖1 S-Function生成自定義代碼原理圖Fig. 1 Principle diagram of S-Function custom code
本文使用的TC21x芯片平臺控制板的CAN通信C語言底層函數(shù)包含的功能有:硬件CAN通道設置、發(fā)送CAN報文及配置接收報文,函數(shù)名和所需設置的形參如圖2所示。
圖2 C語言底層函數(shù)Fig. 2 C language underlying functions
根據(jù)C語言的底層函數(shù)和Matlab支持讀取DBC(database for CAN)文件的功能,將CAN底層模塊庫劃分為CAN初始化、CAN報文數(shù)據(jù)裝載與發(fā)送、CAN報文數(shù)據(jù)接收與解析這3種功能S-Function模塊。CAN初始化模塊用于設置波特率和工作模式,其他兩個模塊用于讀取導入模型的DBC文件信息,并調用CAN報文收發(fā)底層函數(shù)來實現(xiàn)對報文數(shù)據(jù)的處理與收發(fā)。根據(jù)底層函數(shù)所需傳入的參數(shù)類型,3個模塊的功能結構設計如圖3所示。
圖3 自建CAN底層模塊庫功能結構Fig. 3 Functional structure of self-building CAN communication library
CAN底層模塊庫的各個模型均需圖形用戶界面(graphical user interface, GUI)與數(shù)據(jù)處理功能。在GUI的設計上,Matlab/Simulink提供了便捷的Mask Editor和GUIDE工具供使用者對Simulink模型進行封裝,可將各模塊所需傳入的參數(shù)類型作為模塊對話框的輸入項,并為GUI上的控件添加回調函數(shù),對輸入數(shù)據(jù)進行處理,最終傳入S-Function參數(shù)用于生成代碼。
CAN初始化所需輸入的參數(shù)信息較少,可使用Mask Editor對硬件CAN通道編號,將波特率和工作模式設置為彈出式下拉菜單,并為每個控件對應的Name屬性命名,以此作為S-Function中S-function parameters的輸入?yún)?shù)名稱。實現(xiàn)CAN初始化模塊同名的TLC文件后,可生成代碼。所設計的對話框和所生成的代碼如圖4所示。
圖4 CAN初始化模塊的對話框界面與所生成的代碼Fig. 4 Dialog interface and generated code of CAN initial block
CAN報文裝載與發(fā)送、CAN報文接收與解析輸入模塊參數(shù)較多,用GUIDE設計對話框界面可以顯示更豐富的內容。為了方便觀察模塊所使用的CAN報文中每個信號的信息,用GUIDE將CAN報文信息的變量名、起始位、信號數(shù)據(jù)長度、比例系數(shù)及偏移量根據(jù)起始位置排序,并以表格形式在模塊的對話框中顯示。報文信息來源于DBC文件,因此需為GUI的Browse和Message list編輯框對應的控件設置回調函數(shù),用于選擇指定路徑的DBC文件,并在選擇所需報文ID后對協(xié)議內容進行讀取與處理,之后再寫入到模塊參數(shù)中。以EEC1(ID為0x0CF00400)報文中的發(fā)動機轉速信號為例,CAN報文裝載與發(fā)送模塊對話框與所生成的代碼如圖5所示。
圖5 CAN報文裝載與發(fā)送模塊的界面與代碼Fig. 5 Dialog and generated code of CAN message loading and sending block
為了便于在同一模型工程中對不同設置參數(shù)的模塊進行區(qū)分,可通過 Mask Editor中的Icon drawing commands設置模塊外觀顯示的符號與文字。將CAN接收與解析模塊進一步細分為帶回調函數(shù)功能的模塊和不帶回調函數(shù)功能的模塊,以滿足不同需求。CAN底層模塊庫各模塊封裝效果如圖6所示,從左至右、從上至下分別為CAN初始化模塊、CAN報文裝載與發(fā)送模塊、CAN報文接收與解析模塊以及帶回調功能的CAN報文接收與解析模塊。
圖6 CAN底層模塊庫各模塊封裝效果Fig. 6 Encapsulation effect of each block in the CAN underlying module library
完成各模塊的功能實現(xiàn)、封裝和屬性設置后,可將各模塊集成為Simulink模塊庫。編寫與模塊庫對應的slblocks.m文件,將該文件與模塊庫文件所在路徑添加到Matlab的工作路徑列表中。在Simulink Library Browser中執(zhí)行Refresh操作,CAN通信模塊庫可顯示在Simulink庫瀏覽菜單中,以便查找和使用,效果如圖7所示。搭建模型時,只需在CAN底層模塊庫中將相應功能的模塊拖入到.mdl或.slx模型文件中即可。每個在工程中使用的模塊與CAN底層模塊庫中的父模塊存在關聯(lián)關系;在后期軟件維護時,只需對模塊庫中的父模塊功能進行修改,即可改變整個模型文件中各CAN模塊的功能與生成代碼的格式。
圖7 CAN通信模塊在Simulink Library Browser中顯示效果Fig. 7 Display effect of CAN communication block in Simulink Library Browser
在完成了CAN通信模塊庫的功能設計與封裝后,為了驗證CAN模塊是否能在硬件平臺上正常運行,本文在Infineon的TC21x系列控制板上試驗CAN報文的發(fā)送與接收功能。試驗環(huán)境結構如圖8所示。
圖8 試驗環(huán)境組成Fig. 8 Test environment composition
本次試驗分別用EEC1報文中的發(fā)動機轉速值和TCO1(ID為0x0CFE6CEE)報文中的整車車速值作為報文接收解析和報文數(shù)據(jù)裝載與發(fā)送的測試對象。其中,發(fā)動機轉速值在EEC1的BYTE4和BYTE5位置,分辨率為0.125 (r/min)/bit;整車車速值在TCO1的BYTE7和BYTE8位置,分辨率為1/256 (km/h)/bit。搭建如圖9所示測試模型,其中,CAN初始化模塊和CAN報文裝載與發(fā)送模塊分別被置于Simulink的原子子系統(tǒng),用于指定函數(shù)名、生成單獨的C函數(shù)以區(qū)分不同的模塊功能,方便調用。使用Simulink編譯模型驗證了使用模塊庫所搭建的模型能成功生成代碼,各子系統(tǒng)內部如圖10所示。
圖9 測試模型Fig. 9 Test model
圖10 測試模型子系統(tǒng)內部Fig. 10 Inner of the test model subsystem
將生成的C代碼函數(shù)加入整個軟件工程中調用,編譯后燒寫到控制器內;使用上位機軟件CANTest對TCO1的報文情況進行采集,模型中車速的設置值為45,報文發(fā)送值為0x2D00(對應的十進制值為11520),如圖11所示,根據(jù)協(xié)議解析可得實際值為45 km/h。
圖11 報文采集結果Fig. 11 Result of message collecting
在CANTest的基本操作欄中,設置報文幀ID和數(shù)據(jù)值發(fā)送給控制板,如圖12所示。本文設置EEC1的發(fā)動機轉速報文原始值為0x1450(十進制值為5200,根據(jù)協(xié)議,解析值為650 r/min),通過控制板的上位機監(jiān)控板可得所接收的內容為650,如圖13所示。
圖12 模擬發(fā)送報文Fig. 12 Simulated message sending
圖13 上位機監(jiān)控板接收到的發(fā)動機轉速值Fig. 13 Speed value of engine in the upper computer monitoring board
通過以上測試結果可看出,自建的CAN底層模塊庫接收與解析功能、數(shù)據(jù)裝載與發(fā)送功能能在控制板中能正常運行,且協(xié)議解析內容與DBC文件中設置內容相符。
本文通過Simulink自建CAN底層模塊庫,在Infineon控制板上實現(xiàn)了對數(shù)據(jù)發(fā)送和接收功能底層函數(shù)的調用,并將DBC文件的信息導入到模塊中;結合控制板已實現(xiàn)的C語言底層函數(shù),分別建立CAN報文接收與解析、CAN報文裝載與發(fā)送功能模塊;通過Simulink自動生成代碼技術驗證了自建模塊庫所生成的代碼在控制器上的運行結果。在基于TC21x系列芯片控制板的試驗環(huán)境中的測試結果表明:自建的CAN底層模塊庫可正常調用底層的CAN報文發(fā)送和接收函數(shù)功能,并能解析報文或根據(jù)協(xié)議裝載成原始報文。使用該方法,不需要人為對照CAN協(xié)議來編輯C代碼和對CAN報文解析與裝載,模型會自動根據(jù)DBC文件來對CAN報文信息進行處理,相比傳統(tǒng)軟件開發(fā),降低了編寫軟件時對照報文協(xié)議的錯誤率,節(jié)省了開發(fā)時間,方便后期維護工作。由于本文模塊庫在代碼中生成了較多單精度或雙精度型變量,這會占用較多的控制板數(shù)據(jù)存儲空間,因此優(yōu)化生成代碼中的數(shù)據(jù)類型是本文方案需要改進之處。