讲到0x14服务,就要大概讲一下DTC的基础知识。这里说得不是很全面,如果想详细了解或者想看0x19服务的,请移步到我另一篇文章《全面了解DTC》。
DTC基础知识
DTC就是诊断故障码,英文名Diagnostic Trouble Code,用于指示车辆系统中出现的故障。每个DTC由两大部分组成,一部分是ID,另一部分是列表内容。每一类故障码组成一组DTC组,0x14服务是按照DTC组清除被测对象记录的故障码(DTC)列表内容。一清除就整个组里面的全部故障码都清除,不能清除单独某一个故障码。该服务清除的具体内容是整组DTC相关所有信息:DTC故障状态、快照和扩展信息。
需要注意的是,清除故障码只是将列表内容里面的故障清除,并不代表故障本身已经被修复。如果故障仍然存在,它可能会再次被检测到,并生成新的故障。因此,在清除故障码之前,应该先确保故障已经被解决。
故障码列表内容里面一般由一个字节专门用来表示故障状态信息,不同的位表示不同的故障,最常用的是当前故障和历史故障。当前故障位为1,表示整车当前处于该DTC的故障状态下。历史故障位为1,表示整车曾经处于该DTC故障状态下。当前故障和历史故障之间相互不冲突,当前故障位置1的时候,历史故障位也要置1。
请求报文格式
由于0x14服务的子功能为DTC组,厂商可以自己规定,譬如0x100000就是车身组。如果发0xFF FFFF,就会将全部组里面的故障码,也就是全部故障码。
肯定应答报文格式
应答报文先按照 服务+0x40的格式回复,也就是0x54,这里就不回复子功能了。
否定应答码
否定应答码就是拒绝回答你的理由,在会话控制服务里面有3个
报文长度错误0x13:这个很常见,因为所有诊断都是基于TP协议的,人家的请求格式要求2个字节,你发了3个,他就会以这个理由拒绝你。
条件不满足0x22:这个给厂商的自由度就很高,到底是什么条件不满足呢?是厂商自由发挥的,可以是一个可以是多个,他们之间可以是与可以是或的关系。举个最简单的例子,因为诊断往往是因为车子有问题了才拉到4S店来维修检查、诊断问题,所以查问题的时候要求车子是静止的,车速要为0,而且发动机转速要低于多少转,这些都可以成为条件。
请求越界0x31:子功能输入有误,规定是一定要发0xFF 0xFF 0xFF,不能发别的。
程序执行失败0x72:DTC内容为了断电不丢失,往往会记录在记忆芯片里面。这个NRC往往是擦除记忆芯片里面的DTC内容的时候擦除失败了。
否定应答码优先级
NRC设计复杂了,就会有优先级,先判断哪个后判断哪个,越到后面的错误要求越高。如果前面的报文长度错误0x13发生了,哪怕后面的请求越界0x31有错误,也不会返回NRC0x31,得先打通前面的小喽啰请求越界0x31,才会遇到后面的大魔王程序执行失败0x72。