孫 漢,楊亞聯(lián),周 林,張 昕
(1. 重慶大學(xué) a. 機(jī)械與運(yùn)載工程學(xué)院; b. 機(jī)械傳動(dòng)國(guó)家重點(diǎn)實(shí)驗(yàn)室, 重慶 400044;2. 金康賽力斯新能源汽車設(shè)計(jì)院,重慶 401120;3. 江鈴重型汽車有限公司,太原 030032)
CAN網(wǎng)絡(luò)在發(fā)展的過(guò)程中衍生出了多種應(yīng)用層協(xié)議,包括CANopen、J1939、DeviceNet,目前分別由美國(guó)ODVA協(xié)會(huì)、SAE協(xié)會(huì)和歐洲CiA協(xié)會(huì)管理。其中CANopen協(xié)議的核心內(nèi)容是對(duì)象字典,它是一個(gè)有序的對(duì)象組,定義一個(gè)設(shè)備的所有信息[1],并記錄在EDS或DCF電子文檔中,但是對(duì)于那些有很多對(duì)象,特別是很多數(shù)組的設(shè)備,EDS文檔將會(huì)變得很大,對(duì)嵌入式系統(tǒng)的存儲(chǔ)器是一個(gè)挑戰(zhàn);J1939協(xié)議主要適用那些以柴油為動(dòng)力的卡車、公共汽車以及非陸地的交通工具;DeviceNet協(xié)議更多是應(yīng)用在工業(yè)設(shè)備上。在之前的研究中,也有采用XML作為CAN網(wǎng)絡(luò)協(xié)議的描述文件[2],這種方法是將協(xié)議內(nèi)容錄入到XML文件中,利用了XML格式解析的方便性,但是并沒(méi)有根本解決工作量大且錄入容易出錯(cuò)的問(wèn)題。
DBC數(shù)據(jù)文件由德國(guó)Vector公司發(fā)布,它是一種汽車CAN網(wǎng)絡(luò)協(xié)議描述文件,里面大量的字符映射了各邏輯節(jié)點(diǎn)信息及相互之間的通信規(guī)則。相較于Excel、Word版的CAN協(xié)議描述文件,DBC文件格式結(jié)構(gòu)清楚、設(shè)計(jì)方便,已經(jīng)成為CAN通信行業(yè)的標(biāo)準(zhǔn),被CANoe、Matlab、Labview、INCA等軟件和平臺(tái)廣泛采用。
基于DBC文件可以進(jìn)一步開發(fā)出CAN網(wǎng)絡(luò)仿真工具軟件,用來(lái)監(jiān)視和分析CAN網(wǎng)絡(luò)中所有邏輯節(jié)點(diǎn)的參數(shù)和狀態(tài)[3]。CANoe是具有代表性的工具軟件之一,它需要借助DBC數(shù)據(jù)文件來(lái)對(duì)CAN網(wǎng)絡(luò)上的報(bào)文幀進(jìn)行解析[4]?;贑ANoe平臺(tái),DBC文件被應(yīng)用到很多具體的場(chǎng)景中:車身控制器局域網(wǎng)絡(luò)仿真[5]、基于CAN的故障診斷系統(tǒng)[6-7]、汽車動(dòng)力總成的試驗(yàn)臺(tái)架測(cè)試[8]、汽車電子ECU控制器開發(fā),還被應(yīng)用于Simulink和CANoe聯(lián)合仿真[9]以對(duì)混合動(dòng)力汽車的通信和控制策略進(jìn)行驗(yàn)證[10-13],同時(shí)在整車ECU和網(wǎng)關(guān)等軟硬件的開發(fā)和測(cè)試[14]中也得到了應(yīng)用。
基于CAN網(wǎng)絡(luò)數(shù)據(jù)管理的需要,并針對(duì)上述CAN網(wǎng)絡(luò)協(xié)議描述方式存在的弊端,筆者基于DBC文件規(guī)范,設(shè)計(jì)了協(xié)議解析的正則表達(dá)式,根據(jù)CAN網(wǎng)絡(luò)協(xié)議信息的結(jié)構(gòu)關(guān)系,利用多叉樹對(duì)該網(wǎng)絡(luò)協(xié)議進(jìn)行表征,針對(duì)Intel和Motorola不同格式下的協(xié)議解析問(wèn)題,提出了報(bào)文數(shù)據(jù)場(chǎng)的信號(hào)色塊表示方法和起始位轉(zhuǎn)換公式,并基于C#語(yǔ)言設(shè)計(jì)和開發(fā)了DBC數(shù)據(jù)管理軟件,將CAN網(wǎng)絡(luò)協(xié)議描述為一個(gè)dbc格式的文件。實(shí)車試驗(yàn)表明:所設(shè)計(jì)開發(fā)的DBC數(shù)據(jù)管理軟件實(shí)現(xiàn)了CAN網(wǎng)絡(luò)的協(xié)議解析、結(jié)構(gòu)表征和數(shù)據(jù)管理,進(jìn)一步驗(yàn)證了所提出DBC解析方法的有效性。
圖中以“BU_”開頭的行定義了節(jié)點(diǎn)信息,包括Engine、Display、Light 3個(gè)節(jié)點(diǎn);以“BO_”開頭的行定義了報(bào)文信息,包括EngineState、LightState2條報(bào)文;每條報(bào)文下又定義了所包含的信號(hào)信息,以“SG_”開頭,例如,EngineState報(bào)文下定義了EngineSpeed和OnOff 2條信號(hào)。
圖1 DBC示例文件局部結(jié)構(gòu)Fig. 1 Part of a DBC sample file
BO_ MessageId(10進(jìn)制數(shù)表示) MessageName: MessageSize Transmitter為報(bào)文的格式模板,依據(jù)該模板,圖中BO_ 100 EngineState: 3 Engine就可以解析成一條由Engine節(jié)點(diǎn)發(fā)送,數(shù)據(jù)域長(zhǎng)度為3字節(jié),ID為100(0x64),名字為EngineState的報(bào)文。同樣,信號(hào)按照該規(guī)范對(duì)其屬性進(jìn)行了描述。
因此依據(jù)上述DBC文件規(guī)范可以通過(guò)適當(dāng)?shù)慕馕龇椒ㄗ層?jì)算機(jī)快速對(duì)CAN協(xié)議進(jìn)行解析。
DBC文件含有“@”“(”“)”“|”“[”“]”、空格等多種字符信息,并且內(nèi)容信息不固定,不存在通用的解析技術(shù),需要進(jìn)行專門的解析方法設(shè)計(jì)??紤]到正則表達(dá)式在字符串信息匹配方面的方便性,基于DBC文件規(guī)范,設(shè)計(jì)了DBC文件中CAN協(xié)議節(jié)點(diǎn)Node、報(bào)文Message、信號(hào)Signal對(duì)應(yīng)的正則表達(dá)式,分別為regex1、regex2、regex3。
Regex regex3 = new Regex("SG_\s*(\w+\s*\w*)\s*:\s*(\d+)\|(\d+)@([10])([+-])\s*\((-*\d*\.*\d*),(-*\d*\.*\d*)\)\s*\[(-*\d*\.*\d*)\|(-*\d*\.*\d*)\]\s*"(.*)[?"]\s+([\w+,*]+)$")。
利用regex1、regex2、regex3對(duì)DBC文件中每行信息進(jìn)行匹配,判斷該行信息描述的是節(jié)點(diǎn)、報(bào)文還是信號(hào)等,利用字符分割技術(shù)獲取其中描述的具體屬性值,從而創(chuàng)建CAN網(wǎng)絡(luò)中對(duì)應(yīng)的節(jié)點(diǎn)、報(bào)文、信號(hào)等實(shí)例對(duì)象,并建立起各對(duì)象之間的結(jié)構(gòu)關(guān)系。為了方便計(jì)算機(jī)對(duì)CAN網(wǎng)絡(luò)進(jìn)行描述,通過(guò)多叉樹[15]對(duì)其進(jìn)行結(jié)構(gòu)表征,最終得到如圖2所示的多叉樹結(jié)構(gòu)模型。
圖2 多叉樹結(jié)構(gòu)模型圖Fig. 2 Diagram of multi-tree structure model
該模型描述了一個(gè)完整的CAN網(wǎng)絡(luò)工程,其中包括若干個(gè)節(jié)點(diǎn)(Node1、Node2、Node3等),每個(gè)節(jié)點(diǎn)可以發(fā)送若干報(bào)文,每條報(bào)文由若干信號(hào)組成。
DBC數(shù)據(jù)管理軟件的目的是對(duì)CAN網(wǎng)絡(luò)進(jìn)行管理,并將CAN網(wǎng)絡(luò)協(xié)議以DBC數(shù)據(jù)管理文件的形式輸出。通過(guò)可視化窗體設(shè)計(jì)和交互式操作可以直觀地對(duì)DBC文件進(jìn)行創(chuàng)建、修改和編輯??紤]到C#運(yùn)行在.NET框架之下,開發(fā)出來(lái)的程序可以直接在Windows系統(tǒng)下使用,因此基于C#語(yǔ)言進(jìn)行DBC數(shù)據(jù)管理軟件的開發(fā)。
窗體DBCViewer作為主界面(圖3),左側(cè)的TreeView樹控件展示了CAN網(wǎng)絡(luò)的結(jié)構(gòu)關(guān)系,通過(guò)如下代碼為TreeView添加了點(diǎn)擊和拖拽事件監(jiān)聽的響應(yīng)函數(shù):
this.dbcTreeView.ItemDrag += new ItemDragEventHandler(this.DbcTreeView_ItemDrag);
this.dbcTreeView.NodeMouseClick += new TreeNodeMouseClickEventHandler(this.DbcTreeView_NodeMouseClick);
this.dbcTreeView.DragDrop += new DragEventHandler(this.DbcTreeView_DragDrop);
this.dbcTreeView.DragEnter += new DragEventHandler(this.DbcTreeView_DragEnter)。
圖3 主功能界面Fig. 3 Main function interface
TreeView的拖拽事件用于建立CAN網(wǎng)絡(luò)的結(jié)構(gòu)關(guān)系,具體分為圖中①②③3種情況:
① Signals樹節(jié)點(diǎn)下的信號(hào)拖拽到Messages樹節(jié)點(diǎn)下的報(bào)文中,確定該報(bào)文下的信號(hào);
② Messages樹節(jié)點(diǎn)下的報(bào)文拖拽到TxMessages樹節(jié)點(diǎn)下,確定該報(bào)文的發(fā)送節(jié)點(diǎn);
③ Signals樹節(jié)點(diǎn)下的信號(hào)拖拽到對(duì)應(yīng)Node的RxSignals樹節(jié)點(diǎn)下,確定該信號(hào)的接收節(jié)點(diǎn)。
通過(guò)SignalWindow、MessageWindow、NodeWindow窗體實(shí)現(xiàn)Signal、Message、Node對(duì)象的創(chuàng)建和修改。圖4通過(guò)設(shè)置標(biāo)簽的BackColor形成連續(xù)色塊來(lái)模擬連續(xù)的信號(hào)占位,當(dāng)左側(cè)表格中信號(hào)的起始位變化時(shí),根據(jù)Intel和Motorola的格式,整個(gè)數(shù)據(jù)場(chǎng)將自動(dòng)調(diào)整色塊布局。具體的調(diào)整程序如圖5所示。
圖4 報(bào)文數(shù)據(jù)場(chǎng)的信號(hào)布局界面Fig. 4 Signal layout interface of the message data field
圖5 報(bào)文數(shù)據(jù)場(chǎng)的色塊布局調(diào)整程序Fig. 5 Color block layout adjustment program of the message data field
通過(guò)上述程序和取余算法,實(shí)現(xiàn)了報(bào)文數(shù)據(jù)場(chǎng)的色塊布局調(diào)整,保證不同信號(hào)使用不同的顏色標(biāo)記,相鄰信號(hào)之間不會(huì)干擾。
DBC文件中信號(hào)矩陣的編碼格式分為Intel和Motorola兩種。一般情況下,將CAN報(bào)文抽象成8×8的數(shù)據(jù)場(chǎng)(圖6),每行表示一個(gè)字節(jié)的8個(gè)位,從右到左依次是bit0,bit1,…,bit7,左邊代表高位;從上到下依次是byte0,byte1…byte7,下邊代表高字節(jié)。根據(jù)CAN報(bào)文的發(fā)送規(guī)則,通常情況下,先發(fā)送低位字節(jié)LSB,后發(fā)送高位字節(jié)MSB;而單個(gè)字節(jié)則是先傳輸高位msb,后傳輸?shù)臀籰sb。如圖6所示,左邊采用Intel編碼格式,右邊采用Motorola編碼格式,通過(guò)比較和分析總結(jié)出:
圖6 跨字節(jié)時(shí)Intel和Motorola格式的布局對(duì)比Fig. 6 Comparison of the layouts of Intel and Motorola formats when crossing bytes
1)數(shù)據(jù)場(chǎng)中,單個(gè)信號(hào)的起始位均為最低位(即lsb);
2)數(shù)據(jù)場(chǎng)中,單個(gè)信號(hào)的水平填充方向均是從右至左(即lsb至msb的方向);
3)數(shù)據(jù)場(chǎng)中,當(dāng)跨字節(jié)時(shí),Intel是自上而下填充,Motorola是自下而上填充;
4)Motorola格式下,DBC文件中信號(hào)的起始位與數(shù)據(jù)場(chǎng)中的起始位不同,是數(shù)據(jù)場(chǎng)中信號(hào)的最高位msb,即大端方式,因此在對(duì)DBC文件進(jìn)行解析和保存時(shí)須進(jìn)行起始位轉(zhuǎn)換。
在進(jìn)行程序的開發(fā)過(guò)程中,針對(duì)Motorola格式進(jìn)行特殊處理,其中解析DBC文件時(shí)按照式(1)計(jì)算,保存DBC文件時(shí)按照式(2)計(jì)算。式(1)(2)中“/”表示取商運(yùn)算符,“%”表示取余運(yùn)算符,length表示信號(hào)的長(zhǎng)度,lsb表示信號(hào)的最低位,等于數(shù)據(jù)場(chǎng)中的起始位,msb表示信號(hào)的最高位,等于文件中的起始位。
(1)
(2)
在Intel格式下,DBC文件中信號(hào)的起始位就代表信號(hào)的最低位,即小端方式,故不存在轉(zhuǎn)換的問(wèn)題。
以裝車發(fā)動(dòng)機(jī)的CAN通信矩陣為例,將汽車CAN網(wǎng)絡(luò)協(xié)議描述為一個(gè)具體的DBC文件。如圖7(a)所示,共創(chuàng)建了HCU_EMS、EMS 2個(gè)節(jié)點(diǎn),EMS_205、EMS_245、EMS_255、EMS_265、EMS_275、EMS_355 6條報(bào)文,71個(gè)信號(hào)。通過(guò)TreeView樹節(jié)點(diǎn)拖拽,將Node、Message、Signal之間關(guān)聯(lián)起來(lái)。以EMS_255報(bào)文為例,該報(bào)文中添加了EMS_RollingCount_id255、EMS_EngineIntakeAirTemp等16個(gè)信號(hào),在MessageWindow窗體的布局中,調(diào)整每個(gè)信號(hào)的起始位來(lái)對(duì)報(bào)文數(shù)據(jù)場(chǎng)中的信號(hào)進(jìn)行布局排列,調(diào)整之后的信號(hào)顏色塊分布情況如圖7(b)所示。
圖7 DBC文件制定Fig. 7 DBC file production
通過(guò)上述Node、Message、Signal的創(chuàng)建和關(guān)聯(lián)操作之后,后臺(tái)程序?qū)⑦@些信息自動(dòng)同步到CAN網(wǎng)絡(luò)的多叉樹結(jié)構(gòu)中。當(dāng)點(diǎn)擊“文件”-“保存”后,程序依據(jù)多叉樹的廣度搜索算法和深度搜索算法對(duì)多叉樹結(jié)構(gòu)進(jìn)行遍歷,按照DBC文件規(guī)范將CAN網(wǎng)絡(luò)協(xié)議信息寫入到can_engine.dbc文件(圖7(c))。
為驗(yàn)證DBC協(xié)議解析方法的有效性,首先對(duì)DBC數(shù)據(jù)管理軟件輸出的can_engine.dbc文件信息進(jìn)行驗(yàn)證:1)將文件信息與軟件解析界面信息進(jìn)行比較,相當(dāng)于圖7(c)與圖7(a)、7(b)中的信息進(jìn)行比較,發(fā)現(xiàn)DBC協(xié)議屬性信息和結(jié)構(gòu)信息均一致,并且Intel和Motorola格式下的起始位實(shí)現(xiàn)了正確轉(zhuǎn)換;2)根據(jù)裝車發(fā)動(dòng)機(jī)的CAN通信矩陣,利用CANoe輸出can_engine_canoe.dbc文件,并與can_engine.dbc文件比對(duì),節(jié)點(diǎn)、報(bào)文、信號(hào)等信息均一致。初步表明了所提出的正則表達(dá)式解析、多叉樹結(jié)構(gòu)表征、報(bào)文數(shù)據(jù)場(chǎng)信號(hào)色塊表示方法和不同格式下起始位轉(zhuǎn)換公式的正確性。
然后將can_engine.dbc在某乘用車上進(jìn)行了實(shí)車試驗(yàn),同時(shí)基于can_engine_canoe.dbc進(jìn)行對(duì)比,通過(guò)汽車CAN總線上報(bào)文采集和解析結(jié)果對(duì)比進(jìn)一步驗(yàn)證。實(shí)車CAN網(wǎng)絡(luò)自帶報(bào)文信息,而且報(bào)文數(shù)據(jù)和種類較多,與仿真環(huán)境相比提供了更可靠準(zhǔn)確的報(bào)文來(lái)源。
將USBCAN-Ⅱ C和Vector硬件設(shè)備同時(shí)連接到汽車OBD接口,電腦打開對(duì)應(yīng)設(shè)備的軟件,配置好通道和參數(shù)。在試驗(yàn)環(huán)境準(zhǔn)備好之后,駕駛車輛在重慶大學(xué)A區(qū)校園內(nèi)(圖8)行駛,副駕駛進(jìn)行汽車CAN報(bào)文的采集工作(圖9)。根據(jù)采集到的數(shù)據(jù)報(bào)文ID(圖10,此處為USBCAN-Ⅱ C設(shè)備采集到的部分?jǐn)?shù)據(jù)截圖)發(fā)現(xiàn),除了發(fā)動(dòng)機(jī)的CAN報(bào)文外,還包括其他節(jié)點(diǎn)發(fā)送的報(bào)文ID。
圖8 汽車駕駛路段Fig. 8 Car driving section
圖9 汽車CAN報(bào)文采集Fig. 9 Car CAN message collection
圖10 采集到的報(bào)文數(shù)據(jù)Fig. 10 Collected message data
最后通過(guò)can_engine.dbc文件對(duì)采集的報(bào)文進(jìn)行解析,其中發(fā)動(dòng)機(jī)轉(zhuǎn)速位于ID為0x255的報(bào)文下,采用Motorola編碼格式,起始位為24,長(zhǎng)度為16,F(xiàn)actor因子為0.25,Offset偏移量為0;車速信號(hào)位于ID為0x265的報(bào)文下,采用Motorola編碼格式,起始位為16,長(zhǎng)度為13,F(xiàn)actor因子為0.05625,Offset偏移量為0。另外也通過(guò)can_engine_canoe.dbc文件對(duì)Vector硬件設(shè)備采集到的數(shù)據(jù)進(jìn)行解析。rpm、v為本文所開發(fā)軟件生成can_engine.dbc文件解析后的轉(zhuǎn)速和車速;rpm′、v′為采用CANoe工具軟件生成的can_engine_canoe.dbc文件解析后的轉(zhuǎn)速和車速,對(duì)全試驗(yàn)過(guò)程結(jié)果分別求取方差,結(jié)果如下:
(3)
(4)
計(jì)算結(jié)果均為0,說(shuō)明兩種方式解析后的車速和發(fā)動(dòng)機(jī)轉(zhuǎn)速真實(shí)值是一致的;兩種方式解析之后對(duì)應(yīng)的曲線如圖11和12所示。試驗(yàn)結(jié)果證明了本軟件所制定的DBC文件能夠正確解析汽車CAN報(bào)文。
XML的解析方式首先將DBC格式的協(xié)議文件人工轉(zhuǎn)換為XML格式的文件,然后計(jì)算機(jī)通過(guò)XML格式來(lái)識(shí)別和解析CAN網(wǎng)絡(luò)協(xié)議。本研究中利用正則表達(dá)式來(lái)直接解析原DBC文件協(xié)議,利用多叉樹的結(jié)構(gòu)表征DBC協(xié)議,通過(guò)減少操作步驟,顯著提高了DBC數(shù)據(jù)管理的效率,并且上述的試驗(yàn)結(jié)果證明了所提出方法的有效性。
圖11 解析后的發(fā)動(dòng)機(jī)轉(zhuǎn)速曲線對(duì)比Fig. 11 Analyzed engine speed curve comparison
圖12 解析后的車速曲線對(duì)比Fig. 12 Analyzed vehicle speed curve comparison
1)通過(guò)分析DBC文件規(guī)范,總結(jié)出Intel、Motorola編碼格式下CAN報(bào)文的布局規(guī)律并推導(dǎo)出Motorola格式下起始位轉(zhuǎn)換公式,進(jìn)一步設(shè)計(jì)和開發(fā)出DBC數(shù)據(jù)管理軟件;該軟件能夠以可視化窗口的交互方式創(chuàng)建和修改DBC文件。
2)通過(guò)正則表達(dá)式的設(shè)計(jì)實(shí)現(xiàn)了對(duì)已有DBC文件的解析,提出的CAN網(wǎng)絡(luò)多叉樹結(jié)構(gòu)模型能夠?qū)AN網(wǎng)絡(luò)信息進(jìn)行統(tǒng)一管理。
3)通過(guò)實(shí)車試驗(yàn),所開發(fā)軟件根據(jù)汽車CAN通信矩陣制定出來(lái)的DBC文件與CANoe生成的DBC文件進(jìn)行汽車CAN報(bào)文的對(duì)比試驗(yàn)解析,兩者結(jié)果一致,驗(yàn)證了所開發(fā)軟件的實(shí)用性。