,,,
(上海工程技術(shù)大學(xué) 汽車工程學(xué)院,上海 201620)
基于J1939協(xié)議的車輛故障診斷與ECU報文解析
汪志斌,吳長水,黃敏濤,馮琛
(上海工程技術(shù)大學(xué) 汽車工程學(xué)院,上海 201620)
在對汽車的故障診斷過程中,基于SAE J1939協(xié)議的CAN通信的ECU提供的發(fā)動機性能檢測參數(shù)和整車網(wǎng)絡(luò)通信數(shù)據(jù),實現(xiàn)整車網(wǎng)絡(luò)中多個ECU數(shù)據(jù)的共享; J1939協(xié)議同時也支持故障的診斷,通過數(shù)據(jù)轉(zhuǎn)換模塊將接收的數(shù)據(jù)轉(zhuǎn)換成串行數(shù)據(jù)(包含CAN的ID地址),診斷工具(手持終端)可以讀取當(dāng)前故障碼DM1或清除當(dāng)前故障碼DM11。本文提出了一種車輛故障診斷的研究策略,同時提出了一種基于JAVA語言的報文的解析方法,能夠有效實時地實現(xiàn)對汽車發(fā)動機的故障檢測。
CAN 通信;ECU;SAE J1939協(xié)議
SAE J1939協(xié)議專供卡車及其拖車、大客車等商用車使用,是用來支持分布在車輛各個不同位置的電控單元之間實現(xiàn)實時閉環(huán)控制功能的高速通信標(biāo)準(zhǔn),包括通信層、物理層和數(shù)據(jù)鏈路層,以 CAN2.0B 為基礎(chǔ),數(shù)據(jù)傳輸速率可達 250 kbps。另外,它還定義了網(wǎng)絡(luò)層和應(yīng)用層的協(xié)議,是目前大型汽車中應(yīng)用最廣泛的應(yīng)用層協(xié)議,同樣能夠?qū)崿F(xiàn)故障診斷、故障處理。
SAE J1939協(xié)議由美國汽車工程師協(xié)會(SAE)制定,目前在載貨汽車及客車等重型車輛中廣泛應(yīng)用,其以CAN2.0B作為網(wǎng)絡(luò)核心協(xié)議,在其基礎(chǔ)上定義了網(wǎng)絡(luò)層和協(xié)議層,遵循7層OSI網(wǎng)絡(luò)結(jié)構(gòu),并對每個被實現(xiàn)的層使用不同的文件進行描述,通過提供一個標(biāo)準(zhǔn)的框架,使電控單元ECU之間可以實現(xiàn)網(wǎng)絡(luò)互聯(lián)通信而不需要額外的功能接口。表1介紹了CAN2.0的標(biāo)準(zhǔn)和擴展格式,及J1939協(xié)議所定義的格式。J1939協(xié)議報文單元的具體格式如下所示:
PRIORITYRDPPDUFORMATPDUSPECIFICSOURCEADDRESSDATAFIELD3118880~64
可以看出,J1939標(biāo)識符包括:PRIORTY(優(yōu)先權(quán)位);R(保留位);DP(數(shù)據(jù)頁位);PDU FORMAT(協(xié)議數(shù)據(jù)單元);PDU SPECIFIC(擴展單元)和SOURCE ADDRESS(源地址)。而報文單元還包括64位的數(shù)據(jù)場。
基于CAN通信的J1939協(xié)議的ECU能提供發(fā)動機性能檢測參數(shù)和整車網(wǎng)絡(luò)通信,實現(xiàn)整車網(wǎng)絡(luò)中多個ECU的數(shù)據(jù)共享,同時J1939協(xié)議支持故障診斷,通過診斷工具可以讀取或清除診斷故障碼[4]。系統(tǒng)ECU主要采用兩種通信方式:單幀通信和多幀通信。在檢測和整車網(wǎng)絡(luò)通信時主要采用單幀通信方式;在診斷時因靈活的故障碼個數(shù)是可變的,因此單幀通信與多幀通信結(jié)合使用。
表1 CAN2.0的標(biāo)準(zhǔn)和擴展及J1939協(xié)議的格式
CAN轉(zhuǎn)藍牙控制器模塊(簡稱BluetoothCAN)接收來自終端的命令(串行數(shù)據(jù)),轉(zhuǎn)換成對應(yīng)的CAN總線格式的數(shù)據(jù)幀,發(fā)送給發(fā)動機控制器ECU。其次,BluetoothCAN接收來自ECU的數(shù)據(jù),轉(zhuǎn)換成對應(yīng)的串行數(shù)據(jù)(包含CAN的ID地址),發(fā)送給終端。
數(shù)據(jù)接收與發(fā)送使用CAN轉(zhuǎn)藍牙控制器模塊,通過OBD(On Board Diagnosis、車載診斷系統(tǒng))接口(CAN總線)和發(fā)動機控制單元(ECU)進行通信,讀取來自ECU[5]的信息并進行處理,轉(zhuǎn)換成藍牙數(shù)據(jù)發(fā)送給手持終端;同樣,手持終端發(fā)送數(shù)據(jù)信息給BluetoothCAN,BluetoothCAN轉(zhuǎn)換成CAN報文信息發(fā)送給發(fā)動機控制器ECU,實現(xiàn)手持終端與ECU的信息交互。原理示意圖如圖1所示。
圖1 故障診斷過程
J1939協(xié)議包括在線故障診斷功能,由診斷應(yīng)用層定義。系統(tǒng)在進行故障診斷時主要采用4種消息幀實現(xiàn)故障診斷,分別為DM1發(fā)送當(dāng)前故障碼、DM2發(fā)送先前故障碼、DM3清除先前故障碼和DM11清除當(dāng)前故障碼。J1939協(xié)議診斷故障碼(DTC)由4個獨立域構(gòu)成,同時也是由4個字節(jié)(32位)表示,這4個部分如表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時,OC也保持為126。
J1939協(xié)議規(guī)定請求參數(shù)組編號PGN為59904,診斷工具地址為0x2B,ECU地址為0x00。系統(tǒng)ECU在接收到診斷設(shè)備的請求后,在中斷服務(wù)程序中對請求幀所請求的目標(biāo)PGN內(nèi)容進行判斷,如果請求的是讀取先前故障 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時為先前故障碼,PGN為0x00 FECC時為清除先前故障碼,PGN為0x00 FED3時為清除當(dāng)前故障碼。
當(dāng)診斷工具向ECU請求先前故障碼或清除故障碼時,診斷工具發(fā)送請求PGN和被請求的PGN給ECU電控單元,ECU給診斷工具回復(fù)相應(yīng)的數(shù)據(jù)。診斷工具與ECU之間的數(shù)據(jù)交互如圖2所示。
圖2 故障碼的請求與發(fā)送
診斷時,當(dāng)前故障和先前故障所包含的故障碼有三種情況:無故障、一個故障和多個故障。無故障和一個故障時,使用單個CAN數(shù)據(jù)幀就可以發(fā)送全部數(shù)據(jù),而當(dāng)傳輸多個故障時,需要使用多個數(shù)據(jù)幀才能發(fā)送完畢,這時就需要使用J1939協(xié)議的傳輸協(xié)議功能。J1939協(xié)議通信的核心是負責(zé)數(shù)據(jù)傳輸?shù)膫鬏攨f(xié)議,傳輸協(xié)議功能主要包含三個部分:消息的拆裝、數(shù)據(jù)重組和連接管理。消息的拆裝是指無法用單個CAN數(shù)據(jù)裝載全部的數(shù)據(jù),需要拆分為多個數(shù)據(jù)幀。當(dāng)多個故障在使用傳輸協(xié)議傳輸時,第一個字節(jié)為數(shù)據(jù)幀編號,其后為故障燈狀態(tài),接著是所要發(fā)送的故障碼DTC,多個DTC按順序填充到數(shù)據(jù)幀中,如果最后一個數(shù)據(jù)幀中的數(shù)據(jù)字節(jié)不到7位,那么就用0xFF來進行填充。數(shù)據(jù)重組就是將接收到的數(shù)據(jù)幀按照序列編號把多包消息的數(shù)據(jù)幀重新組合成原始數(shù)據(jù),按照編號排列,第一個數(shù)據(jù)幀中的第2、3字節(jié)為故障燈狀態(tài),從第4個字節(jié)開始每4個字節(jié)為一個故障碼,不足4個字節(jié)則從下一個數(shù)據(jù)幀的第2個字節(jié)開始讀取。
當(dāng)沒有故障發(fā)生的時候或者單個故障發(fā)生時,此時DM1和DM2就可以直接使CAN數(shù)據(jù)幀發(fā)送相應(yīng)的故障碼數(shù)據(jù);當(dāng)有多個故障時,采用BAM多包方式發(fā)送,首先發(fā)送一條BAM公告信息,接著使用數(shù)據(jù)傳輸PGN多包發(fā)送故障碼。
單個故障采用單包發(fā)送的方式,使用單個 CAN數(shù)據(jù)幀發(fā)送相應(yīng)故障碼。數(shù)據(jù)格式如表5所列,DM1表示當(dāng)前故障,ID=0x18FE CA00;DM2表示先前故障,格式與DM1相同。
表5 單包數(shù)據(jù)格式
多個故障采用多包發(fā)送方式,首先系統(tǒng)ECU發(fā)送BAM公告信息,接著發(fā)送多個數(shù)據(jù)幀。數(shù)據(jù)拆裝時每個數(shù)據(jù)幀的第一個字節(jié)為數(shù)據(jù)幀編號,其余7個字節(jié)存放故障碼數(shù)據(jù),其中數(shù)據(jù)字節(jié)為故障碼的有效字節(jié)數(shù)。BAM信息格式、多包信息格式如表6、表7所列。
表6 BAM信息格式
表7 多包數(shù)據(jù)格式
故障解析流程圖如圖3所示。
圖3 故障解析流程圖
手持終端收到數(shù)據(jù)包時,要對數(shù)據(jù)包進行解析,顯示出發(fā)動機中對應(yīng)的故障,從而實現(xiàn)故障的診斷,方便故障維修者對其進行維修。故障碼詮釋如表8所列。
表8 故障碼詮釋
在對報文的分析中,采用JAVA語言開發(fā)的eclipse[6]軟件,提出一種解析報文的算法,能有效地解析接收的各種報文,顯示對應(yīng)的故障源。
由于終端接收到的數(shù)據(jù)報文為十六進制數(shù),將接收到的報文轉(zhuǎn)換為字符串進行處理。方法如下:
① 使用length()函數(shù)[7]取得字符串長度。
② 根據(jù)字符串長度判斷為單幀數(shù)據(jù)還是多幀數(shù)據(jù)。
③ 當(dāng)為單幀數(shù)據(jù)時,使用regionMatches(),截取字符串的有用故障碼,與目標(biāo)故障碼進行比較,輸出對應(yīng)的故障源。
④ 當(dāng)為多幀數(shù)據(jù)時,使用substring()函數(shù)從BAM信息中截取數(shù)據(jù)包個數(shù)有用字符,并使用Integer.parseInt()函數(shù)將其轉(zhuǎn)換成十進制數(shù),即數(shù)據(jù)包的個數(shù)。
⑤ 根據(jù)數(shù)據(jù)包的個數(shù)分為兩幀數(shù)據(jù)和兩幀以上數(shù)據(jù),需要將故障碼截取、拼湊,再與目標(biāo)故障碼進行比較,從而得到對應(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ù)對象(手動從控制端輸入標(biāo)準(zhǔn)數(shù)據(jù)
//幀進行模擬)
BufferedReaderbr =New BufferedReader(new InputStreamReader(System.in));
//新建一個字符串?dāng)?shù)組對象
String str[]=new String[1];
//str[0]中存放手動輸入的字符串故障碼
str[0]=br.readLine();
//DTC1表示截取拼湊的故障碼
String DTC1="";
//XX表示數(shù)據(jù)包的個數(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ù)包的個數(shù),截取表示數(shù)據(jù)包個數(shù)的字節(jié) XX=str[0].substring(20,22); //將字符串轉(zhuǎn)換成十進制 int XXD=Integer.parseInt(XX,16); switch(XXD){ //2幀處理數(shù)據(jù) case 2: //將故障碼拼湊起來,與目標(biāo)故障碼進行比較 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;}}}}}}}}} 手動輸入: ① (單幀數(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ū)動] PCV閥1兩端短路 [PCV閥1電子驅(qū)動] PCV閥1開路 [PCV閥1電子驅(qū)動] PCV閥1對地短路 [PCV閥1電子驅(qū)動] PCV閥1對電源短路 [PCV閥2電子驅(qū)動] PCV閥2兩端短路 [PCV閥2電子驅(qū)動] PCV閥2開路 [PCV閥2電子驅(qū)動] PCV閥2對地短路 ④ …… 以上只對部分故障碼進行了模擬,此種方法適用于收到的所有(1~N)數(shù)據(jù)幀。 汽車故障診斷技術(shù)是汽車電子控制技術(shù)的重要組成部分。隨著電子行業(yè)的逐漸發(fā)展,系統(tǒng)故障診斷方法變得更加智能,很多現(xiàn)代化的工具在汽車故障診斷上得到了應(yīng)用,在實現(xiàn)故障診斷的設(shè)計過程中,方法各異。而本文是基于J1939協(xié)議,綜合利用ECU與CAN轉(zhuǎn)藍牙通信[8]模塊,手持終端(智能手機)接收藍牙模塊的報文信息,實現(xiàn)故障的有效診斷,相對于傳統(tǒng)的診斷儀來說,更趨向于智能化的發(fā)展方向。 [1] 康拉德 賴夫.汽車電子學(xué)[M].3版.李裕華,譯.西安:西安交通大學(xué)出版社,2011. [2] 羅富坤.汽車故障診斷技術(shù)[M].北京:化學(xué)工業(yè)出版社,2009. [3] W 齊默爾曼,R 施密特加爾.汽車總線系統(tǒng)[M].鄧萍,譯.北京:機械工業(yè)出版社,2011. [4] 樊永強.汽車故障診斷與排除[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. 汪志斌(碩士研究生),主要研究方向為汽車故障診斷;吳長水(副教授),主要研究領(lǐng)域為內(nèi)燃機排放控制。 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é) 語