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)
#解析出来后信号的起始位实际是信号的停止位,需要二次开发再转换一下
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐