前言:以下关于SAE J1939协议知识点的学习均抄录自书籍,侵权请联系删除。
故障诊断
SAE J1939诊断应用层定义了用于诊断服务的报文帧,诊断报文(DM)提供了用于车辆进行诊断和维修的功能。
诊断故障代码定义
SAE J1939在应用层中还定义了12种诊断报文(Diagnostic Message,DM)、诊断故障代码(Diagnostic Trouble Code,DTC)。
诊断故障代码由三部分组成:可疑参数号(Suspect Parameter Number,SPN)、故障模式标志(Failure Mode Identifier,FMI)及故障发生次数(Occurrence Count,OC)。一个故障代码由4字节构成,三个部分的位数分配如表所示。
通过诊断故障代码,诊断设备可以确定是哪个控制器在报告诊断信息。诊断故障代码以4字节发送。DTC表示法定义如图所示。
可疑参数编号SPN是一个19位的值,用于识别特定的元素组件或与ECU相关的参数。这在诊断中非常有用,它允许已经检测到某个部件如传感器有效故障情况的ECU发送一个故障报文以识别故障部件。SPN由SAE委员会分配。初始的511个SPN是预置SPN,所有其他的SPN将从512开始继续编号,且每加1作为一个新的赋值。生产厂商可自定义可疑参数,编号自520 192~524 287,多达4096个。
FMI定义了为SPN所识别的子系统中发现的故障类型,该故障可能不是电子故障,相反可能是需要报告给设备技术员甚至操作员的子系统故障或条件,这些条件包括需要报告的系统事件或状态。FMI、SPN为预留的和发生次数域组合已知的诊断故障代码。
故障发生次数OC是一个7位的数域,它包括了一个故障从先前激活状态到激活状态的变化次数,最大值为126。计数向上溢出时,该计数器值保留为126。假如发生次数未知,则该域所有位的数值均设为1。
SAE J1939定义了12种诊断报文帧并为它们分配了不同的PGN,如下表所示:
经常使用的是DM1(激活状态的诊断故障代码)、DM2(历史诊断故障代码)和DM3(历史诊断故障代码的数据清除/复位)。
激活状态的诊断故障代码(DM1)
本指令包含的诊断信息仅限于当前正处于激活状态的可改变指示灯状态的故障码。故障码和指示灯都是电子控制单元用来通知网络上其他成员该模块自身的诊断状态的。该数据信息包括:指示灯状态、一列诊断代码以及当前激活状态诊断代码的发生次数,还包括排放相关的诊断故障代码。
当前已定义的指示灯(故障指示灯、红色停止灯、琥珀色警告灯和保护灯)都与诊断故障代码有关。若电子控制单元未检测到当前故障码,那么它发出的指示灯的状态信息提示可以关闭指示灯,但直接控制指示灯的部件必须权衡影响该指示灯的所有在线控制模块的诊断信息后才能决定是否改变指示灯的状态。
一旦有DTC成为激活的故障,就有DM1消息会被传输,并在之后处于正常的仅一次每秒的更新速度。如果故障激活的时间是1s或更长,然后变为不激活的状态,则应传输DM1消息以反映这种状态的改变。如果在1s的更新期间有不同的DTC改变状态,则要传输新的DM1消息反映这个DTC。
为了避免因高频率的间断故障而引起的高消息传输率,建议每个DTC每秒只有一个状态改变被传输。这样,如果故障码在1s期间发生两次状态改变,激活/不激活状态,会有一个用于确认DTC成为激活状态的消息,和在下一个传输期间确认它为不激活状态的消息。该消息仅当有一个激活的DTC存在或处于响应一个请求时才被发送。
DM1多包报文传输
有关DM1多包报文在SAE J1939协议如何定义的,可以参考:J1939 DM1多包广播报文发送
DM1多包广播报文发送和接送遵循J1939传输协议规定。
传输协议功能
传输协议功能是数据链路层的一部分,它可再细分为两个主要功能:(1)消息的拆装和重组;(2)连接管理。
在以下的段落中,术语“发送者”(Originator)指那些发出请求发送消息的电控单元或设备,术语“响应者”(Responder)指那些发出应答发送消息的电动单元或设备。
(1)消息的拆装和重组
长度大于8字节的消息无法用一个单独的CAN数据帧来装载。因此,它们必须被拆分为若干个小的数据包,然后使用单独的数据帧对其逐一传送,而接收方必须能够接收这些单独的数据帧,然后解析各个数据包并重组成原始的信息。
(2)数据包
CAN数据帧包含一个8字节的数据场。由于那些重组成长消息的单独数据包必须要能够被一个个识别出来,才可以正确重组,因此把数据场的首字节定义为数据包的序列编号。
每个数据包都会被分配到一个从1-255的序列编号。由此可知,最长的数据长度是1785字节(255包*7字节/包)。
(3)序列编号
序列编号在数据拆装时分配给每个数据包,然后通过网络传送给接受方。接收方接收后,利用这些编号把数据包重组回原始信息。
序列编号将从1开始依次分配给每个数据包,直到整个数据都被拆装和传送完毕。这些数据包将从编号为1的数据包开始按编号的递增顺序发送。
(4)数据拆装
过长的数据是指那些无法用一个单独的CAN数据帧全部装载的数据(例如数据场长于8字节的消息)。
考虑本协议的用途,过长的数据这里被认为是与一些9字节长或以上的字符串相关的参数群。第一个数据传送包包含序列编号1和字符串的头7个字节,其后的7个字节跟随序列编号2存放在另一个SAE J1939/CAN数据帧中,再随后的7个字节与编号3一起,就这样直到原始信息中所有的字节都被存放到SAE J1939/CAN数据帧中并被传送。
多组广播信息的数据包发送间隔时间为50-200ms。对于发送到某个指定目标地址的多组消息,发送者将维持数据包(在CTS允许多于一个数据包时)发送间隔的最长时间不多于200ms。响应者必须知道这些数据包都是具有相同的标识符。
每个数据传送包(除了传送队列中的最后一个数据包)都装载着原始数据中的7个字节,而最后一个数据包的数据场的8个字节包含数据包的序列编号和与参数群相关数据的至少一个字节,余下未使用的字节全部设置为FF(16进制数)。
(5)数据重组
数据包被陆续地接收后,多组消息的数据包将会按照序列编号的顺序重新组合成一长串字节。这一长串字节将被传送给负责处理长数据的应用程序模块。