文章目录
- 一、项目背景:从两根未知通信线开始
- 二、通信协议分析
- 串口参数(⭐)
- 主要寄存器定义
- 读取主参数的标准命令
- 读取时钟字段组(0x06D6)
- 三、485转换CAN
- 四、免责声明
一、项目背景:从两根未知通信线开始
近期在一个工业车辆项目中,遇到了一套益佳通电池管理系统(BMS)。
车辆原有的电量显示屏通过两根通信线直接连接电池,可以实时显示SOC、电池电压、电流以及温度等信息。
由于项目需要将电池数据接入整车控制器(VCU),而现场缺少完整的通信协议资料,因此尝试通过通信分析的方式完成电池数据读取与适配。
二、通信协议分析
初期无法确定两根通信线采用的具体协议,需要从硬件接口、电气特性以及实际通信数据入手进行排查。
经过多次测试,最终确认该电池采用RS485通信接口,应用层使用Modbus RTU协议。
在此基础上,通过分析设备正常运行时的通信数据,逐步完成了电池核心参数的识别与解析。
串口参数(⭐)
| 项目 | 实测参数 |
|---|---|
| 物理层 | 两线半双工 RS485(A/B) |
| 波特率 | 9600 bit/s |
| 数据位 | 8 |
| 校验位 | 无(none) |
| 停止位 | 1 |
| 从站地址 | 0x01 |
| 功能码 | 0x04 读取输入寄存器;0x02 读取离散输入 |
| CRC校验 | CRC-16/Modbus;初值0xFFFF,多项式0xA001;CRC低字节先发送 |
| 通信拓扑 | 显示屏为主站,电池BMS为从站 |
主要寄存器定义
| 寄存器 | 含义 | 数据格式 | 换算系数 | 抓包例子 |
|---|---|---|---|---|
| 0x041A | 总电压 | uint16 | 0.1 | 03 33 → 819 → 81.9 V |
| 0x041B | 总电流 | int16 | 0.1 | FF FA → -6 → -0.6 A |
| 0x041C | SOC | uint16 | 0.1 | 01 58 → 344 → 34.4 % |
读取主参数的标准命令
主站请求: 01 04 04 1A 00 06 50 FF
BMS应答 : 01 04 0C 03 33 FF FA 01 58 03 E8 80 00 00 00 7F 4D
寄存器数据依次为:03 33 | FF FA | 01 58 | 03 E8 | 80 00 | 00 00。
0x041A = 0x0333 = 819,电压 = 81.9 V。
0x041B = 0xFFFA = -6(int16),电流 = -0.6 A;本次实测负值对应放电,正值充电符号尚未专门实测。
0x041C = 0x0158 = 344,SOC = 34.4%。
读取时钟字段组(0x06D6)
查询:01 04 06 D6 00 06 91 78
应答:01 04 0C 07 EA 00 0A 00 18 00 0D 00 30 00 1C DC C1
年月日时分秒
该应答前六个寄存器依次为2026(07 EA)、(00 0A)10、(00 18)24、(00 0D)13、(00 30)48、(00 1C)28。
三、485转换CAN
有两个方案
- 购买485-CAN设备进行数据透传。(简单但是自由度低)
- ECU支持485和CAN自己通过代码实现(复杂但自由度高)
四、免责声明
本文仅用于技术研究、工程经验分享及技术交流,不代表相关设备制造商的官方立场或授权。
文中涉及的通信协议分析结果均基于实际测试,不代表设备厂商发布的官方技术规范。相关品牌名称及商标归其合法权利人所有。
本文不提供完整通信协议、设备专有技术资料及具体工程源码。
涉及BMS、整车控制及其他安全相关设备的开发,应在合法授权及符合电气安全要求的前提下进行,并经过充分测试验证。
未经充分验证的技术方案,不应直接应用于量产车辆或安全关键控制系统。