直流充电网GB/T 27930协议CAN报文解析方法
直流充电网GB/T 27930协议CAN报文解析方法
本文非原创,原文章地址如下:直流充电网GB/T 27930协议CAN报文解析方法 (ofweek.com)
之所以放在这里,是作为我学习积累的见证。
本文以国标GB/T 27930—2015《电动汽车非车载传导式充电机与电池管理系统之间的通信协议》为基础,讲述了直流充电网协议报文解析方法。主打实用,对于偏理论的部分仅作浅层叙述。文章主要囊括:
-
直流充电网CAN报文结构介绍
-
CAN报文分析方法
报文组成
一条报文主要由ID(标识符)、数据帧等组成,在通常应用中主要关注的是报文ID、数据内容、发送周期,此处仅对此三项进行分析。关于CAN报文的详细定义可参照GB/T 27930—2015文件中的“2 规范性引用文件”中所述。
下图是车辆直流充电握手阶段的报文,以第一条报文“序号0”行为例,这是直流充电网的第一条报文(CRM),在插枪并启动充电柜后由充电柜发送。主要信息如下:
注:
报文中的数字不区分大小写;
获取的报文数据均为十六进制(为简便起见,未用符号表明);
数字前方的“0x”符号表示此数字为十六进制;
数字后方的“H”符号也表示此数字为十六进制;
数字后方的“b”表示此数字为二进制;
本文中十进制数字均省去符号位。
时间标识 |
0x0068214a |
报文ID |
0x1826f456 |
报文数据 |
01 01 00 |
时间标识
通过时间标识可看出该条报文的发送时刻、时间间隔。
时间标识算法:
上图为十六进制,以0x182656f4(CRM)前两条为例,其时间标识为0x0068214a和0x00682b10,换算成十进制则分别为6824266和6826768(单位为0.1ms)。取二者差值2502,即时间差为250.2ms,符合国标对CRM要求的250ms周期(偏差0.2ms,在允许范围内)。
若为系统时间,则计算更简洁,直接将两个北京时间取差值即可。(系统时间存在极少量偏差,如无需进行精确分析,可忽略此偏差)
也有设备显示的原始时间标识直接为十进制,这样更直观。
报文ID
报文ID相当于一条报文的身份证。下图为国标中对协议数据单元(PDU)的定义,此处以CRM报文为例,其ID为0x1826f456,可分为四部分0x18、0x26、0xf4、0x56.
报文ID解析:
⚫ 0x18,包含优先权P(3位)、保留位R(1位)、数据页DP(1位)三项内容。R和DP均为0
〰 首先将0x18转换为二进制:11000B,分为三部分
〰 优先权P:110B,换算成十进位为6,表示此条CRM报文的优先权为6
〰 保留位R:0
〰 数据页DP:0
⚫ 0x26,为此条报文的PF,可用来查询此条报文的参数。直流充电网中每条报文具有惟一的PF,相当于身份证号。
⚫ 0xf4,目标地址PS,即此条报文是发给地址为0xf4的节点的。国标中车辆BMS的地址为0xf4,充电柜的地址为0x56
⚫ 0x56,源地址SA,即此条报文是地址为0x56的节点发出来的。
参照国标“9 报文分类“,该处定义了每条报文的代号、名称、PGN、优先权、报文周期、数据长度、源-目标地址,可直接根据此处所列找到对应报文ID.这是报文目录,分析充电网报文时会经常用到。
以参数配置阶段的BRO报文为例
其优先权为4,则二进制P、R、DP一起为10000B,换算成十六进制为0x10;
其PGN为000900H,则PF为0x09;
目标地址为充电机0x56;
源地址为BMS 0xf4;
组合起来其ID便为0x100956f4.
后续分析报文时看其PGN中间两个数(如0x01、0x07、0x0A等)即可筛选出对应ID.(组帧报文例外,具体见下方组帧报文部分描述)
数据帧
CAN网络中一帧报文的数据最长为8个字节,若报文的数据长度不超过8个字节,则在CAN网络中以一帧报文发出(如下图中的BCL报文0x181056f4、CCS报文0x1812f456、BSM报文0x181356f4这三条)。若数据长度超过8个字节,则以组帧形式发送(如下图中的0x1cec56f4、0x1cecf456、1ceb56f4,具体格式及解析方式见下方“组帧传输“)。
如上图,excel中数据列有8列,从左往右依次为报文的第1、2…8字节。如BCL(0x181056f4)报文数据长度为0x5,则其数据列对应如下
报文ID |
一 |
二 |
三 |
四 |
五 |
0x181056f4 |
8C |
19 |
3C |
0F |
02 |
组帧报文传输
当报文的数据长度超过8个字节时,在CAN网络上将会按照组帧报文格式进行传输。直流充电国标中,在充电的每个阶段最多有一条数据长度超过8的报文,均为BMS发送出来的。下图是直流充电网中的BRM、BCP两条报文。
(不同组帧报文,传输过程中其ID均用同一组,需要从数据内容中区分)
以BCP报文为例,组帧报文传输主要关注下面这段BCP报文中标注颜色的部分即可。
报文ID |
一 |
二 |
三 |
四 |
五 |
六 |
七 |
八 |
0x1cec56f4 |
10 |
0D |
00 |
02 |
FF |
00 |
06 |
00 |
0x1cecf456 |
11 |
02 |
01 |
FF |
FF |
00 |
06 |
00 |
0x1ceb56f4 |
01 |
9D |
01 |
00 |
00 |
73 |
09 |
04 |
0x1ceb56f4 |
02 |
1A |
6A |
DE |
03 |
98 |
17 |
|
0x1cecf456 |
13 |
0D |
00 |
02 |
FF |
00 |
06 |
00 |
组帧报文虽稍复杂,但应用时只需关注其主要特征点,可参照以下对话框模拟示意。
BCP报文详细规则
上述对话框简图已涵盖分析数据时需关注的点和方法,接下来将详细描述组帧报文传输规则。
BMS请求
BMS发送组帧报文时,会先发送一条ID为0x1cec56f4的报文,用来告知充电柜开始组帧报文的传输。实际应用时直接看第七字节内容即可识别此组组帧报文所对应的的PGN。
报文ID |
一 |
二 |
三 |
四 |
五 |
六 |
七 |
八 |
0x1cec56f4 |
10 |
0D |
00 |
02 |
FF |
00 |
06 |
00 |
0x1cec56f4报文字节解析如下:
第一字节。第一字节为控制字10,内容固定;
第二、三字节。为数据长度,BCP报文的数据长度为13,因此换算成十六进制为0xD,用两个字节表示为0x000D,其中低字节填入第二字节0x0D,高字节填入第三字节0x00;
第四字节。为数据包个数,即接下来会以两帧报文(ID 为0x1ceb56f4)来传输13个字节的数据内容;
第五字节。预留,默认发0xFF
第六、七、八字节。即BCP报文的PGN,为000600H
充电柜回应
充电柜接到这条报文后会回复一条ID为0x1cecf456的报文,用于告知BMS充电柜已准备好接收。此条报文一般可忽略。
报文ID |
一 |
二 |
三 |
四 |
五 |
六 |
七 |
八 |
0x1cecf456 |
11 |
02 |
01 |
FF |
FF |
00 |
06 |
00 |
0x1cecf456报文字节解析如下:
第一字节。11为控制字,内容固定;
第二字节。02,即告知BMS,充电柜可以接收2个数据包;
第三字节。01,即将接收的这个数据包编号为“01“;
第四、五字节。默认发0xFFFF;
第六、七、八字节。即BCP报文的PGN,为000600H.
数据传输
接下来BMS就开始以0x1ceb56f4报文来正式发送数据。每条报文可发送7个字节(第1字节为序号),BCP长度为13,因此用两条报文来发送。
这个ID的报文承载了所有需要传输的数据,重点关注这一块。
报文ID |
一 |
二 |
三 |
四 |
五 |
六 |
七 |
八 |
0x1ceb56f4 |
01 |
90 |
01 |
00 |
00 |
73 |
09 |
04 |
0x1ceb56f4 |
02 |
1A |
6A |
DE |
03 |
98 |
17 |
0x1cec56f4报文字节解析如下:
第一条0x1ceb56f4报文
第一字节为序号01,即第一条数据包
第二到八字节依次为要发送的第1、2…7字节数据
第二条0x1ceb56f4报文
第一字节为序号02,即第二条数据包
第二到七字节依次为要发送的第8、9、10、11、12、13字节数据
充电柜确认
发送且接收完毕后,充电柜则回复一条0x1cecf456报文,用来告知BMS,充电柜已完成接收。一般可忽略不看。
报文ID |
一 |
二 |
三 |
四 |
五 |
六 |
七 |
八 |
0x1cecf456 |
13 |
0D |
00 |
02 |
FF |
00 |
06 |
00 |
0x1cecf456报文字节解析如下:
第一字节13:控制字,表示已接收完毕;
第二、三字节000D:表示接收到的数据为13个字节;
第四字节02:接收到的数据分两个数据包;
第五字节FF:默认填充;
第六、七、八字节。即BCP报文的PGN,为000600H.
最后,附上几张学习笔记。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)