Ref:J1939 Explained - A Simple Intro (2021)– CSS Electronics

Ref:CAN 帧ID 与J1939 PGN 转换例子_horse_2007s的博客-CSDN博客

Ref:在J1939中多帧数据如何发送,它是通过TP.CM_BAM和TP_DT报文发送_pvmsmfchcs的博客-CSDN博客

REf:tp.cm和tp.dt报文说明,为什么计算的pgn不对,1939里的GPN如何计算,什么时候的报文没有目标地址。_pvmsmfchcs的博客-CSDN博客

REf:解析CAN的J1939协议PDU报文_lx2385623371的博客-CSDN博客_j1939协议报文解读

大家看完以上的,也就清楚了,我还是根据个人理解,一步步展开。

根据其转换,利用J1939协议来解析。

前言:

主要说明:

1) PGN计算出现问题,如何解决的;

2)如何理解广播报文的含义,解释DM1的参数,DM1是啥,DTC是啥;

3)广播报文如何发送,需要拆分多少包;

由于这些内容是在实际做时遇到的具体问题,一个个问题解决。查阅了相关资料,感谢 @鼾声鼾语, @mengdeguodu_

     部分内容是摘要其他blog的,已经加了引用出处。若侵权,请留言删除!

正文:

先贴概念:

DA表示报文要发送的目标地址

GE表示PS在PDU2中与PF的4个最低有效位能够共同确定4096个PDU2格式参数组

参数组与PGN

参数组数目=[240(PDU1)+16*256(PDU2)]*2(DP)=8672

PGN计算

PDU1格式:PGN=PF*256

PDU2格式:PGN=PF*256+GE

4 key characteristics of J1939

The J1939 protocol has a set of defining characteristics outlined below:

250K baud rate &29-bit extended ID

The J1939 baud rate is typically 250K (though recently with support for 500K) - and the identifier is extended 29-bit (CAN 2.0A)

Broadcast + on-request data

Most J1939 messages are broadcast on the CAN-bus, though some data is only available by requesting the data via the CAN bus

PGN identifiers & SPN parameters

J1939 messages are identified by 18(16,在广播报文里)-bit Parameter Group Numbers (PGN), while J1939 signals are called Suspect Parameter Numbers (SPN)

Multibyte variables & Multi-packets

Multibyte variables are sent least significant byte first (Intel byte order). PGNs with up to 1785 bytes are supported via J1939 transport protocol

Parameter Group Number (PGN)

The J1939 PGN comprises an 18-bit( 16BIT in BAM) subset of the 29-bit extended CAN ID. In simple terms, the PGN serves as a unique frame identifier within the J1939 standard. For example, you can look this up in the J1939-71 standard documentation, which lists PGNs/SPNs.

举个栗子:

18F00010, 按照定义可知PGN为61440, 根据1939-71可查到其对应的参数。

查看中文版

问题1:PGN计算出错,查不到某些PGN

18ECFF10--->PGN 60671,未查到。00EC00--->60416;

18EBFF10-->PGN 60415,未查到。00EB00-->60160

原因: 广播报文需要按照 PDU format来算,其余的补0。

修改代码:这样还可以通过PDU format来查询。感谢 @鼾声憨语 的帮助

解决方法:

根据 CAN 帧ID 与J1939 PGN 转换例子_horse_2007s的博客-CSDN博客

PDU格式PF:PDU有两种类型PDU1和PDU2,PDU1向特定地址发送报文,PDU2向全局地址发送报文。

 当PF为0~239时,表征报文为PDU1;

当PF为240~255时,表征报文为PDU2。

特定域PS:功能由PF决定,

当PF为PDU1时,PS表示目标地址;

当PF为PDU2时,与PS的4个最低有效位能够共同确定4096个PDU2格式参数组。

程序修改:(程序上传到个人资源:    J1939的ID转PGN码源码程序

3 广播报文

根据SAEJ1939-21(参考5.10.1),长度大于8字节的消息被拆分成若干个小的数据包,然后使用单独的数据帧对其逐一传送。每个数据包都会被分配搭配一个从1到255的序列编号。最后一个数据包的数据域余下未使用的字节全部设置为“FF”

[例子:感谢! @mengdeguodu_

SA:=41

Ref: J1939广播DM1报文_mengdeguodu_的博客-CSDN博客

SAEJ1939-73中定义DM1字节1为灯状态,字节2预留当字节1=00,字节2=FF,0x41节点完整的DM1报文为:0x18FECA41:00 FF AC F3 E1 01 30 F3 E3 01,字节数大于8,将会使用“多帧传输”参数组。

所以0x18FECA41:00 FF AC F3 E1 01 30 F3 E3 01将会被拆分成两条:01 00 FF AC F3 E1 01 30,02 F3 E3 01 FF FF FF FF

TP.DT报文ID为:0x18EBFF41

]

SAEJ1939-21(5.10.3),定义了链接管理TP.CM(BAM为其中一种)的参数群编号为60416(00EC00),BAM的目标地址为全局目标地址。

【根据SAEJ1939-21(5.2.5): 若PDU 格式(PF)段的值小于240,特定PDU 段是目标地址。若PF 段的值在240 和255 之间,特定PDU 包含群扩展(GE)值。全局目标地址(255)要求所有设备作为消息响应者作出监听和响应。】

ref:452_J1939广播多帧报文的例程分析_小灰笔记-CSDN博客

这个流程图就是J1939的广播多帧报文的实现,  流程是先发送一帧TP.CM_BAM的报文,然后是一连串的数据包。

TP.CM_BAM采用的是一个特殊的PGN 60416

如报文,8个字节:  0X18ECFF10: 20(控制字),A,0(字节长度),2(2包),FF(reserved),CA,FE (PGN:FECA),0

接下来,进行数据的传输。而传输所用到的功能是另一个特殊PGN 60160,也就是TP.DT。具体的信息如下:

由于是广播多帧报文,目标地址是全局地址。另外,里面包含了数据包的编号和数据。而帧间隔的最小时间为50ms。

收到的报文: 18EBFF10.

REf:在J1939中多帧数据如何发送,它是通过TP.CM_BAM和TP_DT报文发送_pvmsmfchcs的博客-CSDN博客

@鼾声憨语 的blog:

[这个时候就要用到TP.CM_BAM和TP_DT报文了
首先如果是单帧报文,那么他们用各自的ID直接发送到总线上
如果是多帧数据就需要用到TP_DT了,
例如:DM1多帧发送故障数据到总线,那么发送的过程是如下

SA=0X10, 缓速器ID。 BAM报文ID为:0x18ECFF10

首先发送TP.CM_BAM,其中包含的信息有:

ID :18ECFF10 + Control byte (0X20 ) +故障信息的大小(0X00A,共10个),字节总数(2)+包的个数(0xFF,没有限制)+DM1的PGN(FECA)

SA:=0x10.

2 然后发送TP.DT多帧数据,其中包含的信息有:
多帧数据的序号+多帧数据

4,SAEJ1939-21(5.10.5)定义了数据传送TP.DT的参数群编号为60160(00EB00),对BAM数据传送使用全局地址。

所以0x18ECFF10 的TP.DT报文ID为:0x18EBFF10

3,如果发送的是单帧数据,那么则直接发送一条DM1就可以了,但是事实上这种TP.CM_BAM和TP_DT报文组合方式,发送多帧情况很多。
DM1多帧发送故障,两个故障一般就会出现多帧的情况因为一般灯的故障状态就需要占用四个字节,故障占用4个字节,两个故障共用灯故障的情况下占用10个字节,也就是两帧数据了
]

18ECFF10里的SA=0X10, PGN=0xFECA。

上图接收了第1包数据(D0=1)字节1,  为什么后面不是00FF 开始呢?

贴了一个SA=0X41发送2个报文的例子,

@mengdeguodu_

ref: J1939广播DM1报文_mengdeguodu_的博客-CSDN博客

字节 00 AC F3 E1 01

30 F3 E3 01 FF

问题2:

广播里的PGN :00FECA。 作用是啥(DM1,故障诊断)?用于说明接下来的多帧报文的具体的作用? 什么作用》

Ref:J1939 Diagnostics - Part 1 - Embedded Flakes

SAEJ1939-73(参考5.7.1)中定义了DM1的优先级为6,PGN(参数组数编号)为65226(00FECA)

DM1 message uses PGN 65226 (0xFECA). DM1 message is sent periodically only when there is an active DTC or in the response of the request.

DM1 message contains information of all active DTCs and diagnostic lamp status. The lamp status supports visual diagnostics and used by fault indicators on a vehicle dashboard.

For a DTC becoming active and inactive twice within the 1-second interval, only one DM1 message is sent in the one-second interval.

The following table shows the DM1 message format.

Default Priority 6
PDU Format 254
PDU Specific 202
PGN 65226  (0xFECA)
Byte 1 – bits 8-7 Malfunction Indicator Lamp status
Byte 1 -bits 6-5 Red Stop Lamp status
Byte 1 -bits 4-3 Amber Warning Lamp status
Byte 1 -bits 2-1 Protect Lamp status
Byte 2 – bits 8-7 Reserved
Byte 2 -bits 6-5 Reserved
Byte 2 -bits 4-3 Reserved
Byte 2 -bits 2-1 Reserved
Byte 3 – bits 8-1 SPN
Byte 4 – bits 8-1 SPN
Byte 5 – bits 8-6 SPN
Byte 5 -bits 5-1 FMI
Byte 6 – bit 8 SPN Conversion Method (CM)
Byte 6 -bit 7-1 Occurance Count (OC)

该 FMI 定义了为SPN 所识别的子系统中发现的故障类型。注意,该故障可能不是电子故障,但相反可能是需要报告给设备技术员甚至操作员的子系统故障
或条件,这些条件包括需要报告的系统事件或状态。FMI、SPN 为预留的和发生次数域组合已知的诊断故障代码。如果另外的故障模式是必需的, FMI 将由
CATARC 来赋值。当前定义的FMI 列于附录A。

两个故障一般就会出现多帧的情况因为一般灯的故障状态就需要占用四个字节,故障占用4个字节

由于DCT 需要4个字节,2个故障就需要8个字节,加上 DM1 特定 起始字节00 FF, 因此需要传10个字节,2个报文

用NI板卡可以直接解析J1939。

找到了福伊特的定义,但与我用到的不一样。

18EBFF10h,是多帧数据。

DM1解析:

DTC格式: 1011 1000 0000 0100 000 0 0011 0 000 1010

SPN(19位): 1208(d)=000 00000100 1011 1000(2)

FMI 3=00011(2)

OC 10=0001010

CM =0

就是小端模式,之前理解错了,一直没能正确解析DTC 报文。

J1939协议中CAN ID 与PGN互换--遇到了广播报文相关推荐

  1. 从零学习 InfiniBand-network架构(十) —— IB协议中全局ID

    从零学习 InfiniBand-network架构(十) -- IB协议中全局ID

  2. 《GB/T 27930-2015》国标协议中报文帧ID该如何计算?

    提示:充电桩国标文件 文章目录 前言 1.需要了解的信息? 2.什么是报文? 3.什么是CAN数据帧? 4.一个CAN数据帧都包含什么? 前言 提示:<GB/T 27930-2015>国标 ...

  3. AUTOSAR协议解析篇(一)-J1939协议解析

    SAE J1939协议是基于CAN2.0B协议之上的应用层协议,但是SAE J1939协议并不仅仅是个应用层协议,她对物理层,数据链路层,网络层,应用层,故障诊断, 网络层管理层等都做了详细的规定,只 ...

  4. CAN协议中的PGN

    PGN是参数组编号,对于制定CAN协议来说十分重要,很多ECU在接受报文时识别的就是PGN而不是报文的ID, 报文ID作为报文的名字,是没一条报文专有的名字,而一个PGN不仅仅对应一条报文.CAN的扩 ...

  5. CAN2.0和J1939协议的关系

    转发自http://www.cankau.cn/support/help/can-vs-j1939.html 很长时间没搞明白j1939与CAN2.0的关系,这篇文章让我明白了. CAN2.0是一种总 ...

  6. J1939协议与CAN2.0对应关系图表

    SAE J1939 消息帧格式定义与CAN 2.0B帧格式对应关系 J1939应用层协议详细描述了用于J1939网络的每个参数,包括其数据长度.数据类型.分辨率.范围及参考标签,并为每个参数分配了一个 ...

  7. 【存储知识学习】第八章-Fibre Channel协议-8.1 FC网络和8.2FC协议中七种端口类型-《大话存储》阅读笔记

    8.1FC网络 Fibre Channel也就是网状通道,简称FC.也可以称为FC协议,FC网络.FC互联 注意: Fibre Channel不是Fiber Channel,后者是光纤通道与网状通道没 ...

  8. IKEv2协议中的EAP-TLS认证处理流程

    以下根据strongswan代码中的testing/tests/ikev2/rw-eap-tls-only/中的测试环境,验证一下IKEv2协议的EAP-TLS认证过程.拓扑结构如下: 拓扑图中使用到 ...

  9. TCP/IP协议中的端口

    本文所述端口都是逻辑意义上的端口,是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等. 我们这里将要介绍的就是逻辑意义上的端口. ...

最新文章

  1. matlab简单程序实例_visual basic VB.NET实例系列教程第一节(简单实用抽奖程序)...
  2. OO第一单元作业总结
  3. 万字超强图文讲解 AQS 以及 ReentrantLock 应用
  4. 希尔排序(ShellSort) c源码
  5. 文巾解题 6. Z 字形变换
  6. 快速了解Scala技术栈
  7. 知识管理促进企业组织能力提升
  8. 三种CSS样式的引用方式
  9. 数据结构课上笔记10
  10. Java泛型,枚举,注解
  11. Leetcode--397. 整数替换
  12. phpcmsV9:后台无法选择模板
  13. 【mAP】关于目标检测mAP的一些理解
  14. 除了汪峰,还有哪些明星跨界做智能硬件
  15. extends 和super 泛型限定符-上界不存下界不取
  16. 关于计算机中 二进制位(bit)、字节(Byte)、 千字节(KB)等之间的关系
  17. 运动目标跟踪(八)--时空上下文(STC)跟踪原理
  18. 华为鲲鹏HCIA认证 常考题
  19. Java集合源码剖析-Java集合框架
  20. 系统性的学会 Pandas, 看这一篇就够了!

热门文章

  1. ssm+jsp计算机毕业设计医院管理信息系统设计与实现561hx(程序+lw+源码+远程部署)
  2. 智能家居水传感器行业调研报告 - 市场现状分析与发展前景预测
  3. 其他传感器行业调研报告 - 市场现状分析与发展前景预测
  4. 动手学深度学习(pytorch版)d2lzh_pytorch导入问题汇总
  5. 在csdn中如何查看自己关注的人(2021年)
  6. vue中实现打印功能的方法与注意事项
  7. 正版sql服务器,SQL Server2014企业版 授权许可 正版sql数据库
  8. Xcode升级到14.3 archieve打包失败
  9. ArcGIS Notebook Server 10.9.1 Linux版本安装示例
  10. 51单片机之蜂鸣器模拟钢琴(代码详解)——起风了