J1939协议之通俗易懂—-简介

J1939协议之通俗易懂—-简介J1939简介 J1939协议简介J1939协议是由美国汽车工程师协会(SAE)(SAE协会简介)定义的一组标准。J1939标准用于卡车、公共汽车和移动液压等重型车辆。在许多方面,J1939标准类似于旧版J1708和J1587标准,但J1939标准协议建立在CAN(控制器区域网络,ISO11898)上。物理层(J1939/11)描述了针对客车的电气接口。数据链路层描述…

大家好,又见面了,我是你们的朋友全栈君。

J1939简介

J1939协议简介

J1939协议是由美国汽车工程师协会(SAE) (SAE协会简介)定义的一组标准。J1939标准用于卡车、公共汽车和移动液压等重型车辆。在许多方面,J1939标准类似于旧版J1708和J1587标准,但J1939标准协议建立在CAN(控制器区域网络,ISO11898)上。

物理层(J1939/11)描述了针对客车的电气接口。数据链路层描述了构建报文、访问总线以及诊断传送故障的规则。应用层(J1939/71和J1939/73)定义了在网络中传送的每条报文的具体数据。

 

J1939主要特性

  • J1939协议标准基于CAN的高层协议
  • J1939协议应用于重型车辆
  • J1939协议传送速度稳定在250kbps

报文格式及使用方法(J1939/21)

MJ1939标准定义的大部分报文均旨在广播。这意味着网络中传输的数据没有指定目标地址。这样任何想要使用数据的设备都不需要再额外请求报文。将来的软件升级也可以方便兼容新设备(地址分配)。当报文必须指向特定设备时,可以在报文标识符里包含特定的目标地址。例如,请求来自发动机的特定扭矩值,而不是来自制动控制器的特定扭矩值。

J1939使用CAN 2.0B协议中定义的29位标识符,如图1所示。含有指定目标地址的报文(“PDU 1”)与旨在广播的报文(“PDU 2”)使用的标识符略有不同。

PDU是协议数据单元(即报文格式)。

SOF,SRR和IDE位由CAN标准定义,这里忽略。RTR位(远程请求位)在J1939中总是设置为0。

J1939协议中使用的29位标识符结构如下。

优先权位 保留位 数据页位 PDU格式 特定PDU 源地址
3个位 1个位 1个位 8个位 8个位 8个位
表1: 29位标识符的结构

标识符的前三位是用于在仲裁过程中控制报文的优先级。0值拥有最高优先级。更高优先级值通常用于高速控制报文,例如从传动装置至发动机的转矩控制报文。包含时间不重要的数据的报文,例如车辆行驶速度,会被赋予较低优先级值。

标识符的下一位将保留备用,在报文发送中应设置为0。

标识符中的下一位是数据页选择器。此位扩展可由标识符表示的潜在参数组的数目。

协议数据单元格式(PF)用于确定是否可以作为包含目标地址报文发送或者报文总是作为广播报文发送。

对特定协议数据单元(PS)字段变化的解释以PF的值为依据:

  • 如果PF处于0和239之间,则报文可寻址,且PS字段包含目标地址。
  • 如果PF处于240和255之间,则报文只能广播(PDU2),且PS字段包含组扩展。

组扩展扩展了可由标识符表示的潜在广播参数组的数目。

术语参数组编号(PGN)适用于将保留位、DP、PF和PS字段的值合并成单个18位的值。

例如: 身份0xcf004ee可分为表2所示字段。

 

0x0C 0xF0 0x04 0xEE
000 011 0 0 11110000 00000100 11101110
Prio R DP PF PS SA

表2. PGN示例

  • PGN = R,DP, PF和PS字段 – 在本例中为0x0F004。
  • PF = 0xF0 = 240,即这是PDU2(广播)报文
  • PS = 0×04,即组扩展 = 4

标识符的最后8位包含发送报文的设备的地址。地址是被分配以提供唯一地访问网络上的给定设备的方式的标签或“句柄”。对于给定的网络,每个地址必须是唯一的(可以有254个)。这意味着两个不同的设备(ECU)不能使用相同的地址。

 

地址和名称 (J1939/81)

名称是64位(8字节)长的标签,给每个ECU一个独特的身份。 名称由10个字段组成,并具有表3所示的以下结构。

表3. 名称的结构

  1. 随机存取位
  2. 行业组,长度3位
  3. 车辆系统实例,长度4位
  4. 车辆系统,长度7位
  5. 保留位
  6. 函数,长度8位
  7. 函数实例,长度5位
  8. ECU实例,长度3位
  9. 制造商代码,长度11位
  10. 身份号码,长度21位
CAN报文中的字节号码 内容/意义
0 身份号码, LSB
1 身份号码
2 0-4位: 身份号码,MSB
5-7位: 制造商代码,LSB
3 制造商代码,MSB
4 0-2位: ECU实例
3-7位: 函数实例
5 函数
6 0位: 保留位
1-7位: 车辆系统
7 0-3位: 车辆系统实例
4-6位: 行业组
7位: 随机存取位

 

名称的主要目的是描述ECU。低函数字段的值,0127,被预先分配给标准的函数或设备。值128254则依赖于行业组和车辆系统的值。这种依赖性使得不同的车辆可以拥有相同配置的函数。该系统还允许诸如拖车和农用车辆等设备限制对可用地址的搜索,且因此尽可能缩短动态声明地址的时间以及降低其难度。当请求地址时, 名称被用来决定哪一个ECU拥有更高的优先权,并以此获得请求的地址。

网络中的每一个设备都会至少与一个名称和地址相关联。然而,多个设备名称和多个地址可能会在单个ECU中共存。例如,一个发动机和发动机制动(减速器)通过一个物理总线连接共存在同一个设备中。设备地址定义了报文的特定讯息来源或目的地。名称能识别功能,当网络中有多个同类设备共存时,可以为功能分配一个特定编号。受地址限制,一个网络中最多可同时包含254个同类设备。地址255被留作广播的全局地址,地址254被留作空地址,当设备还未获得地址或获得地址失败时使用。

 

地址请求

一般来说,大多数地址都是提前分配好的,接通电源即可使用。为了允许J1939 容纳后来的设备和未被定义的功能,需设定一个程序,允许动态分配地址。每台设备需表明和它相关的地址。这便是识别(地址请求)属性。有两种选择:

1. 发送地址请求指令申请地址。

当设备发送地址请求报文申请地址时,所有设备都会将这条报文与它们在网络中的设备地址比较。如果该地址已被有更高优先权的设备申请,具有优先权的设备会发送一条包含地址已被使用的地址请求报文。设备名称,在地址请求报文中以数据的形式发送,决定哪个设备具有更高的优先权。

2.发送申请地址请求。

当一个设备发出申请地址的请求时,所有设备通过传递已申请到地址的报文来回复。这保证了过渡中的设备(工具,追踪器等)或即将工作的设备获得当前的地址表,选择并申请可获得的地址。如图表2。

动态地址分配支持是有选择的,只有当设备可能遇到地址冲突时才使用该支持。为了减少动态地址分配支持,加快“识别”速度,大部分ECU 都与一个推荐地址联系到一起。这些推荐地址在J1939/71文件中有描述。如果推荐地址已被其他ECU使用,设备的自配置得到了其他设备的支持的话,则可以申请另一个地址。

 

j1939-address-claim1

 

报文传递(J1939/21J1939/7x)

为完成特定的数据传送,报文中必须有描述待传数据的控制报文。为减少控制报文,相关数据应放在一条报文中。J1939/71文件定义了一些标准的PGN,可以描述报文中待传的参数。此外,J1939/71文件还包括关于报文优先性和传输速率的信息。应该注意的是,当设备不能提供指定参数的数据时,本该包含此参数的字节被设定为无法获得”(0xFF),接收器便能知道数据丢失了。报文中的数据多于八个字节时,可被作为多数据包报文传输。多数据包报文通过传输协议功能传输,参见J1939/21中的定义。但是传输多数据包报文有两种方式:

  1. 广播通知报文(TP_BAM)
  2. 连接管理(TP_CM)

 

TP_BAM报文

TP_BAM报文使用全局地址,意味着网络中的所有设备都能接收到报文。传输通过连接管理(CM)报文PGN = 0x00EC00开始,其中有一个表明TP_BAM的控制字节。报文数据接着在数据传输(DT)报文,PGN = 0x00EB00中。

 

TP_CM报文

TP_CM报文在两个设备间点到点传输。传输从带有表示请求发送(RTS)的控制字节的CM 报文开始。接收设备回复一个带有表示清除发送(CTS)的控制字节的CM报文。然后传输设备使用DT报文发送CTS中表示的数据。CTS和DT报文持续进行信号交换直到全部数据传送完成。当报文传送完成,接收设备传输一个带有表示报文结束确认(EOM)的控制字节的CM报文,连接终止。要注意的是,在工作的过程中,CM报文会根据控制字节的种类带有额外数据。RTS包括:字节的数目,数据包的数量和数据已运输的PGN。CTS包括接收设备下次预期的数据包的数量和起初的数据包数量。

 

报文接收(J1939/21和J1939/7x)

从网络中捕捉选中的信息有不同的技术手段(和芯片)。可使用一般的观察方法,但基于接收到的信息而有所不同:

  1. 如果一则报文请求特定的地址,设备必须确认目标地址是否与设备请求的地址匹配。如果匹配,接收设备必须处理报文,并进行某种确认。
  2. 如果报文是一个全局请求,那每个设备,包括发起设备都必须处理请求,并回复数据是否可得。
  3. 如果报文是广播,每个设备必须确认内容是否相关。

 

ECU设计(J1939/1xJ1939/21J1939/7x)

尽管每个制造商对产品中的电子控制单元(ECU)的性能有不同的要求,还是需要观察一下支持J1939的几种资源。J1939目前的数据速率是250Kbps.一个典型的包含8个数据字节的报文长度是128位(包含用于填充的位),也就是约500微秒。最短的报文有64位。这意味着,每250微秒可以发送一个新报文。尽管并不是所有报文都是相关的,总线负载也不会超过50%,接收处理器必须能在很短的时间内处理(或缓冲)反馈信息。这需要一些内存空间和传输内存的处理时间。

 

接线布局 - 物理层(J1939/1x)

J1939网络是一对线型屏蔽双绞线,环绕在车身,连在每个ECU上。在ECU和总线之间允许有一个短的末梢网络。这样简化了总线的接线,总线可以不用直接连到ECU上。线型总线的数据速率要达到250Kbps,以使得电子信号反射最小化。总线每个终端的终端电子也能降低反射。

其实,J1939网络可能由几个段组成,由一个中继设备作为连接桥。这些段互相不需要直接兼容。比如,这些段的数据速率可能不同,或使用不同的物理媒介。网桥的主要功能是在各段间起到电绝缘作用。在牵引机和拖车间的线中断的情况下,牵引机上主要的J1939段也能继续发挥功能。网桥还可以有选择的过滤需要存储的报文和将报文从一个段转送到另一个。

 

如何解读J1939报文的示例

这个例子旨在解释解读J1939报文的准则。

我们来看一条内容如下的J1939报文:

 

CAN标识符: 0xCF00401
数据字节: 0xFF FF 82 DF 1A FF FF FF

CAN-ID 提供了什么信息?

j1993-information-in-a-can-message1

 

前两个字节=0x0C = 00001100二进制。由于标识符只有29个位,所以前三个位不使用。接着的3个位代表优先报文,在这个例子中是3。接着是一个保留位,然后是决定完整PGN的数据页。

CAN-ID的最后一个位是源地址(发送设备的地址),在这个例子中是1

PGN= 0x0F004,根据J1939/71文件,它与电子引擎控制器#1 (EEC1)相对应。J1939/71文件还对数据字节中的参数和位置做了描述。在这个例子中,数据区包含以下字节:

 

数据字节 FF FF 82 DF 1A FF FF FF
位置 1 2 3 4 5 6 7 8

 

该例子中数据字节1,2,6,78无法获得,因此设为0xFF。源参数值(单个字节)的不能为0xFF

数据字节3是实际发动机转矩百分比参数。源参数值0×82是十进制的130。根据J1939/71文件的每比特缩放比为1%, 偏移-125.因此,该参数的实际值为5%

数据字节45构成引擎转速参数。第一个字节(4)是最不重要的一个(内部字节顺序)。源参数值0x1ADF = 十进制中的6879。缩放比例为每比特0.125 rpm, 偏移为0.所以该参数的实际值低于859.875 rpm

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/132739.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • isnotempty和isnotnull_it is和it’s的区别是什么

    isnotempty和isnotnull_it is和it’s的区别是什么首先isNotEmpty和isNotBank都是判断字符是否为空,它是属于org.apache.commons.lang包下的(当然你可以可以采用其他包下的,或则自己造轮子)这里再说下俩者的区别,isNotEmpty是当字符对象null或则是"“时判定字符对象为空,isNotBlank也是当字符对象null或则是”“时判定字符对象为空,它还多一种情况判断,当字符对象为”"这种空白字符串(只有…

  • ORM常用操作

    一般操作专业官网文档必会13条查询<1>all():查询所有结果<2>filter(**kwargs):它包含了与所给筛选条件相匹配的对象<3>

  • Delphi中强制IdHTTP使用HTTP1.1(转)

    Delphi中强制IdHTTP使用HTTP1.1(转)Delphi中强制IdHTTP使用HTTP1.1(转)标签:delphiwindows工具server2011-07-1807:46952人阅读评论(0)收藏举报分类:DelphiIdHttp控件(29)前两天帮人写程序用IdHTTP控件往一网站发包如下:Delphi代码IdHTTP1.Request.Connection:=’Keep-A…

  • Go语言初见println和fmt.Println区别「建议收藏」

    Go语言初见println和fmt.Println区别「建议收藏」目录println()函数:fmt.println()函数:总结区别:1.包不同:2.输出方式不同:3.方法返回值不同:4.内置print/println函数的调用不能接受数组和结构体参数。5.对于组合类型的参数,内置的print/println函数将输出参数的底层值部的地址,而fmt和log标准库包中的打印函数将输出接口参数的动态值的字面形式。6.如果一个实参有String()string或Error()string方法,那么fmt和log标准库包里的…

  • pytest fixtures_pytest allure

    pytest fixtures_pytest allurefixture的优势Pytest的fixture相对于传统的xUnit的setup/teardown函数做了显著的改进:命名方式灵活,不局限于setup和teardown这几个命名conf

  • pycharm设置代理_mac pycharm怎么设置环境

    pycharm设置代理_mac pycharm怎么设置环境一、Shadowsocket用默认端口即可不需要改二、mac网络三、Pycharm配置代理检测成功四、然而执行代码还是没走代理最后方式直接request加代理#!/usr/bin/evnpython#-*-coding:utf-8-*-importrequestsproxy={“http”…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号