SAE-J1939中的PGN MSB和SPN,以及多包传输

来源声明:

本文是7篇文章的梳理,稍有编辑,便于小白系统理解相关知识。各篇文章之间稍有重复内容,因为表达方式不同所以都保留了。原文章连接贴在了各篇后面参考文献位置。在此致敬各原文作者,感谢分享。为方便大家查找原文,连接再单独汇总一份放在开头:

[1] 浅谈J1939及安全测试

[2] CAN总线通讯-J1939协议中的PGN和SPN讲解 - 知乎 (zhihu.com)

[3] J1939中的PGN和SPN_j1939 spn-CSDN博客

[4] J1939-21资料.pdf (book118.com)

[6] SAE-J1939协议入门解析-CSDN博客

[2] 浅谈J1939及安全测试

[7] cloud.tencent.com/devel

[8] SAE-J1939-21 (超8字节)多包数据----CAN传输协议-CSDN博客

[9] can总线协议中PGN是什么? - 知乎 (zhihu.com)

  1. 浅谈J1939及安全测试

(1)J1939概括

SAE J1939 是商用车领域网络和通信的一种开放标准,定义了商用车中ECU如何通过CAN总线进行通信,该协议几乎覆盖所有商用车。比较经典的应用场景便是公交车、大卡等,农业、军工、船舶等领域也有一定的应用。协议工作在250k(新协议支持500k),使用29位CAN标识符。

(2)J1939法规文件结构

J1939提供了大量的规范文档,命名结构如下。

(3)协议数据单元

协议数据单元(PDU)由七部分组成,分别是优先级,拓展数据页,数据页,PDU格式,PDU特定域(可作为目标地址、组扩展或专用),源地址和数据场。

PDU将被分组封装在一个或多个CAN数据帧中,通过物理介质传送到其他网络设备。每个CAN数据帧只可能有一种PDU。

(4)J1939报文类型

1939共定义了五种报文类型,分别为命令、请求、广播/响应、确认和组功能特定消息类型由其分配的参数群编号识别。针对出现在 CAN 数据帧中数据域的多字节参数,优先存放在最低字节。因此,如果要将一个2字节的参数存放在 CAN 数据帧的字节 7 和字节 8中,LSB 应被放在字节 7,MSB 应放在字节 8。

  1. 命令
    此消息类型包括那些从某个源地址命令特定目的地或全局目的地的参数群,目的地接收到命令类型的消息后应该采取特定的动作。PDU1 格式(PS 为目标地址)和 PDU2 格式(PS 为群扩展)都能用作命令。命令类型的消息可能包括传动控制、地址请求、扭矩/速度控制等。
    请求
    请求类型的报文提供了从全局范围或从特定目标地 址请求信息的能力。 最典型的一个请求类型的报文是“请求PGN”报文。


对于特定目标地址的请求,目标地址必须做出响应。如果目标地址不支持请求的PGN,也必须发出一个NACK 的响应以表明它不支持该PGN。有些PGN 是多包的,因此一个单帧请求的响应可能有多个CAN 数据帧。如果是全局请求, 当一个节点不支持某个PGN 时,不能发出NACK 响应。


决定发送 PGN 到全局或特定地址一般有以下规则:


广播/响应
此报文类型可能是某设备主动提供的报文广播,也可能是命令或请求的响应。总线上的数据交换大多采用这类报文,如ECU以一定的周期广播某个参数。
确认
确认报文有两种形式。第一种是 CAN 协议规定的,它由确认消息已被至少一个节 点接收的“帧内”确认组成。另外,如果没有出现 CAN 出错帧,消息将被进一步确认,不出现出错帧意味着所有其他的开启并连接在总线上的设备都正确地收到了此消息。 第二种形式的确认由应用层规定,是对于特定命令、请求的“普通广播”或“ACK” 或“NACK”响应。最典型的一个确认类型的报文是“Acknowledgment”报文


肯定确认:控制字节=0(ACK)
否定确认:控制字节=1(NACK)
拒绝访问:控制字节=2
无法响应:控制字节=3
组功能
此消息类型用于一组特殊功能(如专用功能、网络管理功能、多组传输功能等),每个组功能由其 PGN 识别,具体可见SAE J1939-21
[1] 浅谈J1939及安全测试
2. CAN总线通讯-J1939协议中的PGN和SPN讲解
PGN (Parameter Group Number) :参数组号;SPN (Suspect Parameter Number) :参数号。
(1)作用
作为J1939协议中的两个定义,每个SPN对应着一个特定的参数,例如引擎转速、车速等,它提供了一种标准化的方式来描述和识别不同参数,这样不同厂家设备和系统能通用和共享这些参数。
PGN则是用于对一组相关的SPN进行分组,并且定义了他们在消息中的布局和顺序。即每个PGN包含一个或多个SPN,并提供了一种结构化的方式来传输和解析这些参数。PGN还具有识别消息的优先级和数据格式的作用。
(2)PGN组成
PGN 简言之是取CAN ID中的扩展数据页(EDP)、数据页(DP)、PF、GE(当PF<240,GE=0;否则GE取正常值)加上6个bits的0凑够24位。
GE我理解就是CAN ID 中的PS。当然前提满足PF>240。


CAN报文-CAN ID 与 PGN


PGN的24位组成
例如,报文ID:0x18FECA17
第一个字节是18,转为二进制是 0001 1000,可以看到优先级是110(对应十进制的6),EDP=0,DP=0。
第二个字节是PF=FE(十进制是254>240)
第三个字节是GE=CA,(因为PF>240,GE取正常值CA)
第四个字节是17,源地址,代表是谁发送的数据,比如0x52代表是氮氧,0x00代表ECU。
所以PGN码是:00FECA
[1] CAN总线通讯-J1939协议中的PGN和SPN讲解 - 知乎 (zhihu.com)
3. J1939中的PGN和SPN
J1939的比特率通常为250或500Kb/s,并且拥有18位扩展标识符共29位标识符。
SAE J1939应用层定义了12种诊断报文(Diagnostic Message,DM)、诊断故障码(DTC)。
DM(Diagnostic Message)报文用于指示“故障灯”和“当前故障”。
(1)PDU协议数据单元(Protocol Data Unit)
J1939报文使用的基于CAN2.0B的拓展帧格式定义了一个完整的标准化通讯策略,通过PDU定义了一个框架,用来组织数据帧中J1939协议相关的信息。PDU由数据帧中的ID和数据场组成,数据帧和PDU的对应关系如下图所示。


P(Priority),优先级字段,用于在仲裁过程中控制报文优先级。
EDP(Extended Data Page),扩展数据页,在J1939中固定取值为0。
P(Data Page),数据页,可用来扩展参数组的数量。
PF(PDU Format),PDU格式字段,通过不同的取值来确定参数组编号(Parameter Group Number, PGN)是按照PDU1格式还是PDU2格式。
PS(PDU Specific),特定协议数据单元字段,当PF的值为0239时PS表示目标地址(PDU1格式),当PF的值为240255时PS字段表示组扩展(PDU2格式),且报文只能广播。
SA(Source Address),源地址字段,整个网络中SA的值必须是唯一的。
Data Field,数据场,对于Classic CAN来说是8个字节,而CANFD则最多有64个字节数据。如果需要传输更多的数据,则需要借助J1939的传输协议。
(2)PGN

  1. PGN的组成
    PGN共有3个字节24位,与CAN ID有重合,但是PGN并不是ID的一部分。
    PGN的24位分别是:6个bits的0,一个扩展数据页(EDP)、数据页(DP)、PF、GE(当PF<240,GE=0;否则GE取正常值)。
    例如报文ID:0x0CDAEE17
    第一个字节是0c,转为二进制是 0000 1100,可以看到优先级是011(对应十进制的3),EDP=0,DP=0。
    第二个字节是PF=DA(十进制是218<240)
    第三个字节是GE=0,(因为PF<240,GE取0)
    所以PGN码是:00DA00
    (3)DTC
  2. DTC的组成
    字节1默认为0x44,字节2默认为0xFF。
    SPN和FMI共同构成故障码DTC,SPN换算方法默认为0,故障计数代表故障报出的次数。


[1] J1939中的PGN和SPN_j1939 spn-CSDN博客
4. 【】J1939-21资料
协议数据单元与扩展帧ID的关系如下图颜色所示。


(1)协议数据单元PDU组成

  1. P优先级
    这三个优先级位用于优化报文反应时间,并且仅用于发送到网络时。接收器应该全面屏蔽(忽略)它们。
    任何报文的优先权都可以设置为0(最高)到7(最低)
    所有控制报文的缺省优先级都是3(011)。其它的所有的报告、专用、请求、应答报文的缺省优先级都是6(110)。
    OEM可以通过对优先级场的重新编程来做网络调整


EDP扩展数据页
EDP与DP联合使用,用来确定CAN数据帧。传送时,所有的J1939报文都应该将EDP设置为0。
2006年6月修订版的1939-21将该位定义为EDP,以前的版本该位为保留位®。
只是定义,还没有使用,将来的版本有可能使用到,



数据页DP
数据页用于选择一个参数组描述的辅助页。
只有在页码0上所有可用的PGN全部被分配使用完毕后才可以使用页码1。
当EDP和DP设置为“11”时,表示这是一个ISO15765-3报文。这意味着CAN标识符剩余的部分的设置与SAEJ1939不同。该格式的CAN数据帧在SAEJ1939规范里没有描述


PF(PDU格式)
用于确定PDU的两种格式。是PGN的场之一。
PDU1格式的报文既可以发送到特定地址,也可以发送到全局地址。
PDU2格式的报文只能发送到全局地址。


PS(PDU细节)
由PF决定PS是一个目的地址还是一个组扩展。
DA指定报文发送的目的地址。
全局地址(255)要求所有的设备都收听并作出反应
GE与PF的低四位相关联,向每个数据页提供4096个参数组。


DA:Destination Address
GE:Group Extension
[1] J1939-21资料.pdf (book118.com)
5. SAE-J1939协议入门解析
J1939协议是由美国汽车工程师协会(SAE) (SAE协会简介)定义的一组标准。该标准主要用于卡车、公共汽车和移动液压等重型车辆。
物理层(J1939/11) 描述了针对客车的电气接口。
数据链路层(J1939/21) 描述了构建报文、访问总线以及诊断传送故障的规则。
应用层(J1939/71和J1939/73) 定义了在网络中传送的每条报文的具体数据,包括PGN以及SPN详情内容解释等。


(1)SAE J1939物理层
SAE J1939的物理层描述了电气接口和物理介质。定义的内容包括:
物理介质为屏蔽双绞线;
传输速率为250Kbps;
同一网络上最大子系统数为30个;
最大传输线长度为40m;
物理层还定义了数据的物理特性及总线的电气连接特性。
(2)SAE J1939数据链路层
J1939协议的精髓全在这里,那就让我们展开叙述。
SAE J1939以CAN2.0B为基础,通过CAN总线进行数据通信。并且拥有18位扩展标识符共29位标识符(CAN 2.0B);
它的数据链路层定义了信息帧的数据结构、编码规则,包括通信优先权、传输方式、通信要求、总线仲裁、错误检测及处理,
它负责将CAN扩展帧的29位标识符重新分组定义,使报文的标识符就能够描述报文的全部特征,包括目标地址、源地址等内容

  1. 帧结构(J1939与CAN 2.0B的差异)

“CAN 2.0B”包括两种消息格式的规范,标准帧和扩展帧

“CAN 2.0B”的兼容性意味着通过使用不同的帧格式位码,保证二者能同时在同一网络中使用。

就此而言, SAE J1939也能够自适应这两种CAN数据帧格式。但是SAE J1939只使用扩展帧格式全面定义了标准化的通信所有标准帧格式消息都按照规则作为专用消息使用。因此, SAE J1939设备必须使用扩展帧格式。标准帧格式消息可以在网络中存在,但只能以规定的方式运行。

上图是扩展帧,J1939与CAN协议的区别就是黄色字段。

CAN报文是基于ID的,而J1939协议是基于PGN的这一点几乎就是J1939协议的全部内容。CAN2.0B使用29位的标志符来区分不同的报文,J1939对这29标志符进行了重新的分类和解释,即上图的黄色部分。J1939协议是基于CAN2.0B的应用层协议。CAN报文中我们有11位标志符的标准帧也有29位标志符的扩展帧。而在J1939协议中,我们所有报文都是29位标志符,数据域则跟CAN报文的数据没有区别。

  1. 帧起始(SOF)
    占1bit,SOF信号只有一个数据位,是一个显性电平(逻辑0),它用于通知各个节点将有数据传输,
    其他节点通过帧起始信号的电平跳变沿来进行硬同步。(这一点和CAN保持一致)
    优先级(P)
    占3bit,根据CAN2.0B 的仲裁机制,ID越小优先级越高。按照J1939协议的划分,优先级在整个ID的最前面,实际上依然控制着ID大小,即CAN报文的优先级。
    只不过在J1939协议中优先级仅仅用于优化发送数据时的报文延迟,接收报文时则完全忽略优先级。J1939中的优先级可以从最高的0(000b)到最低优先级7(111b)。
    默认情况下控制类报文的优先级为3,其他报文的优先级为6。当分配新的PGN或总线上流量改变时,允许提高或者降低优先级。
    扩展数据页EDP(R)
    占1bit,扩展数据页(EDP)联合数据页(DP)可以决定CAN报文帧中CAN ID的结构,目前为保留位,均设置为0。
    数据页(DP)
    占1bit,用于联合扩展数据页EDP来决定CAN ID结构,当EDP为0时,DP为0或者1分别表示第0页或者第1页PGN。如下图所示:


替换远程请求Substitute Remote Request (SRR)
占1bit,只存在于扩展帧格式,扩展帧中的SRR位为隐性位(隐性电平(逻辑1))
标识符扩展位(IDE)
占1bit,当IDE为0时,表示标准格式帧;当IDE为1时,表示扩展格式帧。
(这一点和CAN保持一致)
PDU格式(PF)
占8bit,PF用来确定PDU的格式,两种格式计算得到PGN的方式不同,我们在下面介绍这两种计算方式。
PDU特定域(PS)
占8bit,PS的定义取决于PF, 它可能表示目标地址( Destination Address, DA),可能表示组扩展(Group Extension,GE),
如果PF < 0xF0(240)则表示为DA,否则表示为GE。


目标地址(DA)
占8bit,DA是报文的目标地址,除目标地址的设备外,其他设备应该忽略此报文。
如果目标地址为0xFF,则表示为全局地址,此时所有设备都应该监听此报文并在收到报文后做出响应。
组扩展(GE)
组扩展与PDU 格式域的低四位(注意:当PDU 格式域最高四位被置1,说明PS 域是组扩展)规定了每个数据页(000~FFF=4096=16256)共4096个参数组。这4096个参数组仅使用PDU2格式可用。
此外,在每个数据页中提供了240个参数组,仅供PDU1格式使用。
这样总共有8672个参数组可以使用当前可用的两个数据页面来定义。可用参数组总数的计算公式如下:


源地址(SA)
占8bit,发送报文的设备的地址,网络上只能有一个具有给定源地址的设备。因此,源地址根据CAN的要求,字段确保CAN标识符是唯一的。地址管理和分配情况详见SAE J1939-81。在SAE J1939-81中定义了程序,以防止源地址的重复。有关源地址分配,请参考SAE J1939附录B,表B2至表B9。
远程传输请求位(Remote Transmission Request ,RTR)
当RTR=逻辑0时,表示数据帧;=逻辑1时,表示遥控帧。在 SAE J1939 中始终设置一个显性的 0。
(这一点和CAN保持一致)
控制段
在控制段中的r1和r0为保留位,默认设置为显性位。它最重要的是DLC段(Data Length Code),数据长度码,
它由四个bit组成,用于表示本报文中的数据段含多少个字节,DLC段表示的数字是0~8 (因为数据段的大小是0到8字节大小)。
(这一点和CAN保持一致)
CRC段
为了保证报文的正确传输,CAN的报文包含了一段15位的CRC校验码,一旦接收节点算出的CRC码和接收到的CRC码不同,则它会向发送节点反馈错误信息,利用错误帧请求它重新发送报文。
CRC部分的计算一般由CAN控制器硬件完成,出错时的处理则由软件控制最大重发数。 在CRC校验码之后,有一个CRC界定符,它是隐性位,主要是把CRC校验码与后面的ACK段间隔开。
(这一点和CAN保持一致)
ACK段
占2bit,ACK段包括一个ACK槽位和ACK界定符位。类似I2C总线,在ACK槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以应答。在ACK槽和帧结束之间由ACK界定符间隔开。
(这一点和CAN保持一致)
帧结束
占7bit,由发送节点发送的7个隐性位(逻辑1)表示结束。
(这一点和CAN保持一致)
参数组编号(PGN)
是 J1939 标准中的唯一帧标识符,用于引用将保留位、数据页(DP)、PDU格式(PF)和 PDU特定字段(PS)的值组合成单个 18 位值(前面还有6个0,所以有时也说24位)。
参数组还包含了每个报文的 8 字节 CAN 数据字段中的参数分配、重复率和优先级。PGN是J1939标准中唯一的帧。标识符(J1939-71文档中列出了PGN以及SPN)。
在 CAN 数据帧的数据域中需要指明参数群时,PGN 表示成 24 位,包括以下要素:拓展数据页、数据页位、PDU 格式域和PDU特定域。转化到 PGN 的过程中,若 PF小于 240(F0),PGN 的低字节置 0,反之则将其设置为PDU特定域的值


参数组编号PGN可分为两种类型:
a)全局参数组编号
此类PGN识别广播(发送给所有人)的参数组。这里,PDU格式(PF) >= 240,并且PDU特定字段(PS)是组扩展。
b)特定参数组编号
这些用于对等发送(到特定设备)的参数组。如果PDU格式(PF) <= 239,并且PDU特定字段(PS)设置为0。
无论两个 PGN 的类型如何, PDU 格式、PDU 特定字段、数据页和扩展数据页都用于识别相应的参数组。
怀疑参数编号(SPN)
J1939中的SPN作为数据库中包含的CAN信号(参数)的标识符,SPN按照PGN来分组,可以根据其位起始位置、位长度、精度(比例)、偏移量和单位(将SPN数据提取和缩放为物理值所需的信息或者量)来描述。
J1939标准将SPN描述定义为 SLOT(Scaling, Limit, Offset and Transfer Function;即比例、界限、偏移和转换函数)。


协议数据单元格式Protocol Data Unit (PDU) Formats
定义了两种PDU格式:PDU1格式(PS =目标地址)和PDU2格式(PS =组扩展)
PDU1格式允许将CAN数据帧定向到一个特定的目标地址(设备);
PDU2格式只能通信不特定于目标的can数据帧。
建立两种单独的PDU格式,是为了提供更多可能的参数组号组合,同时仍然提供特定于目的地的通信。已分配了专有参数组定义,以便这两种PDU格式都可用于专有通信。为专有通信建立了一种标准化的方法,以防止在标识符使用中可能出现的冲突。


  1. PDU1
    此格式允许将适用的参数组发送到特定的或全局目标。PDU特定字段包含一个目标地址。PDU1格式消息可以被请求或发送。
    PDU1格式消息由PF字段确定。当PF字段值为0到239时,消息为PDU1格式。PDU1消息的格式如上图所示。另请参见下图,PDU1格式。


PDU2
此格式只能用于将参数组作为全局消息进行通信。PDU2格式消息可以被请求或发送。
在分配PGN时选择PDU2格式,防止PGN无法被定向到特定的目的地。PDU特定项包含一个组扩展。


PDU总结
① PDU1和PDU2格式下PGN的总数为:( 240+(16256))2 = 8672
② PDU1格式主要分配给必须指明目标地址的PGNs,数量有限;PDU2格式下的PGNs不能用于必须指明目标地址的情况。大部分PGNs都定义在PDU2段。
③ 为了保证实时性,报文更新速率小于100ms时不允许多包发送。
④ PDU1和PDU2格式下均支持单包报文和多包报文。无论是PDU1还是PDU2格式,其前半段PGNs标识的报文更新速率小于100ms,不允许多包发送;后前半段PGNs标识的报文更新速率大于100ms,允许多包发送。
⑤ 目前支持五种类型消息,分别为:命令、请求、广播/响应、确认和群扩展。特定消息类型由其分配的参数群编号识别。
RTR位(在CAN协议远程帧中定义)不可用于隐性状 态 ( 逻 辑 1 ) 。
因此,远程传输请求(RTR=1)在SAEJ1939中不适用。
举栗子

  1. 选择DBC文件的报文

我们的Diesel_Chassis_CAN.dbc上的某一帧报文,ID=0x14FD3E3D

按位解析

对ID:0xCF00400进行按位解析。

优先级P:3、6

扩展数据页EDR(R):0、0

数据页DP: 0、0

PDU格式PF: 0xF0、0xFD,表示PDU格式为PDU2,即PS表示组扩展

PDU特定域PS: 0x04、0x3E(应该无指定意义,只为了构成PGN的编号),PS表示组扩展

源地址SA: 此处是0x00、0x3D,实际发送节点EMS的设备地址是0xFE(有点小疑惑,先不管它)

右图是我们项目里的

参数组编号PGN: 0xF004、0xFD3E

查询文档

步骤一, 在SAE-J1939-21中查询PGN,如下图,发现竟然里面的描述和我们上面按位解析的一致(说明以后我们第一步先找PGN)

而上面我们项目中的ID=0x14FD3E3D,PGN=0xFD3E=64830,查询J1939DA.xlsx附表与报文中的信号对应。

上表中即为该帧信号的layout和精度、偏移等信息,与后面CAN DBC一致

步骤二, 继续查询并分析SPN190,所谓SPN我认为就是对数据域做了解析。(下图DBC告诉我们该信号处于4-5byte,SPN为190)

步骤三, 解析SPN190,如下图。(和DBC的信号属性对比之后,发现分辨率略有区别。无需纠结,可能是整车厂定义了这个参数。但是具体信号的其他属性均和文档一致)

[1] SAE-J1939协议入门解析-CSDN博客

[2] 浅谈J1939及安全测试

6. J1939协议实用指南与J1939数据记录方案

(1)PGN和SPN

J1939报文中,使用18位的PGN(参数组编号,Parameter Group Numbers)作为一组参数的标号,参数组内有一个或者多个具体的参数;而参数组中的每个具体的参数在J1939中被19位的SPN(怀疑参数编号,Suspect Parameter Numbers )标识出来。

  1. 多字节数的变量和多包报文
    多字节数变量先发送有效字节的最低位(Intel字节顺序)。根据传输协议支持最大1785=2557字节的PGN。
    其他J1939特性
    保留的PGN: J1939包含大量的标准PGN,但PGN的 00FF00至00FFFF(65280~65535)是保留的
    特殊的PGN:数据字节为0xFF(255)反映N / A数据,而0xFE(254)反映错误
    拓展:PGN与CAN ID关系
    J1939中的PGN包括CAN扩展帧ID(29位)中的18位PGN是J1939标准中唯一的帧标识符(J1939-71文档中列出了PGN以及SPN)。


示例:J1939 PGN 61444(EEC1)
假设有一条J1939报文,其ID为0CF00401。在这里,PGN从第9位开始,长度为18(从索引1开始)。PGN就是0F004或用十进制来表示就是61444。在SAE J1939-71文档中进行查找,发现它是“ 发动机电子控制器1-EEC1 ”。另外,该文件里面包含了PGN的详细信息,包括优先级、传输速率和相关SPN,详见上图。
在这个PGN中,有七个SPN(例如,发动机转速,RPM),可以在J1939-71文档中查询每个SPN的详细信息。


拓展:SPN(怀疑参数编号)
J1939中的SPN作为数据库中包含的CAN信号(参数)的标识符SPN按照PGN来分组,可以根据其位起始位置、位长度、精度(比例)、偏移量和单位(将SPN数据提取和缩放为物理值所需的信息或者量)来描述。
如下解析在J1939中SPN 190(发动机转速)。假设记录了原始的J1939报文如下:


通过将CAN ID转换为J1939的PGN,可知这是前文提到的PGN 61444。从J1939-71文档可以查到该PGN中的SPN之一是发动机转速(SPN 190),其详细信息如表所示。
注意上面的一些数据字节是FF或是255,即不可用。虽然PGN理论上是可以支持在此范围内的SPN,但是填充了FF就意味着这特定应用程序不支持这些参数。


J1939 DBC文件
实际上,不需要通过查PDF的方式去解析J1939数据的内容,这个信息也存储在基于J1939数的CAN数据库 (.dbc文件)中。
J1939 DBC文件可用于解码市面上40-60%重型车辆上的数据,其他的则是OEM专用的数据,就需要逆向工程了。
(2)J1939的请求和多包报文

  1. J1939 请求报文
    J1939协议支持各种高级操作,例如请求、多包报文和多路复用:
    大多数J1939报文以广播的形式在CAN总线上传播,但有些信息是需要请求的(例如一些J1939诊断故障代码)。这是通过“请求报文”(PGN 59904)来实现的,这是仅有3个数据字节的J1939报文。它的优先级为6,传输速率可变,可以作为全局或特定地址的请求发送。数据字节从第1位到第三位中,应包含请求的PGN(Intel字节顺序),这里的J1939请求报文中包含了诊断信息(DM)。对于OBD2来说,可以利用CANedge中的传输列表来建立SAE J1939的请求报文。


[1] cloud.tencent.com/devel
7. 如何做好J1939应用层数据定义
SAE J1939 跟CANOpen,DeviceNet等一样都隶属于CAN的高层协议,J1939广泛应用于卡车,船舶,农林等设备,也正在拓展至其他的行业,SAE预留了两段参数组范围可以被设备制造商定义。
(1)熟悉PGN
PGN即Parameter Group Number是J1939协议中用来标识参数集所定义的,共有24位,占三个字节,是CAN 29位标识符的一部分,其实SAE J1939这种高层协议都是充分利用了CAN的29位标识符,因为对CAN的29位标识符在CAN 2.0中并没有做具体规定,所以这就给高层协议的制定留下了很大的空间,通过一张表就可以清楚的知道。



(2)PGN的构成
PGN主要由保留位,数据页,PDU格式,和组扩展域:


SAE 组织在最新的release文档中,已经将原来在文档中定义的许多内容都集成进一个EXCEL表格,方便查询。
如果只在自己的内网使用而不接入汽车的网络,那么PGN可以在规定的范围内随便定义,但是如果是在车上使用,就不能随便定义,不能使用SAE已经定义过的PGN,只能使用65280-65535和130816-131071添加自定义的PGN。
(3)PGN在PDU中的位置
PGN是J1939协议数据单元很重要的一部分,了解他们的关系很重要,


协议数据单元PDU由七部分组成,分别是优先级,保留位,数据页,PDU 格式,特定PDU(可作为目标地址、组扩展或专用),源地址和数据域。PDU 被封装在一个或多个CAN 数据帧中,通过物理介质传送到其他网络设备。每个CAN 数据帧只能有一个PDU。需要指出的是,有些参数组编号定义需要多个CAN 数据帧才能发送其数据。
(4)定义数据
在熟悉以上的内容和定义后,就可以在规定的PGN范围内定义自己的数据映射,例如我们可以在65284定义逆变器的输入电压和电流。


可以参考SAE官方release的格式在规定范围内定义自己的PGN,例如上面添加的三个数据,输入电压,2字节,分辨率是0.01V/bit, 有效的数据范围是0·642.55V, 电流也是两个字节,分辨率是0.05A/bit,有效数据范围是0-3212.75A。数据的分辨率和范围,以及定标,都有标准规定在文档中,选择适合你的应用,如下表对数据的范围,偏移,长度,缩放等都有规定,可以参阅SAE发布的标准。而且每一个SLOT都有名字和类型,根据需要选择。


另外,如果是要上市的产品,还需向SAE申请一个制造商编号,制造商编号也是每一个节点名字的一部分。
[1] 如何做好J1939应用层数据定义
8. SAE-J1939-21 (超8字节)多包数据----CAN传输协议
(1)协议数据单元PDU
协议数据单元用于应用层或网络层,提供一串被称作协议数据单元的信息。协议数据单元提供一个组织信息的框架,它是要发送的每个CAN数据帧的关键。PDU被打包成一个或多个数据帧通过物理介质发送给其他网络设备。


优先级(P):消息优先级可从最高 0(000)设置到最低 7(111)。
保留位(R):保留此位以备今后开发使用。
数据页(DP):用来选择参数组描述的辅助页。
PDU格式(PF):用来确定PDU的格式,以及数据域对应的参数组编号PGN。
特定PDU(PS):特定 PDU 是一个 8 位域,它的定义取决于 PDU 格式(PF),根据 PDU 格式(PF) 它可能是目标地址或者群扩展
若 PDU 格式(PF)段的值小于 240,特定 PDU 段是目标地址。
若 PDU 格式(PF)段的值在 240 和 255 之间,特定 PDU包含群扩展(GE)值。
源地址(SA):源地址域长 8 位。网络中一个特定源地址只能匹配一个设备。因此源地址域确保 CAN标识符符合 CAN 协议中的唯一性要求。
数据域:
当用不多于 8 字节的数据即表示一个给定参数群时,可使用 CAN 数据帧全部的 8 个字节。
当一个特定参数群用长度从 9 至 1785 字节的数据来表示时,数据通信是通过传输协议功能的连接管理能力来建立和关闭多包参数组的CAN通信。
(2)传输协议功能(多包数据传输)
传输协议功能是数据链路层的一部分,它可再细分为两个主要功能:消息的拆装-重组和连接管理。
在以下的段落中,术语 “发送者”(originator) 指那些发出请求发送消息的电控单元或设备。术语 “响应者”(responder) 指那些发出应答发送消息的电动单元或设备。

  1. (消息)拆装和重组

长度大于8字节的消息无法用一个单独的CAN数据帧来装载。因此,它们必须被拆分为若干个小的数据包,然后使用单独的数据帧对其逐一传送。而接收方必须能够接收这些单独的数据帧,然后解析各个数据包并重组成原始的信息。

  1. 数据包
    CAN数据帧包含一个8字节的数据域。由于那些重组成长信息的单独数据包必须要能够被一个个识别出来,才可以正确重组,因此把数据域的首字节定义为数据包的序列编号。每个数据包都会被分配到一个从1到255的序列编号。
    由此可知,最长的数据长度是(255包×7字节/包=)1785个字节
  2. 序列编号
    序列编号是在数据拆装时分配给每个数据包,然后通过网络传送给接收方。
    接收方接收后,利用这些编号把数据包重组回原始信息。
    序列编号将从1开始依次分配给每个数据包,直到整个数据都被拆装和传送完毕。
    这些数据包将从编号为1的数据包开始按编号的递增顺序发送。
  3. (数据)拆装
    过长的数据,是指那些无法用一个单独的CAN数据帧全部装载的数据(例如,数据域长于8个字节的消息)。
    考虑本协议的用途,过长的数据这里被认为是与一些9字节长或以上的字符串相关的参数群。第一个数据传送包包含序列编号1(占一个字节)和要发送的字符串的头7个字节,其后的7个字节跟随序列编号2存放在另一个SAE J1939/CAN数据帧中,再随后的7个字节与编号3一起,就这样直到原始信息中所有的字节都被存放到SAE J1939/CAN数据帧中并被传送。
    每个数据传送包(除了传送队列中的最后一个数据包)都装载着原始数据中的7个字节。而最后一个数据包的数据域的8个字节包含:数据包的序列编号和与参数群相关数据的至少一个字节,余下未使用的字节全部设置为“FF”。
  4. (数据)重组
    数据包被陆续地接收后,多组消息的数据包将会按照序列编号的顺序重新组合成一长串字节。这一长串字节将被传送给负责处理长数据的应用程序模块。
    连接管理
    连接管理是用于处理在特定目标地址传输时节点间虚拟连接的打开、使用和关闭。
  5. 多组消息广播
    长消息可能是没有指定目标地址的,换句话说,它们是广播消息。
  6. 连接的开始
    当某个节点传送一条请求发送消息给一个目标地址时,连接就开始了。
  7. 数据传输
    当连接的发送者接收到准备发送消息后,数据传输正式开始。
  8. 连接的关闭
    当接收到数据流的最后一个数据包时,响应者将发送一个消息结束应答给消息的发送者。
    传输协议----连接管理消息(TP.CM)
    连接管理(TP.CM)协议表:
  1. 连接模式----请求发送(TP.CM_RTS)
    TP.CM_RTS 消息只能由发送者发送。
  1. 连接模式----准备发送(TP.CM_CTS)
    TP.CM_CTS 消息只能由接收者发送。
  1. 消息结束应答(TP.CM_EndofMsgAck)
    TP.CM_EndofMsgACK 消息只能由接收者发送。
  1. 放弃连接(TP.CM_Abort)
    TP.Conn_Abort 消息可以由发送者或者接收者发送。
  1. 广播公告消息(TP.CM_BAM)

TP.CM_BAM 消息只能由发送者发送。

传输协议----数据传送消息(TP.DT)

数据传送(TP.DT)协议表:

TP.DT 数据传送,只能由发送者发送。

(3)多包数据传输----举例说明

假设:发送者地址----0x55,接收者地址----0x22

  1. 帧ID

多包数据传输----流程

具体数据传输次序流程图如下:

具体说明如下:

在传送中数据包成员的PGN 值统一标识为 65259(0x00FEEB)。

  1. 步骤1:发送者----请求发送(TP.CM_RTS)
    有一个 23 个字节的消息被拆装成 4 个数据包将被发送。
  1. 步骤2:接收者----应答发送(TP.CM_CTS)
    应答表示接收者已经准备好处理从编号 1 开始的 2 个数据包
  1. 步骤3:发送者----传输数据(TP.DT)
    发送者通过网络用 TP.DT 消息发送了前2个数据包。
  1. 步骤4:接收者----应答发送(TP.CM_CTS)
    接收者发出一条TP.CM_CTS 消息,表示它想保持连接但不能马上再接收任何数据包。
    在最长延迟 500 毫秒后,它必须再发一条 TP.CM_CTS 消息来保持连接。
    在这个例子中,接收者者再发送了一条TP.CM_CTS 消息,表示它可以接收从编号 3 开始的两个数据包。
  1. 步骤5:发送者----传输数据(TP.DT)
    发送者通过网络用 TP.DT 消息发送了后2个数据包。
  1. 步骤6:接收者----结束应答(TP.CM_EndofMsgAck)

一旦 3 号和 4 号数据包被传送完毕,接收者发送了一条 TP.EndofMsgACK 消息,表示所有的数据包都接收到了,现在关闭连接。

[1] SAE-J1939-21 (超8字节)多包数据----CAN传输协议-CSDN博客

[2] can总线协议中PGN是什么? - 知乎 (zhihu.com)

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风皓月伴星辰

谢谢鼓励,努力创作,共同进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值