将can日志数据提取到excle中
一、目标:
读取.blf文件,
提取信号can::HAP_FD1::BrkDistance
并按照20ms的帧率存储到excle中
二、安装python库和依赖
1.所需的库
1)can
2)pandas
3)cantools
4)openpyxl
2.在PyCharm中通过图形界面安装:
1)打开PyCharm
2)点击 File > Settings > Project: [你的项目名] > Python Interpreter
3)点击右上角的 + 按钮
4)搜索 cantools
5)选中后点击 Install Package
6)显示 安装成功 即可。
三、python编码
1.通过dbc解析blf文件提取数据
import can
import pandas as pd
from can import BLFReader
import cantoolsdef extract_brake_distance_with_dbc(blf_file_path, dbc_file_path, output_excel_path):"""使用DBC文件从BLF中提取刹车距离信号(Motorola格式):param blf_file_path: BLF文件路径:param dbc_file_path: DBC文件路径:param output_excel_path: 输出Excel路径"""# 加载DBC数据库db = cantools.database.load_file(dbc_file_path)data = []previous_timestamp = Nonetry:with BLFReader(blf_file_path) as reader:for msg in reader:# 只处理HAP_FD1报文(假设已知其CAN ID)if msg.arbitration_id == db.get_message_by_name('HAP_FD1').frame_id:# 解码整个报文decoded = db.decode_message(msg.arbitration_id, msg.data)# 20ms采样控制if previous_timestamp is None or (msg.timestamp - previous_timestamp) >= 0.02:data.append({'Timestamp': msg.timestamp,'BrakeDistance': decoded['APS_ESP_BrkDistance']})previous_timestamp = msg.timestamp# 保存到Exceldf = pd.DataFrame(data)df.to_excel(output_excel_path, index=False)print(f"刹车距离数据已保存到 {output_excel_path}")except Exception as e:print(f"处理过程中发生错误: {str(e)}")if __name__ == "__main__":# 文件路径配置input_blf = "test.blf" # 替换为你的BLF文件dbc_file = "test.dbc" # 替换为你的DBC文件output_xlsx = "brake_distance.xlsx"extract_brake_distance_with_dbc(input_blf, dbc_file, output_xlsx)
2.通过信号字节序列 提取数据
信号 BrkDistance 所在报文ID=0x123
BrkDistance信号在报文中位于20、21字节,起始位20字节的0位,字节长度12位
字节序列是motorola格式
import can
import pandas as pd
from can import BLFReader
import cantoolsdef extract_brake_distance_manual(blf_file_path, output_excel_path):data = []previous_timestamp = Nonetry:with BLFReader(blf_file_path) as reader:for msg in reader:if msg.arbitration_id == 0x123: # 替换为HAP_FD1的实际CAN ID# Motorola格式解析 (起始字节20,位0,长度12位)byte20 = msg.data[20]byte21 = msg.data[21]# 合并两个字节并提取12位信号combined = (byte20 << 8) | byte21brake_distance = (combined >> 4) & 0xFFF # 取12位if previous_timestamp is None or (msg.timestamp - previous_timestamp) >= 0.02:data.append({'Timestamp': msg.timestamp,'BrakeDistance': brake_distance})previous_timestamp = msg.timestampdf = pd.DataFrame(data)df.to_excel(output_excel_path, index=False)print(f"数据已保存到 {output_excel_path}")except Exception as e:print(f"发生错误: {str(e)}")