笔者依据GB/ T27930的说明和在实际应用中获得的CAN报文实例解析该协议
报文组成
该协议的物理层使用的是CAN总线,所以其一定符合基本的CAN要求。CAN数据帧分为标准帧(11位标识符CAN数据)和扩展帧(29位标识符CAN数据)。国标中规定采用该协议的设备都应使用CAN扩展帧,在整个CAN数据帧中,我们只关心其 标识符、数据内容和 发送周期。所以我们只讨论这3个信息点。
上图中的定义是国标参考SAE J1939制定的,可以参考下面这个链接对SAE J1939的PDU部分做个简单的了解
SAE J1939理解
报文ID
报文的标识符id相当于我们每个人的身份证。在通讯过程中可以通过该信息来区分报文内容。
上面说道了使用该协议的设备必须是CAN扩展帧,也就是29位标识符。包含了上图中的 P(优先权)、R(保留位)、DP(数据页)、PF(PDU格式) 、 PS(PDU特定格式) 和 SA(源地址)
我们在协议中随便找一个数据帧按照上述进行解析看是否和我们通过CAN核读取到的一样。
我们先分析 CHM报文,由图可知其优先级为 6 转化为二进制为 110b,
而R(保留位)和DP(数据页)在本协议中已经被规定死为0,
PS的值为目标地址,在这条报文中目标地址为BMS系统,固定为F4H
SA为源地址,该条报文下为充电机,固定为56H。
至此我们已经确定了标识符29位中的21位。得到如下信息
18 XX F4 56-----------------------(为16进制数据)
而 PF为 PDU格式信息中的一部分,可以通过上述链接中对SAE J1939的部分得知PF值既为 16进制PGN的中间值,CHM的PGN = 0x002600 ,所以PF = 0x26
从而得到该报文ID为 0x1826F456,按照上述规则可以推出BHM报文ID为0x182756F4
实际情况如下:
可知我们的推断方式是正确的。
但是上述报文的数据长度都是小于8字节的,如果数据长度大于8字节的报文,协议规定使用组帧报文发送。
我们就以BCP报文为例解析一下。
BMS系统向充电机发送一个ID为0x1cec56f4的报文
报文ID 1 2 3 4 5 6 7 8
0x1cec56f4 10 0d 00 02 ff 00 06 00
BYTE1 :固定为 10
BYTE2-3 :帧数据长度,13 = 0DH,小端模式,所以 0d 00
BYTE4 :为数据包个数,13个字节需要分2次发送
BYTE5 :固定为FF
BYTE6-8 :该报文的PGN 00 06 00
充电机回复:
0x1cecf456 111 02 01 ff ff 00 06 00
BYTE1 :固定为 11
BYTE2 :告诉BMS系统,自己已经准备好接受2帧报文的数据了
BYTE3 :告诉BMS系统,自己接受的第一帧报文序号为 01
BYTE4-5 :保留
BYTE6-8 :该报文的PGN 00 06 00
数据传输:
0x1ceb56f4
声明:
为转载文章,侵权删除