基于python解析CAN dbc文件,提取到excel

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值