,,,
(上海工程技術(shù)大學(xué) 汽車工程學(xué)院,上海 201620)
基于J1939協(xié)議的車輛故障診斷與ECU報(bào)文解析
汪志斌,吳長水,黃敏濤,馮琛
(上海工程技術(shù)大學(xué) 汽車工程學(xué)院,上海 201620)
在對汽車的故障診斷過程中,基于SAE J1939協(xié)議的CAN通信的ECU提供的發(fā)動(dòng)機(jī)性能檢測參數(shù)和整車網(wǎng)絡(luò)通信數(shù)據(jù),實(shí)現(xiàn)整車網(wǎng)絡(luò)中多個(gè)ECU數(shù)據(jù)的共享; J1939協(xié)議同時(shí)也支持故障的診斷,通過數(shù)據(jù)轉(zhuǎn)換模塊將接收的數(shù)據(jù)轉(zhuǎn)換成串行數(shù)據(jù)(包含CAN的ID地址),診斷工具(手持終端)可以讀取當(dāng)前故障碼DM1或清除當(dāng)前故障碼DM11。本文提出了一種車輛故障診斷的研究策略,同時(shí)提出了一種基于JAVA語言的報(bào)文的解析方法,能夠有效實(shí)時(shí)地實(shí)現(xiàn)對汽車發(fā)動(dòng)機(jī)的故障檢測。
CAN 通信;ECU;SAE J1939協(xié)議
SAE J1939協(xié)議專供卡車及其拖車、大客車等商用車使用,是用來支持分布在車輛各個(gè)不同位置的電控單元之間實(shí)現(xiàn)實(shí)時(shí)閉環(huán)控制功能的高速通信標(biāo)準(zhǔn),包括通信層、物理層和數(shù)據(jù)鏈路層,以 CAN2.0B 為基礎(chǔ),數(shù)據(jù)傳輸速率可達(dá) 250 kbps。另外,它還定義了網(wǎng)絡(luò)層和應(yīng)用層的協(xié)議,是目前大型汽車中應(yīng)用最廣泛的應(yīng)用層協(xié)議,同樣能夠?qū)崿F(xiàn)故障診斷、故障處理。
SAE J1939協(xié)議由美國汽車工程師協(xié)會(huì)(SAE)制定,目前在載貨汽車及客車等重型車輛中廣泛應(yīng)用,其以CAN2.0B作為網(wǎng)絡(luò)核心協(xié)議,在其基礎(chǔ)上定義了網(wǎng)絡(luò)層和協(xié)議層,遵循7層OSI網(wǎng)絡(luò)結(jié)構(gòu),并對每個(gè)被實(shí)現(xiàn)的層使用不同的文件進(jìn)行描述,通過提供一個(gè)標(biāo)準(zhǔn)的框架,使電控單元ECU之間可以實(shí)現(xiàn)網(wǎng)絡(luò)互聯(lián)通信而不需要額外的功能接口。表1介紹了CAN2.0的標(biāo)準(zhǔn)和擴(kuò)展格式,及J1939協(xié)議所定義的格式。J1939協(xié)議報(bào)文單元的具體格式如下所示:
PRIORITYRDPPDUFORMATPDUSPECIFICSOURCEADDRESSDATAFIELD3118880~64
可以看出,J1939標(biāo)識符包括:PRIORTY(優(yōu)先權(quán)位);R(保留位);DP(數(shù)據(jù)頁位);PDU FORMAT(協(xié)議數(shù)據(jù)單元);PDU SPECIFIC(擴(kuò)展單元)和SOURCE ADDRESS(源地址)。而報(bào)文單元還包括64位的數(shù)據(jù)場。
基于CAN通信的J1939協(xié)議的ECU能提供發(fā)動(dòng)機(jī)性能檢測參數(shù)和整車網(wǎng)絡(luò)通信,實(shí)現(xiàn)整車網(wǎng)絡(luò)中多個(gè)ECU的數(shù)據(jù)共享,同時(shí)J1939協(xié)議支持故障診斷,通過診斷工具可以讀取或清除診斷故障碼[4]。系統(tǒng)ECU主要采用兩種通信方式:單幀通信和多幀通信。在檢測和整車網(wǎng)絡(luò)通信時(shí)主要采用單幀通信方式;在診斷時(shí)因靈活的故障碼個(gè)數(shù)是可變的,因此單幀通信與多幀通信結(jié)合使用。
表1 CAN2.0的標(biāo)準(zhǔn)和擴(kuò)展及J1939協(xié)議的格式
CAN轉(zhuǎn)藍(lán)牙控制器模塊(簡稱BluetoothCAN)接收來自終端的命令(串行數(shù)據(jù)),轉(zhuǎn)換成對應(yīng)的CAN總線格式的數(shù)據(jù)幀,發(fā)送給發(fā)動(dòng)機(jī)控制器ECU。其次,BluetoothCAN接收來自ECU的數(shù)據(jù),轉(zhuǎn)換成對應(yīng)的串行數(shù)據(jù)(包含CAN的ID地址),發(fā)送給終端。
數(shù)據(jù)接收與發(fā)送使用CAN轉(zhuǎn)藍(lán)牙控制器模塊,通過OBD(On Board Diagnosis、車載診斷系統(tǒng))接口(CAN總線)和發(fā)動(dòng)機(jī)控制單元(ECU)進(jìn)行通信,讀取來自ECU[5]的信息并進(jìn)行處理,轉(zhuǎn)換成藍(lán)牙數(shù)據(jù)發(fā)送給手持終端;同樣,手持終端發(fā)送數(shù)據(jù)信息給BluetoothCAN,BluetoothCAN轉(zhuǎn)換成CAN報(bào)文信息發(fā)送給發(fā)動(dòng)機(jī)控制器ECU,實(shí)現(xiàn)手持終端與ECU的信息交互。原理示意圖如圖1所示。
圖1 故障診斷過程
J1939協(xié)議包括在線故障診斷功能,由診斷應(yīng)用層定義。系統(tǒng)在進(jìn)行故障診斷時(shí)主要采用4種消息幀實(shí)現(xiàn)故障診斷,分別為DM1發(fā)送當(dāng)前故障碼、DM2發(fā)送先前故障碼、DM3清除先前故障碼和DM11清除當(dāng)前故障碼。J1939協(xié)議診斷故障碼(DTC)由4個(gè)獨(dú)立域構(gòu)成,同時(shí)也是由4個(gè)字節(jié)(32位)表示,這4個(gè)部分如表2所列。
表2 DTC的構(gòu)成
其中SPN為發(fā)生故障的部件,F(xiàn)MI為發(fā)生的故障類型,CM為SPN轉(zhuǎn)換排列規(guī)則,OC為本故障的發(fā)生次數(shù)。OC取值范圍為0~126,即使故障發(fā)生次數(shù)大于126時(shí),OC也保持為126。
J1939協(xié)議規(guī)定請求參數(shù)組編號PGN為59904,診斷工具地址為0x2B,ECU地址為0x00。系統(tǒng)ECU在接收到診斷設(shè)備的請求后,在中斷服務(wù)程序中對請求幀所請求的目標(biāo)PGN內(nèi)容進(jìn)行判斷,如果請求的是讀取先前故障 DM2,那么系統(tǒng)ECU將向診斷工具發(fā)送先前故障碼;如果請求的是清除先前故障碼DM3或當(dāng)前故障碼DM11,那么系統(tǒng)ECU將清除先前故障碼或當(dāng)前故障碼。請求幀數(shù)據(jù)、請求參數(shù)組格式分別如表3、表4所列。
表3 請求幀格式
表4 請求參數(shù)組
其中PGN為0x00 FECB時(shí)為先前故障碼,PGN為0x00 FECC時(shí)為清除先前故障碼,PGN為0x00 FED3時(shí)為清除當(dāng)前故障碼。
當(dāng)診斷工具向ECU請求先前故障碼或清除故障碼時(shí),診斷工具發(fā)送請求PGN和被請求的PGN給ECU電控單元,ECU給診斷工具回復(fù)相應(yīng)的數(shù)據(jù)。診斷工具與ECU之間的數(shù)據(jù)交互如圖2所示。
圖2 故障碼的請求與發(fā)送
診斷時(shí),當(dāng)前故障和先前故障所包含的故障碼有三種情況:無故障、一個(gè)故障和多個(gè)故障。無故障和一個(gè)故障時(shí),使用單個(gè)CAN數(shù)據(jù)幀就可以發(fā)送全部數(shù)據(jù),而當(dāng)傳輸多個(gè)故障時(shí),需要使用多個(gè)數(shù)據(jù)幀才能發(fā)送完畢,這時(shí)就需要使用J1939協(xié)議的傳輸協(xié)議功能。J1939協(xié)議通信的核心是負(fù)責(zé)數(shù)據(jù)傳輸?shù)膫鬏攨f(xié)議,傳輸協(xié)議功能主要包含三個(gè)部分:消息的拆裝、數(shù)據(jù)重組和連接管理。消息的拆裝是指無法用單個(gè)CAN數(shù)據(jù)裝載全部的數(shù)據(jù),需要拆分為多個(gè)數(shù)據(jù)幀。當(dāng)多個(gè)故障在使用傳輸協(xié)議傳輸時(shí),第一個(gè)字節(jié)為數(shù)據(jù)幀編號,其后為故障燈狀態(tài),接著是所要發(fā)送的故障碼DTC,多個(gè)DTC按順序填充到數(shù)據(jù)幀中,如果最后一個(gè)數(shù)據(jù)幀中的數(shù)據(jù)字節(jié)不到7位,那么就用0xFF來進(jìn)行填充。數(shù)據(jù)重組就是將接收到的數(shù)據(jù)幀按照序列編號把多包消息的數(shù)據(jù)幀重新組合成原始數(shù)據(jù),按照編號排列,第一個(gè)數(shù)據(jù)幀中的第2、3字節(jié)為故障燈狀態(tài),從第4個(gè)字節(jié)開始每4個(gè)字節(jié)為一個(gè)故障碼,不足4個(gè)字節(jié)則從下一個(gè)數(shù)據(jù)幀的第2個(gè)字節(jié)開始讀取。
當(dāng)沒有故障發(fā)生的時(shí)候或者單個(gè)故障發(fā)生時(shí),此時(shí)DM1和DM2就可以直接使CAN數(shù)據(jù)幀發(fā)送相應(yīng)的故障碼數(shù)據(jù);當(dāng)有多個(gè)故障時(shí),采用BAM多包方式發(fā)送,首先發(fā)送一條BAM公告信息,接著使用數(shù)據(jù)傳輸PGN多包發(fā)送故障碼。
單個(gè)故障采用單包發(fā)送的方式,使用單個(gè) CAN數(shù)據(jù)幀發(fā)送相應(yīng)故障碼。數(shù)據(jù)格式如表5所列,DM1表示當(dāng)前故障,ID=0x18FE CA00;DM2表示先前故障,格式與DM1相同。
表5 單包數(shù)據(jù)格式
多個(gè)故障采用多包發(fā)送方式,首先系統(tǒng)ECU發(fā)送BAM公告信息,接著發(fā)送多個(gè)數(shù)據(jù)幀。數(shù)據(jù)拆裝時(shí)每個(gè)數(shù)據(jù)幀的第一個(gè)字節(jié)為數(shù)據(jù)幀編號,其余7個(gè)字節(jié)存放故障碼數(shù)據(jù),其中數(shù)據(jù)字節(jié)為故障碼的有效字節(jié)數(shù)。BAM信息格式、多包信息格式如表6、表7所列。
表6 BAM信息格式
表7 多包數(shù)據(jù)格式
故障解析流程圖如圖3所示。
圖3 故障解析流程圖
手持終端收到數(shù)據(jù)包時(shí),要對數(shù)據(jù)包進(jìn)行解析,顯示出發(fā)動(dòng)機(jī)中對應(yīng)的故障,從而實(shí)現(xiàn)故障的診斷,方便故障維修者對其進(jìn)行維修。故障碼詮釋如表8所列。
表8 故障碼詮釋
在對報(bào)文的分析中,采用JAVA語言開發(fā)的eclipse[6]軟件,提出一種解析報(bào)文的算法,能有效地解析接收的各種報(bào)文,顯示對應(yīng)的故障源。
由于終端接收到的數(shù)據(jù)報(bào)文為十六進(jìn)制數(shù),將接收到的報(bào)文轉(zhuǎn)換為字符串進(jìn)行處理。方法如下:
① 使用length()函數(shù)[7]取得字符串長度。
② 根據(jù)字符串長度判斷為單幀數(shù)據(jù)還是多幀數(shù)據(jù)。
③ 當(dāng)為單幀數(shù)據(jù)時(shí),使用regionMatches(),截取字符串的有用故障碼,與目標(biāo)故障碼進(jìn)行比較,輸出對應(yīng)的故障源。
④ 當(dāng)為多幀數(shù)據(jù)時(shí),使用substring()函數(shù)從BAM信息中截取數(shù)據(jù)包個(gè)數(shù)有用字符,并使用Integer.parseInt()函數(shù)將其轉(zhuǎn)換成十進(jìn)制數(shù),即數(shù)據(jù)包的個(gè)數(shù)。
⑤ 根據(jù)數(shù)據(jù)包的個(gè)數(shù)分為兩幀數(shù)據(jù)和兩幀以上數(shù)據(jù),需要將故障碼截取、拼湊,再與目標(biāo)故障碼進(jìn)行比較,從而得到對應(yīng)的故障源。
JAVA代碼解析方法如下:
package org.xs.date;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.*;
public class DateStore {
//列舉幾種目標(biāo)故障碼
Static String J1939DTC[]=
{"0x00000000","0x010C00BE",
"0x010200BE","0x010C02D3","0x010202D3"};
//故障碼對應(yīng)的故障部件
static String故障部件[]={"無事件", "曲軸傳感器","曲軸傳感器", "凸輪傳感器", "凸輪傳感器"};
//故障碼對應(yīng)的故障源
static String故障源[]={ "無事件", "無曲軸信號故障", "曲軸信號異常", "無凸輪信號故", "凸輪信號異常故障"};
public static void main(String[] args)
//TODO Auto-generated method stub
throws IOException{
//生成BufferedReader()函數(shù)對象(手動(dòng)從控制端輸入標(biāo)準(zhǔn)數(shù)據(jù)
//幀進(jìn)行模擬)
BufferedReaderbr =New BufferedReader(new InputStreamReader(System.in));
//新建一個(gè)字符串?dāng)?shù)組對象
String str[]=new String[1];
//str[0]中存放手動(dòng)輸入的字符串故障碼
str[0]=br.readLine();
//DTC1表示截取拼湊的故障碼
String DTC1="";
//XX表示數(shù)據(jù)包的個(gè)數(shù)
String XX;
//LSB表示字符串的長度
int LSB =str[0].length();
switch(LSB){
//單幀數(shù)據(jù)處理
case 32:
for(int i=0;i if( J1939DTC[i].regionMatches(2,str[0],18,8)) System.out.println("["+故障部件[i]+"]"+" "+故障源[i]); break; //多幀數(shù)據(jù)處理 default: //從BAM中讀取數(shù)據(jù)包的個(gè)數(shù),截取表示數(shù)據(jù)包個(gè)數(shù)的字節(jié) XX=str[0].substring(20,22); //將字符串轉(zhuǎn)換成十進(jìn)制 int XXD=Integer.parseInt(XX,16); switch(XXD){ //2幀處理數(shù)據(jù) case 2: //將故障碼拼湊起來,與目標(biāo)故障碼進(jìn)行比較 DTC1=str[0].substring(52,62)+str[0].substring(80,94); for(int j=0;j //k表示DTC1的字節(jié)數(shù) int k=0; while(k<24){ if(DTC1.regionMatches(k,J1939DTC[j],2,8)){ System.out.println("["+故障部件[j]+"]"+" "+故障源[j]); } k=k+8;}} break; default: DTC1=str[0].substring(52,62)+str[0].substring(80,94); int m=2; while(m //兩幀以上數(shù)據(jù)的故障碼拼湊公式 DTC1=DTC1+str[0].substring(96+32*(m-2)+16,96+32*(m-2)+16+14); m++; } //判斷PC是否為8的倍數(shù) if(DTC1.length()%8==0){ for(int j=0;j int k=0; while(k<10+14*(XXD-1)){ if(DTC1.regionMatches(k,J1939DTC[j],2,8)){ System.out.println("["+故障部件[j]+"]"+""+故障源[j]);} k=k+8;}}} else if (DTC1.length()%8!=0){ for(int j=0;j int k=0; while(k<8*(DTC1.length()/8)){ if(DTC1.regionMatches(k,J1939DTC[j],2,8)){ System.out.println("["+故障部件[j]+"]"+""+故障源[j]); } k=k+8;}}}}}}}}} 手動(dòng)輸入: ① (單幀數(shù)據(jù))FEFF0818FECA00FFFF010C00BE FFFFFF 輸出:[曲軸傳感器] 無曲軸信號故障 ② (兩幀數(shù)據(jù))FFFFFF1CECFF00FFFFFF02FFFFF FFFFFFFFFFF18FECA00C00BE01FFFFFFFF18FECA00 FF0200BE010C02D3FF 輸出: [曲軸傳感器] 無曲軸信號故障 [曲軸傳感器] 曲軸信號異常 [凸輪傳感器] 無凸輪信號故 ③ (六幀數(shù)據(jù))FFFF01E4F00601FFFFFFFF18FECB 00FFEFFFFFFFF18FECB00FF01E3F00501E4F0FFFFFF FF18FECB00FF0501E5F00501E6FFFFFFFF18FECB00F FF005010D029001FFFFFFFF18FECB00FF040290010502 90FF 輸出: [第6缸噴油電磁閥] 噴油閥第6缸兩端開路 [第6缸噴油電磁閥] 噴油閥第6缸對地短路 [第6缸噴油電磁閥] 噴油閥第6缸阻抗超限 [PCV閥1電子驅(qū)動(dòng)] PCV閥1兩端短路 [PCV閥1電子驅(qū)動(dòng)] PCV閥1開路 [PCV閥1電子驅(qū)動(dòng)] PCV閥1對地短路 [PCV閥1電子驅(qū)動(dòng)] PCV閥1對電源短路 [PCV閥2電子驅(qū)動(dòng)] PCV閥2兩端短路 [PCV閥2電子驅(qū)動(dòng)] PCV閥2開路 [PCV閥2電子驅(qū)動(dòng)] PCV閥2對地短路 ④ …… 以上只對部分故障碼進(jìn)行了模擬,此種方法適用于收到的所有(1~N)數(shù)據(jù)幀。 汽車故障診斷技術(shù)是汽車電子控制技術(shù)的重要組成部分。隨著電子行業(yè)的逐漸發(fā)展,系統(tǒng)故障診斷方法變得更加智能,很多現(xiàn)代化的工具在汽車故障診斷上得到了應(yīng)用,在實(shí)現(xiàn)故障診斷的設(shè)計(jì)過程中,方法各異。而本文是基于J1939協(xié)議,綜合利用ECU與CAN轉(zhuǎn)藍(lán)牙通信[8]模塊,手持終端(智能手機(jī))接收藍(lán)牙模塊的報(bào)文信息,實(shí)現(xiàn)故障的有效診斷,相對于傳統(tǒng)的診斷儀來說,更趨向于智能化的發(fā)展方向。 [1] 康拉德 賴夫.汽車電子學(xué)[M].3版.李裕華,譯.西安:西安交通大學(xué)出版社,2011. [2] 羅富坤.汽車故障診斷技術(shù)[M].北京:化學(xué)工業(yè)出版社,2009. [3] W 齊默爾曼,R 施密特加爾.汽車總線系統(tǒng)[M].鄧萍,譯.北京:機(jī)械工業(yè)出版社,2011. [4] 樊永強(qiáng).汽車故障診斷與排除[M].長沙:中南大學(xué)出版社,2011. [5] Sandoval Leon,Jairo A.Study of Transit Bus Duty Cycle and its Influence on Fuel Economy and Emissions of Diesel-Electric Hybrids[J].Mechanical Engineering,2011:123-128. [6] 霍爾澤.Eclipse集成開發(fā)工具[M].O,Reilly Taiwan公司,譯.南京:東南大學(xué)出版社,2007. [7] 史賦星,史佳.JAVA基礎(chǔ)及應(yīng)用教程[M].北京:清華大學(xué)出版社,2007. [8] 吳海東,梅海龍.汽車車載網(wǎng)絡(luò)技術(shù)與檢修[M].北京:北京理工大學(xué)出版社,2010. 汪志斌(碩士研究生),主要研究方向?yàn)槠嚬收显\斷;吳長水(副教授),主要研究領(lǐng)域?yàn)閮?nèi)燃機(jī)排放控制。 AutomobileFailureDiagnosisandAnalysisTroubleCodefromECUBasedonJ1939Protocol WangZhibin,WuChangshui,HuangMintao,FengChen (College of Automotive Engineering,Shanghai University of Engineering Science,Shanghai 201620,China) In the process of vehicle fault diagnosis,the CAN communication ECU based on SAE J1939 protocol can provide engine performance detection parameters and vehicle network communication data to realize the sharing of multiple ECU data in vehicle network.The J1939 protocol also supports faulty diagnosis.The data is converted into the serial data (including the CAN ID address) through the data conversion module.The diagnostic tool (handheld terminal) can read the current fault code DM1 or clear the current fault code DM11.In this paper,a research method of vehicle diagnosis is proposed.At the same time,an analytical method based on JAVA language is proposed,which can effectively detect the fault of automobile engine in real-time. CAN communication;ECU;SAE J1939 protocol U46 A 薛士然 2017-06-23)4.3 程序調(diào)試
結(jié) 語