2. 上海玫克生储能科技有限公司, 上海 201619
2. Shanghai Makesens Energy Storage Co. Ltd., Shanghai 201619, China
电动汽车车用锂电池发展十分迅速, 全球电动汽车保有量在逐年增加, 但随之而来的电池安全问题也日益严重, 主要还是电池一致性问题. 纯电动汽车的电池信息主要由电池管理系统(BMS)发出, 因此采集BMS发出的CAN报文, 准确的诊断预测出电池存在的安全隐患至关重要. 因为CAN协议格式并没有固定标准格式, 计算机无法识别CAN协议, 所以在CAN报文解析需要将CAN协议转换为机器可读的文件, 在之前的研究中有采用XML文件作为机器可读文件, 这种方法需要人工录入协议内容, 按照对应的格式将每一条信息转换成XML文件[1], 这样做会使工作量加大并且人工录入容易出错, 导致结果不准确, 目前CAN网络中各逻辑节点信息采用由德国维克多公司发布的DBC文件, DBC文件能够被机器识别, 拥有固定的格式, 依据DBC文件可以开发出用来监视CAN网络中所有逻辑节点的运行状态, 也可以是有针对性的ECU通信应用软件[2], 因此被广泛使用. 但是DBC文件目前主要依赖于专用软件的建立和解析, 而软件的使用价格昂贵. 本文基于树莓派设计了一套便携式可移动的BMS的CAN报文采集与解析系统, 只需要将DBC文件导入到树莓派内, 设备便能根据DBC文件进行报文解析. 能够实时有效的检测电池组一致性的好坏, 有利于提高电池的利用率, 方便维修检查电池工作状态.
1 CAN报文采集系统设计 1.1 CAN总线概述CAN总线是一种串行通信协议, 能有效地支持具有很高安全等级的分布实时控制. CAN控制器局域网是1986年Bosch公司提出的面向汽车的串行通信协议, 目前是国际上标准的汽车网络协议[3]. 当CAN总线上的节点发送数据时, 以报文形式广播给网络中的所有节点, 总线上的所有节点都不使用节点地址等系统配置信息, 只根据每组报文开头的11位标识符(CAN 2.0A规范)解释数据的含义来决定是否接收[4]. CAN总线可以分为3个层次: 物理层、传输层、对象层. 物理层中定义实际信号的传输方法, 用来定义不同节点之间根据电气属性如何进行位的实际传输. 传输层负责把接收到的报文提供给对象层, 以及接收来自对象层的报文. 对象层中可以为远程数据请求以及数据传输提供服务, 确定由实际要使用的传输层接收哪一个报文, 并且为恢复管理和过载通知提供手段[5].
1.2 硬件结构设计本文采用树莓派3B+作为CAN报文采集的载体, 树莓派是一款基于ARM的微型电脑主板, 以SD/MicroSD卡为内存硬盘, 支持WiFi和蓝牙连接, 主板周围有4个USB接口和一个以太网接口, 外部有40个GPIO接口, 支持Linux系统, 体积小价格低廉. 针对CAN报文的采集本文设计了树莓派的外接扩展板, 采用MCP2515作为CAN的控制器, Microchip的MCP2515是一款CAN协议控制器, 完全支持CAN V2.0B技术规范. 该器件能发送和接收标准和扩展数据帧以及远程帧. 通过SPI接口挂载在树莓派上, 树莓派在使用该芯片时不需要手动编写驱动, 打开设备树中的内核驱动就能够使用. 同时选用DS1307时钟芯片为树莓派断电时提供准确时间, 在采集报文时同时能记录下报文采集的绝对时间. 扩展板部分原理图如图1所示.
1.3 软件结构设计
CAN报文采集使用C语言编写采集程序, 采集速率更快数据更加准确, 在采集的同时在每条报文后添加采集时间, 便于后续对电池性能的评估. CAN报文在采集时软件上主要分为5步:
(1) CAN总线配置: 主要用于设置CAN总线的位速率以及使能CAN设备;
(2)创建套接字: Socket CAN采用的是原始套接字, 常用于检验新的协议实现或访问现有服务中配置的新设备;
(3)指定CAN设备: 绑定要用的CAN设备;
(4)定义接收过滤规则: 在数据接收时, 可以根据预先设置的过滤规则, 实现对报文的过滤;
(5)显示报文: 报文按照帧ID、数据长度、数据、时间的顺序用空格分隔开, 生成采集的报文文件.
采集的CAN报文如图2所示.
2 CAN报文解析系统设计 2.1 DBC文件结构目前DBC文件的广泛使用, 它是CAN矩阵的另一种表示, 各节点通过CAN网络传输信号协议规定ECU怎么发送和接收信号: 例如信号长度、类型、精度、偏移量、信号名等, 这些参数通过编辑工具生成DBC文件[6].
根据Vector发布的DBC文件格式规范, 本文设计了针对DBC文件的解析系统. 以一路CAN对应的文件为例, DBC文件的格式如下:
VERSION ""
NS_ :
BS_:
BU_: Vector__XXX
BO_ 408961267 Bms2VcuBasiInfo: 8 Vector__XXX
SG_ SysVolt : 7|16@0+ (0.1,0) [0|6553.5] "V" Vector__XXX
SG_ BatCurrent : 23|16@0- (0.1,-1000) [-4276.8|2276.7] "A" Vector__XXX
SG_ BatSoc : 32|8@1+ (1,0) [0|255] "%" Vector__XXX
SG_ BatSoh : 40|8@1+ (1,0) [0|255] "%" Vector__XXX
SG_ BatState : 52|4@1+ (1,0) [0|15] "" Vector__XXX
SG_ BatAlmLv : 48|4@1+ (1,0) [0|15] "" Vector__XXX
SG_ BatLife : 56|8@1+ (1,0) [0|255] "" Vector__XXX
DBC头部包含着VERSION与NS( new symbol)的信息, BU为网络节点的定义, BS为波特率设置, BO_为关键字表示报文, 408 961 267表示消息ID的十进制形式, Bms2VcuBasiInfo是消息名称, “8”为报文的数据长度帧字节数, Vector__XXX为发出消息的网络节点. SG_ SysVolt : 7|16@0+ (0.1,0) [0|6553.5] "V" Vector__XXX是一条消息下的一个信号, 其中SG_表示消息的起始. SysVolt表示信号名, 7代表起始位Bit, 16表示信号长度, 0或1表示Motorola格式或Intel格式, ±表示有无符号, 括号内表示精度值和偏移量, 中括号内表示最大和最小值, “V”为单位, Vector__XXX为信号节点.
2.2 CAN报文解析DBC文件格式是固定不变的, 且有固定的关键字表征不同的信息. 因此本文采用Python语言基于正则表达式对DBC文件进行识别读取. 其中关键匹配信息”BU_: (.*)”是匹配网络节点; “BO_ (.*?) (.*?): (.*?) (.*)”是匹配消息、帧ID、消息名、数据长度的模板; ”SG_ (.*?) : (.*?)\|(.*?)@(.*?)\((.*?),(.*?)\)\[(.*?)\|(.*?)\]" (.*?)" (.*)”; 匹配消息下的信号内容. 根据以上关键的匹配语句, 读取DBC文件的关键信息来解析采集的CAN报文.
CAN报文是指发送单元向接收单元传送数据帧. 通常所说的CAN报文是指在CAN线上利用ECU和CAN卡接收到的十六进制报文. 接收到的CAN报文由很多部分组成, 但解析时主要用到的是帧ID和数据两部分. 帧ID实际上是由29位标识符转换得到的, 目前的通信协议中都直接给出了对应的帧ID, 不需要再做转换. 数据一般由8个字节组成, 每个字节由两个字符组成, 读取时要根据字节的顺序读取(Motorola格式或者Inter格式). CAN总线的数据传输规则是首先传输一个字节的高位, 最后传输该字节的低位, 所以当信号不超过一个字节时两种格式解析没有区别, 当发送的信号超过一个字节或跨字节时, 采用Inter格式, 该信号的高位将被放在高字节的高位, 信号的低位将被放在低字节的低位. 这样, 信号的起始位就是低字节的低位. 当采用Motorola格式时, 该信号的高位将被放在低字节的高位, 信号的低位将被放在高字节的低位. 这样, 信号的起始位就是高字节的低位. 例如报文“1827F402 0C 48 0C 3F 00 50 02 B1”中“1827F402”是帧ID, “0C 48 0C 3F 00 50 02 B1”是数据段, 根据DBC文件, 如按照Motorola的格式, 解析时按照16进制就是0x0C48, 而按照Inter格式解析时就是0x480C, 两种解析格式在夸字节时有绝对的区别.
本文在解析时将报文数据段转换为二进制字符串, 即0-63位总共64个字符, 将64个字符串的序号与二进制的位号做一转换, 例如数据段“0C880C670C5D0C60”转换为二进制字符串后为0000110010001000000011000110011100001100010111010000110001100000解析时根据DBC文件中的起始位和数据长度, 将数据的起始位转换成二进制字符串的起始位, 如果是Motorola格式则根据转换后的字符串起始位指直接取数据长度对应的字符长度便能得到需要的数据. 如果是Inter格式只需要将二进制字符串前后顺序颠倒即可. 这样使解析报文更加快捷. CAN报文解析流程图如图3所示.
3 实例验证
开路电压是电池组评判电池一致性的参数之一, 根据各单体电压的差值大小, 可以判断电池组的一致性优劣, 并且在必要时对电池组进行均衡操作.
实验采用24串磷酸铁锂电池组进行充放电实验, 在实验开始之前能够测到各单体电池的开路电压情况, 根据各单体电池开路电压的大小, 可以评估电池组一致性. 如图4中箱型图所示, 箱型图能够显示一组数据分散情况, 提供了识别异常值的一个标准, 根据CAN报文中解析到的单体电池数据可以看到大部分电池均分布在3200 mV上下, 有两个电池属于异常值, 需要做进一步处理. 其他单体电池一致性相对较好.
4 结论
本文采用MCP2515芯片设计了树莓派扩展板, 能够实现BMS的CAN报文采集, 并用其采集到的CAN报文, 按照格式生成报文文件. 根据协议的DBC文件, 对采集得到的CAN报文进行解析. 解析系统将CAN报文的数据段转换成二进制字符, 根据DBC文件的编码类型, 按Motorola格式和Inter格式对数据进行翻译, 使得报文解析更加准确快速. 同时, 根据DBC文件格式统一固定这一特点, 写出了DBC文件关键信息的正则表达式匹配模板, 能够任意组合便于筛选报文内容得到需要的信息, 本文所设计的CAN报文采集系统只需要把DBC文件导入树莓派中即可完成对报文的解析, 操作简单便利, 同时也是便携可移动式的CAN报文采集解析系统, 并且在解析后能做简单的计算分析, 对电池的一致性从开路电压等角度做出评估. 由于本文是基于树莓派设计的因此在之后的应用中能够进行二次开发, 对解析数据做更深层次的处理, 从更多的方面对电池组的性能做出诊断和预测, 具有重大应用价值.
致谢感谢企业导师郑小鹿教授在本文工作中技术上的指导, 研究过程中的支持和帮助!
[1] |
黄赛杰, 徐敏, 郑小鹿, 等. 动力电池充放电检测系统的设计与实现. 储能科学与技术, 2019, 8(1): 146-154. DOI:10.12028/j.issn.2095-4239.2018.0119 |
[2] |
江永聪. 基于DBC的汽车CAN报文远程采集与分析系统设计. 电子技术与软件工程, 2014(14): 203-204. |
[3] |
陈琪晟. 基于DSP的CAN总线通信程序. 铁路通信信号工程技术, 2015, 12(2): 43-48. DOI:10.3969/j.issn.1673-4440.2015.02.012 |
[4] |
马喜平. 基于CAN总线汽车制动蹄片磨损传感器的研究[硕士学位论文]. 哈尔滨: 哈尔滨工业大学, 2006.
|
[5] |
张军. 基于CANoe软件的电动汽车CAN总线测试系统的研究. 传动技术, 2012, 26(3): 10-13, 42. DOI:10.3969/j.issn.1006-8244.2012.03.002 |
[6] |
Davis RI, Burns A, Bril RJ, et al. Controller Area Network (CAN) schedulability analysis: Refuted, revisited and revised. Real-Time Systems, 2007, 35(3): 239-272. DOI:10.1007/s11241-007-9012-7 |