import cantools import pandas as pd def dbc_to_csv(dbc_file, csv_file): # 加载DBC文件 db = cantools.database.load_file(dbc_file) # 准备数据 messages = [] signals = [] nodes = [] buses = [] # 解析messages for message in db.messages: messages.append({ 'name': message.name, 'id': message.frame_id, 'size': message.length, # 'sender': message.sender, # 'description': message.description }) # 解析signals for message in db.messages: for signal in message.signals: signals.append({ 'message_name': message.name, 'signal_name': signal.name, 'start_bit': signal.start, 'length': signal.length, # 'factor': signal.factor, 'offset': signal.offset, 'min': signal.minimum, 'max': signal.maximum, 'unit': signal.unit, 'scale': signal.scale, 'is_signed': signal.is_signed, # 'description': signal.description }) # 解析nodes for node in db.nodes: nodes.append({ 'name': node.name, # 'address': node.address }) # 解析buses for bus in db.buses: buses.append({ 'name': bus.name, # 'speed': bus.speed }) # 转换为DataFrame并导出为CSV messages_df = pd.DataFrame(messages) signals_df = pd.DataFrame(signals) nodes_df = pd.DataFrame(nodes) buses_df = pd.DataFrame(buses) with pd.ExcelWriter(csv_file.replace('.csv', '.xlsx'), engine='openpyxl') as writer: # messages_df.to_csv(csv_file.replace('.csv', '_messages.csv'), index=False) # signals_df.to_csv(csv_file.replace('.csv', '_signals.csv'), index=False) # nodes_df.to_csv(csv_file.replace('.csv', '_nodes.csv'), index=False) # buses_df.to_csv(csv_file.replace('.csv', '_buses.csv'), index=False) # 如果需要保存为单个Excel文件,可以取消以下注释,并注释掉上面的to_csv行 messages_df.to_excel(writer, sheet_name='Messages', index=False) signals_df.to_excel(writer, sheet_name='Signals', index=False) nodes_df.to_excel(writer, sheet_name='Nodes', index=False) buses_df.to_excel(writer, sheet_name='Buses', index=False) # 使用示例 dbc_file = 'E11OTA20241120_Matrix_BSCAN.dbc' csv_file = 'output_file.xlsx' dbc_to_csv(dbc_file, csv_file) #解析出来后信号的起始位实际是信号的停止位,需要二次开发再转换一下
06-16
5027
