| CAN ID (标准帧) | 报文名称 | 优先级 | 典型周期 | 数据内容 |
|---|---|---|---|---|
| 0x180 | BMS_Status1 | 高 | 100 ms | 总电压、电流、SOC、故障标志 |
| 0x280 | BMS_CellVoltage | 中 | 200 ms | 单体电压组 (第1-4节) |
| 0x380 | BMS_Temperature | 中 | 500 ms | 最高/最低温度、传感器值 |
| 0x480 | BMS_Alarm | 极高 | 50 ms (事件触发) | 过压、欠压、过温、绝缘故障 |
| 0x580 | BMS_Config | 低 | 1000 ms | 均衡状态、容量、参数版本 |
| 特性 | Intel (小端) | Motorola (大端) |
|---|---|---|
| 字节序 | 低字节在前 | 高字节在前 |
| 信号起始位 | LSB位起始 | MSB位起始 |
| BMS常用 | 电压、电流、SOC | 温度、状态标志 |
| 示例 (16位) | 0x12 0x34 → 0x3412 | 0x12 0x34 → 0x1234 |
💡 实战口诀: “Intel 低前高后,Motorola 高前低后;解析电压用Intel,温度报警用Motorola”
DBC (CAN数据库) 定义报文ID、信号、起始位、长度、精度和偏移。以下为BMS典型DBC片段:
// BMS_CAN.dbc (片段)
BO_ 384 BMS_Status1: 8 BMS
SG_ TotalVoltage : 0|16@1- (0.1,0) [0|800] "V" BMS
SG_ Current : 16|16@1- (0.05,-1000) [-1000|1000] "A" BMS
SG_ SOC : 32|8@1+ (1,0) [0|100] "%" BMS
BO_ 640 BMS_CellVoltage: 8 BMS
SG_ Cell1 : 0|16@1- (0.001,0) [0|5] "V" BMS
SG_ Cell2 : 16|16@1- (0.001,0) [0|5] "V" BMS
SG_ Cell3 : 32|16@1- (0.001,0) [0|5] "V" BMS
SG_ Cell4 : 48|16@1- (0.001,0) [0|5] "V" BMS
🔍 解析步骤:
物理值 = 原始值 × 精度 + 偏移 (Intel/Motorola 自动转换)。▲ DBC解析流程:从原始CAN报文到工程物理值
原始报文 (hex): 0x280 [ 0x34 0x12 0x9A 0x2B 0xE8 0x03 0x00 0x00 ]
| 信号 | 起始位 | 长度 | 格式 | 原始值 | 物理值 (精度0.001V) |
|---|---|---|---|---|---|
| Cell1 | 0 | 16 | Intel | 0x1234 | 0x1234 * 0.001 = 4.660 V |
| Cell2 | 16 | 16 | Intel | 0x2B9A | 0x2B9A * 0.001 = 11.162 V |
| Cell3 | 32 | 16 | Intel | 0x03E8 | 0x03E8 * 0.001 = 1.000 V |
| Cell4 | 48 | 16 | Intel | 0x0000 | 0.000 V (未连接) |
// Python 解析示例 (使用DBC或手动) can_id = 0x280 data = [0x34, 0x12, 0x9A, 0x2B, 0xE8, 0x03, 0x00, 0x00] # Intel 小端: 低字节在前 cell1_raw = data[0] | (data[1] << 8) # 0x1234 cell2_raw = data[2] | (data[3] << 8) # 0x2B9A cell3_raw = data[4] | (data[5] << 8) # 0x03E8 cell4_raw = data[6] | (data[7] << 8) # 0x0000 print(f"Cell1: {cell1_raw*0.001:.3f} V") # 4.660 V