黄名云
摘 要:J1939协议是国标规定的柴油车的OBD协议,外部诊断设备要与车辆通信,必须满足J1939协议的要求。文章对一种基于J1939协议的诊断儀的软件设计进行了说明。分析了J1939协议报文的特点,对请求报文的发送,广播报文的接收,多帧报文的传输协议,故障码的解析等进行了实例说明,并设计了整个程序处理流程。实际使用中能正确读取车辆数据,实时性好。关键字:J1939协议;OBD;传输协议;故障码中图分类号:G255.54 文献标识码:B 文章编号:1671-7988(2020)11-42-04
Abstract: J1939 protocol is the OBD protocol of diesel vehicle stipulated by the national standard. If the external diagnostic equipment wants to communicate with the vehicle, it must meet the requirements of J1939 protocol. In this paper, I described the software design of an OBD scanner based on J1939 protocol. I analyzed the characteristics of J1939 protocol message, illustrated the sending of request message, the receiving of broadcast message, the transmission protocol of multi-frame messages, the analysis of DTC, and designed the whole program processing flow. In practice, it can read the vehicle data correctly and has a good real-time performance.Keywords: J1939 Protocol; OBD; Transmission Protocol; DTCCLC NO.: G255.54 Document Code: B Article ID: 1671-7988(2020)11-42-04
引言
GB18285-2018和GB3847-2018分别对汽油车和柴油车增加了OBD检查的内容,适用于新车下线,注册登记及在用车检验,标准规定,若OBD检查不合格,判定排放检验结果不合格[1][2]。这说明我国已将车载OBD技术作为机动车尾气排放控制的重要手段。作为OBD技术的基础,诊断通信协议是关键的一环。目前,轻型车使用比较多的是ISO 14230和ISO 15765,即基于K线的KWP2000和基于CAN总线的诊断协议。重型车OBD技术起步较晚,由于ISO 15765经过多年的发展和应用已非常完善和成熟,因此也被广泛应用到重型车中。国家环境保护部发布的《HJ 437-2008车用压燃式、气体燃料点燃式发动机与汽车车载诊断(OBD)系统技术要求》,允许生产商可以自由选择ISO15765和SAE J1939[3]。实测中东风天锦、天龙、江铃凯锐、帅铃等车型的OBD系统都是采用SAE J1939协议。
1 J1939协议介绍
SAE J1939协议是美国汽车工程师协会(SAE)提出的基于CAN2.0B的高层网络通信协议,用于为中重型道路车辆上电子部件间的通讯提供标准的体系结构[4]。协议不但规定了ECU之间如何通信,也包括了故障诊断。SAE J1939网络遵循7层OSI结构,用不同的文件描述每个实现的层,表1列出了SAE J1939协议的构成。
SAE J1939-11的物理层要求由CAN控制器完成,无需操心。本文中的诊断仪设计主要参照SAE J939-13的技术要求来设计诊断接口,参照SAE J1939-21数据链路层来设计报文的通信方式,参照SAE J939-71应用层来解析实时数据流,参照SAE J1939-73来读取故障码,冻结帧等与排放有关的故障信息。下面分别对这几部分进行说明。
2 诊断接口及地址定义
SAE J939-13中定义的诊断接口为9针圆形接口,而机动车检测站对2018年7月1日以后生产的柴油车检测中,OBD采用SAE J1939协议的车辆,其诊断接口使用的也是ISO15031-3规定的标准16针梯形接口,尚未碰到9针圆形接口。因此备用一个9针转16针的转换器以备不时之需。
SAE J1939-81推荐发动机模块的地址为0x00,外部诊断仪的地址为0xF9。本诊断仪使用推荐地址。
3 协议数据单元(PDU)
SAE J1939-21数据链路层采用的是CAN2.0扩展帧29位ID,通讯速率为250K ,并对29位ID进行了重新分配,将其分为:优先级(P)、保留位(R)、数据页(DP)、协议数据单元(PDU)格式(PF)、PDU特定域(PS)和源地址(SA)[6]。如下图所示。将CAN报文帧格式封装成PDU协议格式进行传输。
其中R、DP、PF、PS组成了参数组(PGN),PF<240时,协议数据单元为PDU1格式,此时PS代表目标地址,PGN的低字节置0,保留位始终为0;PF≥240时,协议数据单元为PDU2格式,此时PS代表组扩展GE,它是PGN的低字节。PDU1格式用于发送包含一特定目的地址的报文,当目的地址为0xFF时,代表是全局地址;PDU2格式则只能用于广播发送[6]。
4 报文请求和广播接收
J1939协议的消息类型有5种:命令、请求、广播/响应、确认、组功能[6]。诊断仪要想从车辆获取与排放相关的信息,主要处理两种類型的消息,即请求和广播。请求需要诊断仪向发动机模块发送请求报文才能获得相应的信息,而广播则是发动机模块按一定的时间间隔主动往总线上发送的消息,如当前故障码即为发动机模块每隔一秒便在总线上广播一次,对于这类消息只需设定好滤波器直接接收就好。表2分别列出了部分需要请求,及广播接收的消息。
4.1 请求类型消息的实现
请求可以向特定目的地址请求,也可向全局范围内请求,请求报文的参数组编号(PGN)为0x00EA00(59904),优先级为6,报文定义如图2所示[6]。
例:诊断仪(地址为0xF9)向发动机模块(地址为0x00)请求就绪状态信息(PGN为65230(FECE)),则发送的请求报文为:18EA00F9 CE FE 00 FF FF FF FF FF
其中诊断仪为源地址,发动机为目标地址,数据域为要请求的PGN,低字节先发送,高字节后发送。
发动机模块回复的消息格式为:18FECE00 01 04 0F 06 00 08 00,如图3。
若250ms内没收到任何消息,则代表无应答,ECU不支持对应的PGN。
4.2 广播消息的接收
对于主动广播的消息,需设置CAN屏蔽滤波器,接收对应的PGN。
例:可疑参数编号(SPN)为190的转速信息,所属参数组为61444(F00416),实测发动机模块每隔20ms往外发送一帧消息。
若要接收这广播消息,可先关闭所有滤波器,不接收任何消息,并清空接收缓冲区,然后精确设置滤波器只接收PGN为61444的消息。每接收一帧消息便关闭滤波器,进入数据处理阶段,处理完数据再打开滤波器。
若等待250ms无任何消息,则代表总线上无这类消息传送。
5 传输协议
由于CAN报文的数据域最多为8个字节,若一个PGN传送的消息的大于8个字节,则需要启用传输协议。传输协议分连接管理和多包消息广播。连接管理是向特定目的地址传输多帧数据时使用,即发送者请求发送(RTS)一个分段报文,其包含有多少字节及包数,接收者需响应准备发送(CTS)报文,告诉发送者其能接收的包数和想要从第几包开始接收。建立这样一个握手连接后发送者方开始传输数据;多包消息广播则不需要建立连接,由发送者发送一帧广播公告消息(BAM),通知所有节点要广播一条长消息,这条公告消息包含了要发送消息的字节数和参数组,接着便开始数据传输[6]。两种传输协议详情可参照文档J1939-21相关部分说明。下面举一帧连接管理消息的实例进行说明。
设诊断仪(地址0xF9)为 A 节点,发动机模块(地址0x00)为 B 节点,A向B请求历史故障码信息,PGN= 65227(00FECB16),A与B之间消息传送如表3所示。
6 故障码
故障码在J1939-73文档中定义,由4个字节组成,包含SPN、FMI、CM和OC四个部分。SPN是可疑参数编号,占19bits,代表诊断项目;FMI是故障模式标志,定义了故障类型,占5bits,CM是可疑参数编号的转化方式,占1bit,SPN有4种转化方式,取值1表示按照方案1,2,3进行转换,详情见J1939-73文档。取值0表示按照方案4进行转换,即19位的SPN均采用英特尔格式。CM推荐取值为0;OC是故障发生次数,占7bits。举例:
SPN:1208=4B816=00000000100101110002(19位)
FMI:3=316=000112(5位)
OC:10=A16=00010102(7位)
CM:016=02(1位)
因CM=0,所以按方案4转换,其结果如表4所示[7]。
表3得到的故障码信息有效数据为18个字节,前两个字节为故障灯信息,由于一个故障占4个字节,所以剩下16个字节包含4个故障码,SPN按照表4转化方式,提取一个DTC,其C语言代码实现如下:
u32 Temp=0x0000;
Temp =(Temp|(CANRxBuf.Data[4]>>5))<<8;//提取19位SPN的最高3位
Temp = (Temp|CANRxBuf.Data[3])<<8;//提取中8位
Temp = Temp|CANRxBuf.Data[2]; //19位SPN提取完毕
DTC_SPN =Temp;
DTC_FMI= CANRxBuf.Data[4]&0x1f;
DTC_OC = CANRxBuf.Data[5]&0x7f;
7 软件设计流程
综合J1939报文特点,OBD诊断仪需要发送请求消息,接受广播消息。接收到的消息又有单帧消息和多帧消息之分,对于接收到的RTS消息需要进行CTS连接管理,每次消息的接收都需要设置屏蔽滤波器。消息接收采用中断模式,每接收到一帧消息便开始计时,若超过规定时间接收中断再无消息传来,代表报文已接收完成,之后进入数据处理阶段,数据流的解析参照文档J1939-71,故障码,冻结帧等与排放相关的数据解析参照文档J1939-73。软件程序设计流程如图4所示。
8 结束语
本文所设计的OBD诊断仪已经在机动车检测站投入使用,能够满足国标对车辆OBD检查的要求,并且响应迅速,实时性好。J1939协议在重型柴油车国五及国六车辆中是国标规定使用的OBD协议,理解J1939协议对开发车载OBD系统及OBD外接设备都是极其重要的一环,也是车联网的
基础。本文对J1939协议的数据传输格式,传输协议,故障码等难以理解的部分进行了实例说明,并给出了设计框架及C语言程序的实现,以供学习者参考。
参考文献
[1] GB 18285-2018,汽油车污染物排放限值及测量方法(双怠速法及简易工况法)[S].2018.
[2] GB 3847-2018,柴油车污染物排放限值及测量方法(自由加速法及加载减速法)[S].2018.
[3] HJ 437-2008,车用压燃式、气体燃料点燃式发动机与汽车车载诊断(OBD)系统技术要[S].2008.
[4] 周良润.对当前J1939协议的汽车信息采集系统研讨[J].科教导刊-电子版(上旬),2016,(8):173.
[5] SAE J1939,Recommended Practice for a Serial Control and Comm -unications Vehicle Network[S].2005.
[6] SAE J1939-21,Data Link Layer[S].2006.
[7] SAE J1939-73,Application Layer-Diagnostics[S].2015.