,,,
(上海工程技术大学 汽车工程学院,上海 201620)
基于J1939协议的车辆故障诊断与ECU报文解析
汪志斌,吴长水,黄敏涛,冯琛
(上海工程技术大学 汽车工程学院,上海 201620)
在对汽车的故障诊断过程中,基于SAE J1939协议的CAN通信的ECU提供的发动机性能检测参数和整车网络通信数据,实现整车网络中多个ECU数据的共享; J1939协议同时也支持故障的诊断,通过数据转换模块将接收的数据转换成串行数据(包含CAN的ID地址),诊断工具(手持终端)可以读取当前故障码DM1或清除当前故障码DM11。本文提出了一种车辆故障诊断的研究策略,同时提出了一种基于JAVA语言的报文的解析方法,能够有效实时地实现对汽车发动机的故障检测。
CAN 通信;ECU;SAE J1939协议
SAE J1939协议专供卡车及其拖车、大客车等商用车使用,是用来支持分布在车辆各个不同位置的电控单元之间实现实时闭环控制功能的高速通信标准,包括通信层、物理层和数据链路层,以 CAN2.0B 为基础,数据传输速率可达 250 kbps。另外,它还定义了网络层和应用层的协议,是目前大型汽车中应用最广泛的应用层协议,同样能够实现故障诊断、故障处理。
SAE J1939协议由美国汽车工程师协会(SAE)制定,目前在载货汽车及客车等重型车辆中广泛应用,其以CAN2.0B作为网络核心协议,在其基础上定义了网络层和协议层,遵循7层OSI网络结构,并对每个被实现的层使用不同的文件进行描述,通过提供一个标准的框架,使电控单元ECU之间可以实现网络互联通信而不需要额外的功能接口。表1介绍了CAN2.0的标准和扩展格式,及J1939协议所定义的格式。J1939协议报文单元的具体格式如下所示:
PRIORITYRDPPDUFORMATPDUSPECIFICSOURCEADDRESSDATAFIELD3118880~64
可以看出,J1939标识符包括:PRIORTY(优先权位);R(保留位);DP(数据页位);PDU FORMAT(协议数据单元);PDU SPECIFIC(扩展单元)和SOURCE ADDRESS(源地址)。而报文单元还包括64位的数据场。
基于CAN通信的J1939协议的ECU能提供发动机性能检测参数和整车网络通信,实现整车网络中多个ECU的数据共享,同时J1939协议支持故障诊断,通过诊断工具可以读取或清除诊断故障码[4]。系统ECU主要采用两种通信方式:单帧通信和多帧通信。在检测和整车网络通信时主要采用单帧通信方式;在诊断时因灵活的故障码个数是可变的,因此单帧通信与多帧通信结合使用。
表1 CAN2.0的标准和扩展及J1939协议的格式
CAN转蓝牙控制器模块(简称BluetoothCAN)接收来自终端的命令(串行数据),转换成对应的CAN总线格式的数据帧,发送给发动机控制器ECU。其次,BluetoothCAN接收来自ECU的数据,转换成对应的串行数据(包含CAN的ID地址),发送给终端。
数据接收与发送使用CAN转蓝牙控制器模块,通过OBD(On Board Diagnosis、车载诊断系统)接口(CAN总线)和发动机控制单元(ECU)进行通信,读取来自ECU[5]的信息并进行处理,转换成蓝牙数据发送给手持终端;同样,手持终端发送数据信息给BluetoothCAN,BluetoothCAN转换成CAN报文信息发送给发动机控制器ECU,实现手持终端与ECU的信息交互。原理示意图如图1所示。
图1 故障诊断过程
J1939协议包括在线故障诊断功能,由诊断应用层定义。系统在进行故障诊断时主要采用4种消息帧实现故障诊断,分别为DM1发送当前故障码、DM2发送先前故障码、DM3清除先前故障码和DM11清除当前故障码。J1939协议诊断故障码(DTC)由4个独立域构成,同时也是由4个字节(32位)表示,这4个部分如表2所列。
表2 DTC的构成
其中SPN为发生故障的部件,FMI为发生的故障类型,CM为SPN转换排列规则,OC为本故障的发生次数。OC取值范围为0~126,即使故障发生次数大于126时,OC也保持为126。
J1939协议规定请求参数组编号PGN为59904,诊断工具地址为0x2B,ECU地址为0x00。系统ECU在接收到诊断设备的请求后,在中断服务程序中对请求帧所请求的目标PGN内容进行判断,如果请求的是读取先前故障 DM2,那么系统ECU将向诊断工具发送先前故障码;如果请求的是清除先前故障码DM3或当前故障码DM11,那么系统ECU将清除先前故障码或当前故障码。请求帧数据、请求参数组格式分别如表3、表4所列。
表3 请求帧格式
表4 请求参数组
其中PGN为0x00 FECB时为先前故障码,PGN为0x00 FECC时为清除先前故障码,PGN为0x00 FED3时为清除当前故障码。
当诊断工具向ECU请求先前故障码或清除故障码时,诊断工具发送请求PGN和被请求的PGN给ECU电控单元,ECU给诊断工具回复相应的数据。诊断工具与ECU之间的数据交互如图2所示。
图2 故障码的请求与发送
诊断时,当前故障和先前故障所包含的故障码有三种情况:无故障、一个故障和多个故障。无故障和一个故障时,使用单个CAN数据帧就可以发送全部数据,而当传输多个故障时,需要使用多个数据帧才能发送完毕,这时就需要使用J1939协议的传输协议功能。J1939协议通信的核心是负责数据传输的传输协议,传输协议功能主要包含三个部分:消息的拆装、数据重组和连接管理。消息的拆装是指无法用单个CAN数据装载全部的数据,需要拆分为多个数据帧。当多个故障在使用传输协议传输时,第一个字节为数据帧编号,其后为故障灯状态,接着是所要发送的故障码DTC,多个DTC按顺序填充到数据帧中,如果最后一个数据帧中的数据字节不到7位,那么就用0xFF来进行填充。数据重组就是将接收到的数据帧按照序列编号把多包消息的数据帧重新组合成原始数据,按照编号排列,第一个数据帧中的第2、3字节为故障灯状态,从第4个字节开始每4个字节为一个故障码,不足4个字节则从下一个数据帧的第2个字节开始读取。
当没有故障发生的时候或者单个故障发生时,此时DM1和DM2就可以直接使CAN数据帧发送相应的故障码数据;当有多个故障时,采用BAM多包方式发送,首先发送一条BAM公告信息,接着使用数据传输PGN多包发送故障码。
单个故障采用单包发送的方式,使用单个 CAN数据帧发送相应故障码。数据格式如表5所列,DM1表示当前故障,ID=0x18FE CA00;DM2表示先前故障,格式与DM1相同。
表5 单包数据格式
多个故障采用多包发送方式,首先系统ECU发送BAM公告信息,接着发送多个数据帧。数据拆装时每个数据帧的第一个字节为数据帧编号,其余7个字节存放故障码数据,其中数据字节为故障码的有效字节数。BAM信息格式、多包信息格式如表6、表7所列。
表6 BAM信息格式
表7 多包数据格式
故障解析流程图如图3所示。
图3 故障解析流程图
手持终端收到数据包时,要对数据包进行解析,显示出发动机中对应的故障,从而实现故障的诊断,方便故障维修者对其进行维修。故障码诠释如表8所列。
表8 故障码诠释
在对报文的分析中,采用JAVA语言开发的eclipse[6]软件,提出一种解析报文的算法,能有效地解析接收的各种报文,显示对应的故障源。
由于终端接收到的数据报文为十六进制数,将接收到的报文转换为字符串进行处理。方法如下:
① 使用length()函数[7]取得字符串长度。
② 根据字符串长度判断为单帧数据还是多帧数据。
③ 当为单帧数据时,使用regionMatches(),截取字符串的有用故障码,与目标故障码进行比较,输出对应的故障源。
④ 当为多帧数据时,使用substring()函数从BAM信息中截取数据包个数有用字符,并使用Integer.parseInt()函数将其转换成十进制数,即数据包的个数。
⑤ 根据数据包的个数分为两帧数据和两帧以上数据,需要将故障码截取、拼凑,再与目标故障码进行比较,从而得到对应的故障源。
JAVA代码解析方法如下:
package org.xs.date;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.*;
public class DateStore {
//列举几种目标故障码
Static String J1939DTC[]=
{"0x00000000","0x010C00BE",
"0x010200BE","0x010C02D3","0x010202D3"};
//故障码对应的故障部件
static String故障部件[]={"无事件", "曲轴传感器","曲轴传感器", "凸轮传感器", "凸轮传感器"};
//故障码对应的故障源
static String故障源[]={ "无事件", "无曲轴信号故障", "曲轴信号异常", "无凸轮信号故", "凸轮信号异常故障"};
public static void main(String[] args)
//TODO Auto-generated method stub
throws IOException{
//生成BufferedReader()函数对象(手动从控制端输入标准数据
//帧进行模拟)
BufferedReaderbr =New BufferedReader(new InputStreamReader(System.in));
//新建一个字符串数组对象
String str[]=new String[1];
//str[0]中存放手动输入的字符串故障码
str[0]=br.readLine();
//DTC1表示截取拼凑的故障码
String DTC1="";
//XX表示数据包的个数
String XX;
//LSB表示字符串的长度
int LSB =str[0].length();
switch(LSB){
//单帧数据处理
case 32:
for(int i=0;i if( J1939DTC[i].regionMatches(2,str[0],18,8)) System.out.println("["+故障部件[i]+"]"+" "+故障源[i]); break; //多帧数据处理 default: //从BAM中读取数据包的个数,截取表示数据包个数的字节 XX=str[0].substring(20,22); //将字符串转换成十进制 int XXD=Integer.parseInt(XX,16); switch(XXD){ //2帧处理数据 case 2: //将故障码拼凑起来,与目标故障码进行比较 DTC1=str[0].substring(52,62)+str[0].substring(80,94); for(int j=0;j //k表示DTC1的字节数 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 //两帧以上数据的故障码拼凑公式 DTC1=DTC1+str[0].substring(96+32*(m-2)+16,96+32*(m-2)+16+14); m++; } //判断PC是否为8的倍数 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;}}}}}}}}} 手动输入: ① (单帧数据)FEFF0818FECA00FFFF010C00BE FFFFFF 输出:[曲轴传感器] 无曲轴信号故障 ② (两帧数据)FFFFFF1CECFF00FFFFFF02FFFFF FFFFFFFFFFF18FECA00C00BE01FFFFFFFF18FECA00 FF0200BE010C02D3FF 输出: [曲轴传感器] 无曲轴信号故障 [曲轴传感器] 曲轴信号异常 [凸轮传感器] 无凸轮信号故 ③ (六帧数据)FFFF01E4F00601FFFFFFFF18FECB 00FFEFFFFFFFF18FECB00FF01E3F00501E4F0FFFFFF FF18FECB00FF0501E5F00501E6FFFFFFFF18FECB00F FF005010D029001FFFFFFFF18FECB00FF040290010502 90FF 输出: [第6缸喷油电磁阀] 喷油阀第6缸两端开路 [第6缸喷油电磁阀] 喷油阀第6缸对地短路 [第6缸喷油电磁阀] 喷油阀第6缸阻抗超限 [PCV阀1电子驱动] PCV阀1两端短路 [PCV阀1电子驱动] PCV阀1开路 [PCV阀1电子驱动] PCV阀1对地短路 [PCV阀1电子驱动] PCV阀1对电源短路 [PCV阀2电子驱动] PCV阀2两端短路 [PCV阀2电子驱动] PCV阀2开路 [PCV阀2电子驱动] PCV阀2对地短路 ④ …… 以上只对部分故障码进行了模拟,此种方法适用于收到的所有(1~N)数据帧。 汽车故障诊断技术是汽车电子控制技术的重要组成部分。随着电子行业的逐渐发展,系统故障诊断方法变得更加智能,很多现代化的工具在汽车故障诊断上得到了应用,在实现故障诊断的设计过程中,方法各异。而本文是基于J1939协议,综合利用ECU与CAN转蓝牙通信[8]模块,手持终端(智能手机)接收蓝牙模块的报文信息,实现故障的有效诊断,相对于传统的诊断仪来说,更趋向于智能化的发展方向。 [1] 康拉德 赖夫.汽车电子学[M].3版.李裕华,译.西安:西安交通大学出版社,2011. [2] 罗富坤.汽车故障诊断技术[M].北京:化学工业出版社,2009. [3] W 齐默尔曼,R 施密特加尔.汽车总线系统[M].邓萍,译.北京:机械工业出版社,2011. [4] 樊永强.汽车故障诊断与排除[M].长沙:中南大学出版社,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集成开发工具[M].O,Reilly Taiwan公司,译.南京:东南大学出版社,2007. [7] 史赋星,史佳.JAVA基础及应用教程[M].北京:清华大学出版社,2007. [8] 吴海东,梅海龙.汽车车载网络技术与检修[M].北京:北京理工大学出版社,2010. 汪志斌(硕士研究生),主要研究方向为汽车故障诊断;吴长水(副教授),主要研究领域为内燃机排放控制。 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 程序调试
结 语