计划赶不上变化

导航

关于ASEJ1939的解析

项目要用到ASEJ1939的协议,看了很多网上的博客,发现没有特别详细的,有些写的我都看不懂,理论一大堆。硬着头皮粗粗学了一下,大致摸出了点门道,就此记录一下,以免以后用忘记了。

先上图最小数据结构pdu 打开SAE+J1939-21-2001文档可以获得

 

P:优先级,决定该 PDU 进入总线的优先权限。值越小则优 先级越高。

R:预留的  基本为0

DP:数据页,这是 PGN 装载的一个位置,超过 65536 后该 位才会被置 1,现在一般的项目基本用不到,除非航天航空才会用到这么多pgn。

PF:PDU 格式(PDU Fomat),PGN 装载的位置,PDU 格式分为 PDU1 和 PDU2,小于240的是PDU1 格式的,大于等于240就是PDU2格式的。

PS:PDU 特征(PDU Specific),PF是PDU1时该域存放的是目标地址(DA:Destination Address),如果 PF 是 PDU2 时,该域 存放 PGN 扩展(GE:Group Extension)。

SA:源地址(Source Address),和目标地址相对,发送和接收的时候用的。

DATA Field:发送和接收的内容,发送的时候是pgn  接收就是回应的数据。

下面开始进入正题

介绍完了这个PDU,然后就是实战应用了。

首先拿一个练练手,遇到什么就讲什么。

如下是一个申请车轮转速的请求,我们来拆解下

18EA00F9  BF FE 00      F9(诊断设备)向00(发动机)请求车轮转速

18:这是前面的优先级什么的,不用管pass。

EA:这个是申请的pgn 具体可以找对应的文档SAE+J1939-21-2001如下图,

 

 00:因为前面EA小于240 所以是PDU1 格式的,当前这个就是一个目标地址,00表示的是发送机,这个可以参考SAE+J1939-2005这个文档的Table B2,

当然下面的源地址也是要通过这个来找的。

F9:源地址,因为我们当前的是一个诊断设备,所以Table B2 中是249 也就是F9。

然后就是对应的pgn,BF FE 00  这里的实际值应该是0x00febf   因为协议里的是小端模式,低位放在前。

0xfebf 要去SAE+J1939-71-2006 这个文档下找,如下图,可以看到是wheel speed

 

 

 申请数据的指令讲完了,就开始分析收到的指令

18FEBF00   00 00 00 00 00 00 00 00 

这个简单说下就是  优先级+pgn0xfebf +源地址(来自发动机的)   后面的数据就是具体的车轮的转速。因为当时没有转动轮子,得到的全是0.

就是按照上图下面的8byte去依次解析得到数据。

开始增加难度

接下来个难点的。这是一个获取故障码的请求,和这个也差不多我们来拆解

18EAFFF9 CA FE 00 
1CECFF00 20 16 00 04 FF CA FE 00 
1CEBFF00 01 00 FF FD 03 01 02 FE 
1CEBFF00 02 03 01 02 FF 03 01 02
1CEBFF00 03 00 04 01 02 01 04 01
1CEBFF00 04 02 00 00 00 00 00 00

第一条就不用分析了,不过后面这个故障码pgn,在SAE+J1939-71-2006找不到 要去SAE+J1939-73-2004 这个文档里去找。

首先要知道J1939的数据传输。  

数据传输的时候会有2种类型 一种是bam 姑且叫他广播模式    一种是RTS/CTS 这里可以简单理解成tcp通信。具体的还是要看文档SAE+J1939-21-2001,

下面这个图是判断这个指令是bam还是rts 这里一定要看英文的文档,翻译过来的文档根本不靠谱。

 

 我们按这个图来分析一下当前这个指令是什么传输的

18EAFFF9 CA FE 00 

被请求的pgn是00FECA  FE大于240 是pdu2,数据长度大于8byte,请求地址F9 特定地址   响应地址FF全局 按照上图得知是倒数第二个bam

也可以通过第二条传输明明看出

1CECFF00 20 16 00 04 FF CA FE 00 

后面的消息是 20 16 00 04 FF CA FE 00 怎么分析这个呢?  可以参考文档SAE+J1939-21-2001的FIGURE 14 FORMAT OF MESSAGES FOR TRANSPORT PROTOCOL  因为之前判断是bam所以就是下面的箭头 byte=32 也就是16进制的0x20.

 

 

这里主要的就是他们交互的关系

具体的去看一下 SAE+J1939-21-2001的   TRANSPORT PROTOCOL TRANSFER SEQUENCES  

 

 

图有点多就放1个当前讲的这个例子吧。

下面就直接注释搞起了 ,感觉分开分析有点麻烦。

 

 

18EAFFF9 CA FE 00 
1CECFF00 20 16 00 04 FF CA FE 00   TP.CM_BAM  就是下图,然后各个byte的解释  20表示bam  16 00 表示有22个数据 04 4个包 CA FE 00 pgn
1CEBFF00 01 00 FF FD 03 01 02 FE   TP.DT    图也放下面了 01 队列数  然后就是数据
1CEBFF00 02 03 01 02 FF 03 01 02
1CEBFF00 03 00 04 01 02 01 04 01
1CEBFF00 04 02 00 00 00 00 00 00

 

 

 

 然后这bam的解析就算全部完成了。。。

再加一个rts的吧,读取车架号 参考下面的图

18EA00F9 EB FE 00                 F9 向00  发送车架号请求
1CECF900 10 2C 00 07 FF EB FE 00        TP.CM_RTS 44个数据  07个包  EB FE 00 pgn
1CEC00F9 11 07 01 FF FF EB FE 00        TP.CM_CTS 07个包  下个发送的包01  EB FE 00 pgn
1CEBF900 01 4E 4C 43 49 44 2A 31        包的序列 01  数据
1CEBF900 02 32 33 34 35 36 37 38
1CEBF900 03 39 41 42 43 44 45 46
1CEBF900 04 47 48 2A 31 32 33 34
1CEBF900 05 35 36 37 38 2A 31 32
1CEBF900 06 33 34 35 36 37 38 39
1CEBF900 07 41 2A FF FF FF FF FF        包的序列 07  数据  结束了
1CEC00F9 13 2C 00 07 FF EB FE 00        TP.CM_EndOfMsgACK  44个数据  07个包   EB FE 00 pgn

 

 

 

 

上面的传输告一段落,目前还有一个就是如何读取返回的数据

先拿故障码的例子

18EAFFF9 CA FE 00 
1CECFF00 20 16 00 04 FF CA FE 00   TP.CM_BAM  就是下图,然后各个byte的解释  20表示bam  16 00 表示有22个数据 04 4个包 CA FE 00 pgn
1CEBFF00 01 00 FF FD 03 01 02 FE   TP.DT    图也放下面了 01 队列数  然后就是数据
1CEBFF00 02 03 01 02 FF 03 01 02   
1CEBFF00 03 00 04 01 02 01 04 01
1CEBFF00 04 02 00 00 00 00 00 00

把数据全部提取出来

 00 FF FD 03 01 02 FE  
 03 01 02 FF 03 01 02   
 00 04 01 02 01 04 01
 02 

参考SAE+J1939-73-2004的 5.7.1有一个对接收故障码的介绍

 

 

 第一字节,表示故障灯状态

第二字节,表示预留的故障灯状态定义字节

第三四五六字节,表示故障码编号

但是我们这里是连续的故障码,就不用这么麻烦了  除了第一和第二字节其他全都是故障码 再按下图的介绍 

第三字节、第四字节和第五字节的高三位定义为 SPN 值,第五字节的低五位表示 FMI.FMI 定义的是故障模式,说明具体故障原因,

FD 03 01 02     结果 SPN = 0x03fd = 1021 FMI = 1 OC = 2  后面只分析这个一个故障码 后面类似
FE 03 01 02     参考上面
FF 03 01 02    00 04 01 02
01 04 01 02

 

 然后就是怎么去找 对应的错误。参考SAE+J1939-2005文档的Appendix C获得 ,也可以直接输入spn找。

SPN = 0x03fd = 1021 是空闲关机次数

 

 

 FMI 定义  参考SAE+J1939-73-2004文档的APPENDIX A

SPN = 0x03fd = 1021 FMI = 1 OC = 2   显示故障码spn-1021 空闲关机次数出现了2次 非常严重的等级

然后常用的车架号还有单帧的数据流就不多说了, 在上面单帧的车速有简单的描述,基本都是查表查表查表。

 

 完结撒花!!!!!

应该来说把ASEJ1939的应用层的大部分都解释完了。我目前的开发也就用到这么多了把,还有补充那就等下次了。

相关的J1939协议文档放百度网盘

链接:https://pan.baidu.com/s/1RGvenTdF5BECX6ceBLGL9w
提取码:t03m

 

posted on 2022-08-31 01:19  张培粉  阅读(1630)  评论(0编辑  收藏  举报