OBD诊断程序开发.docx
- 文档编号:7544515
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:12
- 大小:233.38KB
OBD诊断程序开发.docx
《OBD诊断程序开发.docx》由会员分享,可在线阅读,更多相关《OBD诊断程序开发.docx(12页珍藏版)》请在冰豆网上搜索。
OBD诊断程序开发
如何开发标准的汽车OBD2诊断程序及相关应用层协议下载
开发标准OBD2诊断程序要准备的资料及硬件
1、因TL718已经为你建立了物理层、数据链层和部分应用层的协议,所以只要OBD2标准应用层协议文本,ISO15031-5或SAEJ1979(这两个协议是相同的内容)。
2、TL718诊断接口1套或用TL718芯片自建电路。
3、家用PC机电脑一台。
4、安装软件:
Accessport调试软件及VC++(或VB、BC++等)你喜欢的开发软件。
5、符号OBD2标准的汽车发动机电脑一块(或汽车一台)
TL718基本信息
TL718通过一个UART串口与单片机、PDA或PCRS232通讯,在有的新的PC机上已没有装备RS232串口,可以通过虚拟串口实现与TL718通讯,例USBTORS232、以太网TORS232、或蓝牙TORS232等等。
------- RS232 ------ OBD2电缆 ----------
| PC |<----------->|TL718|<------------>|汽车诊断口|
------- ------ ----------
不管使用怎样的物理连接,你可以使用超级终端或串口调试工具,直接通过键盘发送和接收字符。
在使用串口调试软件前,首先必须设置正确的COM端口号和正确的波特率。
一般为9600波特率(PIN6=0V),或38400波特率(PIN6=VCC,PPOC设置默认值)。
串口设置为:
8个数据位,校验位:
0,停止位1位。
如果设置错误,将不能和TL718正常通讯。
所有从TL718的响应以一个回车符(0X0D)及一个可选的换行符(0X0A)结束。
正确连接,打开电源后。
TL718将驱动测试LED灯,(闪亮3次)后,发送:
TL718starting
〉
如果正确收到以上信息代表串口及连接设置正确。
第二行“〉”符号代表TL718为空闲状态,可以立即从RS232接收数据。
如果没有收到“〉”符号就向TL718发送数据,可能引起数据丢失。
而发生不正确的响应。
PC从串口向TL718发送的指令格式:
TL718有2种格式的命令
1、OBD连接命令,与车辆发生通讯。
2、内部命令,全部以AT开头,不与辆发生通讯。
●发送必须以0x0d(回车符)结束的ASCII码字符,回车符后面的字符被TL718丢弃。
●TL718内部命令以“AT”开头,后面跟可见字符。
不可见字附及空格被忽视。
●OBD命令只能包含16进制的ASCII码(0-9,a-f,A-F),空格被忽略。
●如果发送的指令,不能被TL718有效解释,TL718将返回一个“?
”表明,发送指令无效。
●当TL718处理OBD命令时,TL718连续监视RTS引脚及RS232输入,其中任何一个情况发生,TL718将中断当前的OBD命令,使它快速返回提示符“〉”,等待接收新的命令。
●大小写字符都能被TL718接收,空格被忽略。
比喻命令“ATZ”、“atz”、“atz”都是一样的。
比喻我们向TL718发送一个复位指令只要向RS232串口发送ASCII字符“ATZ”+0x0d(回车符);
TL718Starting
>ATZ
ELM327v1.2
>
注:
ATZ指令返回ELM327V1.2是为了使用现成的国外OBD观软件,所以用了这个返回信息。
返回本芯片信息用“ATI”指令。
>ATI
TL718v1.0
>
返回芯片编号用"AT@S"指令(这个编号升级硬件和提供保修服务时需要)
>AT@S
CodeNumb:
98764323
>
TL718的OBD命令
如果你向TL718发送的指令以16进制数的ASCII开头,则TL718认为是OBD命令,TL718接收后,把成对的ASCII码16进制数转换成单个字节的16进制数据发送到车辆电脑数据总线。
OBD命令实际是被嵌入到数据消息包内后发送到数据总线上的,大多数标准要求:
在每个数据消息包内包含三字节的头及最后一个数据校验字节。
TL718自动添加了这些附加的字节,这些默认的值对OBD2诊断模式请求指令都不需要更改,但如果你想要更改这些头字节值,可以用内部命令“ATSHXXXXXX”更改。
大部分OBD指令长度只有一个字节或2个字节,TL718充许发送的最长度是对应标准规定的字节,超出部分将被丢弃。
发出的OBD指令,不能出现单个的数字,16进制数必须成对发送,比喻0不可能发送单个的“0”,必须发送“00”,如果出现单个数字,TL718认为指令格式错误,将返回一个“?
”。
由于OBD(汽车诊断标准)都使用16进制,所以TL718接收发送的数据也是16进制的。
例15的代表的十进制值是21;
当发送完OBD2命令后,TL718等待从总线接收OBD消息,如果接收到地址的消息并且地址匹配,则TL718就把数据从RS232发送给PC,如果TL718接收到的消息和发送的地址不匹配,则忽略该消息。
但也可以通过ATBD内部命令查看该接收到的消息包。
如果直到等待时间(P2MAXATST命令的设置值,默认值100ms)结束,没有接收到匹配地址的数据,则TL718返回“NODATA”,如果接收到数据并且地址匹配则复位计时间,继续等待,直到等待时间溢出。
OBD2标准诊断模式
开发OBD2诊断程序,必须掌握ISO15031-5(SAEJ1979)定义的九种诊断模式,对于英文不是很好的朋友,本站有个中文的说明:
可以参考:
更详细的内容,还是要看ISO15031-5标准文本,15031–5给出了可供选择的所有参数的标准定义,包括存储格式、单位和文字描述等信息。
每个参数都有一个参数标识(PID)与之相对应。
OBD系统输出信息的模式/服务
∙Mode1:
请求动力系当前数据
∙Mode2:
请求冻结祯数据
∙Mode3:
请求排放相关的动力系诊断故障码
∙Mode4:
清除/复位排放相关的诊断信息
∙Mode5:
请求氧传感器监测测试结果
∙Mode6:
请求非连续监测系统OBD测试结果
∙Mode7:
请求连续监测系统OBD测试结果
∙Mode8:
请求控制车载系统,测试或者部件
∙Mode9:
读车辆和标定识别号
每个模式后面紧跟一个参数标识(PID)表示后面是什么参数,每个模式的PID00是ISO15031定义专用的参数,每个符合标准的电脑必须支持这个参数标识。
代表该模式对其他PID是否支持。
与车辆数据通讯
OBD2命令的格式
1、
上图是OBD2的诊断指令的消息包的完整格式(极大部分厂商专用的功能也是这种格式),TL718能自动设定了Header/ID/PCI/CHECKSUM这部分数据,对于标准的OBD2诊断程序你都几乎不用关心修改它。
想了解有关内容,它们分别定义在ISO14230-2、J1850、IS9141-2和ISO15765-2数据链层定义的文本内。
TL718自动检测数据总线的物理连接,能在协议1-9间自动搜寻当前车辆的协议,搜寻到后自动返回数据。
当然也可手工设定到某个特定的协议。
TL718不搜寻A-F协议,因为A-F协议它们没有象OBD2一样有一个统一的ISO15031应用层协议,那样的话自动搜索变得毫无意义。
2、ISO15031(SAEJ1979)是应用层的协议,同样它也不用关心使用什么样的物理层协议(TL718自动连接),你编程时只要发送数据,和接收及处理接收回来的数据(计算或显示)。
所以这么多种物理连接,以统一标准规定的数据包来发送接收,我們编程处理变得相对简单。
下面我们来讨论OBD2指令。
3、这里我们只要关心数据消息包的7字节数据(databyte)部分就可以了
ISO15031-5定义:
字节 意义
1 MODE 代表请求数据的类型
2 PID 参数标识
3-7 根据不同的MODE及PIDISO15031-5有详细的定义
如上图所示,连接好线路及打开车匙到ON,不要起动车辆。
不用做任何设定,只要你向TL718发送指令,TL718自动返回车辆响应的数据。
例1:
图所示:
“0100”代表ISO15031-5定义MODE01PID00指令。
>0100
4100BF9FB990
第1个字节41 代表Mode01 (01+40,标准定义)
第2个字节00 代表 PID00
3-6字节是车辆发送回来关于MODE01PID00请求返回来的数据
表示模式00所支持其他(PID01---PID32)标识的按位定义的数据1代表支持0代表不支持。
例2:
请求(读取)发动机水温MODE01PID05
我们只要简单的向车辆发送0105指令
>0105
41057B
41代表MODE01
05代表PID05
7B是水温值10进制数值是(7*16+11)123水温是123-40=80度
例3:
读取发动机转速rpm MODE01PID0C
同样只要向TL718发送:
010C
>010C
410C1AF8
1AF8是2字节的16进制值,转换为10进制数是6904,每格1/4rpm
转速是6904/4=1726rpm
注:
以上数据的转换,及格式在ISO15031-5内有详细定义
读OBD2故障码(DTCsDiagnosticTroubleCodes)
读故障码是诊断仪最常用的功能,这里只是简单的说明一下,详细内容请查阅ISO15031-5文本
一般情况下可直接用MODE03读取当前故障码,但这里我们
先用MODE01PID01读取现在有多少个故障码存在ECU内
>0101
410181076504
>
4101前面已说明是对MODE01PID01的响应代码,
81 代表当前的故障码数,这个10进制数值是129,不是代表有129个故障码,
81它的最高位MSB代表是否点亮故障指灯,低7位代表了故障码的数量
16进制算法应是0x81&0x7F=0x01所以是一个故障码。
也可是10进制数值直接减128
即:
129-128=1;
所以81代表了,故障灯点亮,有一个故障码,81后面的数据请参考标准文本,和读故障码没有关系。
在这个例子中,TL718只返回了一行数据,但是如果有另外的控制模块也附合响应条件,有可能返回多行信息。
比喻常见的:
发动机电脑和自动波箱控制电脑同时返回信息,就会有2行信息,要确认是哪一个电脑返回的是哪一行
信息,必须设置返回OBD消息保的三字节头(ATH1内部命令打开),查看消息头字节中的第三个字节(源地址)确定
是那个电脑模块返回的消息包。
这里先不讨论,在另外章节来详细讨论,多消息包数据。
现在已经读了有多少个故障码,下一步读实际的故障码是什么。
用OBD2诊断模式MODE03读取:
只要简单地向TL718发送03
>03
可能的返回信息数据如下:
43013300000000
注:
如果故障码数量多于3或多个电脑模块,会返回多行消息包,
43是对MODE03请求的响应(03+40),另外的6个字节是故障代码,2个字节代表一个故障码。
这里有3个代表故障码的数据:
013300000000,“0000”是ISO15031在这个模式下返回的填充数据
不是实际的故障码。
故障码含义:
ISO定义:
二字节故障码(例0133)的第一个数如下表所示 现在来分析上面的故障码0133:
第一个数字“0”按上表用“P0”代替。
0133就代表是故障码P0133。
同样如果收到的是D016则,“D”用U1代替,则故障代码就时U1016;
如果收到是1131则代换后,故障代码是P1131。
故障码的定义,详细请看:
SAEJ2012-2002
注:
ISO15765CAN故障码消息包和J11850、ISO9141ISO14230返回的信息有稍不同,
编写程序时要注意,ISO15765返回的信息第二个数据代表的是电脑模块有多少个故障码(DTCs),
详细看ISO15031-5内定义。
清除故障代码
OBD2诊断模式MODE04是复位ECU的一个功能,同时也清触故障代码;执行后ECU将:
1、复位故障代码的数量为0
2、删除所有的故障代码
3、删除存储的冻结桢数据
4、删除所有O2传感器听测试数据
5、删除模式MODE06和MODE07的数据信息
复位后你的汽车由于复位了一些数据,短时间内可能会引起工作异常。
为了防止不小心复位ECU,
ISO15031-5要求所有的扫描工具(诊断仪)在发送MODE04指令前,必须加一个“确认信息”。
TL718不监视发送信息的内容是否是复位指令。
>04
44
>
发送04指令后,车辆ECU接收成攻,将立即复位以上内容,
并发回一个MODE04的响应信息44(04+40)。
一般的流程:
结束语
1.ISO14230ISO9141要求通讯前的初始化过程、及连接后要求有一个周期性的握手信号,这些TL718都已经自动完成,OBD2标准的诊断程序都不用更改。
怎样更改这些参数:
1.看完这些内容,就可开始你的OBD2开发。
实际上厂商专用的诊断功能程序差不多也是这么简单。
为什么叫专用,是因为它没有公开应用层的协议。
开发时比我们OBD2开发多了一个过程。
就是怎样用TL718从专用的设备中读得专用的诊断指令(也就是应用层协议)。
在开发专用功能的诊断仪中讨论这个问题。
2.OBD2其他的诊断模式这里不再说明,诊断方法都是一样的。
详细内容查看ISO15031-5或SAEJ1979。
3.多试多做你会发现开发诊断程序原来如此简单。
4.OBD2诊断程序源代码
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OBD 诊断 程序 开发