关于DTC诊断故障码的获取与清除(ISO14229系列之14、19服务)
1、19服务-——读取诊断故障码信息(ReadDTCInformation)
1、01子服务
2、02子服务
3、04子服务
4、06子服务
5、0A子服务
2、14服务-——清除故障信息 (ClearDiagnosticInformation)
总结
1、19服务-——读取诊断故障码信息(ReadDTCInformation)
1、01子服务
通过状态掩码去查找与其相匹配的故障个数。
通过该服务诊断仪能够请求ECU中DTC状态与DTC状态掩码相匹配的故障码个数。如果某一个故障码的实际状态位为1,并且DTC状态掩码中的相应位也为1,那么就认为该故障码的状态与DTC状态掩码相匹配(即:如果DTC状态掩码字节与DTC实际状态字节进行逻辑“位与”运算后的结果为非零值,那么两者就相匹配);此时则将故障数+1。如果诊断仪定义了一个状态掩码,其中包含ECU不支持的位,那么ECU仅使用本身支持的位进行处理故障信息。请求格式如下:
收到请求后,ECU的响应报文格式如下:
关于19 01服务代码部分示例如下(帮助理解,仅供参考):
uint16 DTC_GetDtcCountByStatusMask(uint8 status_mask) /*按照状态掩码统计ECU中与之匹配的DTC数*/
{
uint16 Dtc_count = 0;
uint8 Record_count;
for(Record_count = 0; Record_count < DTC_CODE_MAX_NUM; Record_count++)/*检索所有的DTC*/
{
if((Dtc_dtc_status_record[Record_count].dtc_status.status_byte & status_mask) != 0)
{
Dtc_count++;
}
}
return Dtc_count;
}
FUNC(void,DCM_CODE) App_Fault_Memory_Read_Number(P2VAR(Dcm_MsgContextType,AUTOMATIC,DCM_APPL_DATA) pMsgContext)
{
uint16 Counter = 0U;
uint8 DtcStatus_Temp;
DtcStatus_Temp = pMsgContext->reqData[DCM_INDEX_2]; /*通过19 01服务第3个字节发送状态掩码;*/
Counter = DTC_GetDtcCountByStatusMask(DtcStatus_Temp); /*按照状态掩码统计ECU中与之匹配的DTC数(代码如上)*/
pMsgContext->resData[DCM_INDEX_2] = DTCStatusAvailabilityMask; /*返回ECU支持的状态位*/
/* Change below data if necessary */
/* 0x00 ISO15031-6Format,0x01 ISO14229-1Format,0x02 J1939 Format */
pMsgContext->resData[DCM_INDEX_3] = 0x00U; /*返回ECU使用的DTC格式标识符,
00:15031-6;01:14229-1;02:J1939*/
pMsgContext->resData[DCM_INDEX_4] = (uint8)(Counter >> 8U); /*返回按照状态掩码统计出来的DTC数*/
pMsgContext->resData[DCM_INDEX_5] = (uint8)(Counter);
/* Always equals 6, don't change it */
pMsgContext->resDataLen = 6U;
DsdInternal_ProcessingDone(pMsgContext);
}
Ps:DTC状态掩码参数包含8个DTC状态位,其位定义如下:
2、02子服务
按照定义的状态掩码的形式去查找匹配的故障,将匹配的DTC标识符(3个字节)、DTC状态(1个字节)信息返回。上一小节的01子服务只统计与状态掩码相匹配的DTC个数,02子服务则会将这些匹配的DTC信息返回。请求格式如下:
收到请求后,ECU的响应报文格式如下:
关于19 02服务代码部分示例如下(帮助理解,仅供参考):
uint16 DTC_GetDtcByStatusMask(uint8 *p_dtc, uint8 status_mask) /*按照状态掩码统计ECU中与之匹配的DTC,返回该DTC信息*/
{
uint16 dtc_count = 0;
uint8 record_count;
for(record_count = 0; record_count < DTC_CODE_MAX_NUM; record_count++)
{
if((Dtc_dtc_status_record[record_count].dtc_status.status_byte & status_mask) != 0)
{
*p_dtc++ = Dtc_dtc_code_data[record_count].dtc_high_byte;
*p_dtc++ = Dtc_dtc_code_data[record_count].dtc_middle_byte;
*p_dtc++ = Dtc_dtc_code_data[record_count].dtc_low_byte;
*p_dtc++ = Dtc_dtc_status_record[record_count].dtc_status.status_byte;
dtc_count++;
}
}
return dtc_count;
}
FUNC(void,DCM_CODE) App_Fault_Memory_Read_identified_errors(P2VAR(Dcm_MsgContextType,AUTOMATIC,DCM_APPL_DATA) pMsgContext)
{
uint16 counter = 0U;
uint8 DtcStatus_Temp;
DtcStatus_Temp = pMsgContext->reqData[DCM_INDEX_2]; /*通过19 02服务第3个字节发送状态掩码;*/
/*按照状态掩码统计ECU中与之匹配的DTC,返回其DTC信息(代码如上)*/
counter = DTC_GetDtcByStatusMask(&(pMsgContext->resData[DCM_INDEX_3]),DtcStatus_Temp);
pMsgContext->resData[DCM_INDEX_2] = DTCStatusAvailabilityMask; /*返回ECU支持的状态位*/
pMsgContext->resDataLen = DCM_INDEX_3 + (counter * 4U); /*更新响应报文的长度;*/
DsdInternal_ProcessingDone(pMsgContext);
}
为了方便找到故障的原因,车厂一般会在诊断调查表中定义一些信息作为快照信息,例如故障的发生时间、电压、行驶里程数、车速等。在对应故障发生时,ECU端要记录发生故障时的快照信息;而04服务就是用于请求指定故障码(DTC)的快照信息,通过查找故障发生时刻的这些数据,来分析故障原因。请求格式如下:
19服务用于故障码信息的读取;14服务则用于对故障码信息的清除。14服务的操作简单,但关于19服务,包含了比较多的子服务功能,其中,比较常用的子服务如下:
Sub-function Description
01 reportNumberOfDTCByStatusMask/通过状态掩码报告DTC数量
02 reportDTCByStatusMask/通过状态掩码报告DTC信息
04 reportDTCSnapshotRecordByDTCNumber/获取指定DTC的快照记录
06 reportDTCExtendedDataRecordByDTCNumber/获取指定DTC的扩展数据记录
0A reportSupportedDTC/获取ECU支持的所有DTC
————————————————
版权声明:本文为CSDN博主「第55号小白鸭」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44536482/article/details/93090417