Python中canmatrix解析dbc文件应用常见示例

 更新时间:2024年08月16日 08:36:42   作者:kook 1995  
DBC是一种用于描述CAN网络协议的文件格式,Python作为一种流行的编程语言,也提供了解析DBC文件的相关类库,这篇文章主要给大家介绍了关于Python中canmatrix解析dbc文件的相关资料,需要的朋友可以参考下

前言

dbc文件是汽车行业常见的数据库文件,用于描述CAN总线数据的物理值、单位、发送周期、计算公式、信号名称等信息。

用Python处理dbc文件的库有很多,比如 python-can,cantools和canmatrix,甚至可以用正则表达式自行进行解析。其解析本质差不多,下面分享下canmatrix常用的一些方法。

1. 相关库安装

canmatrix使用时直接"import canmatrix"即可,但是会打印出一些 "xxx is not supported"的提示信息,这是使用到的库没安装导致的。
在.\canmatrix\formats路径下有很多 xxx.py文件,这些文件用于解析相对应后缀名的文件。打开"xxx is not supported"对应的.py,安装文件中用到(import)的三方库即可。

2. dbc和Excel格式互转

安装canmatrix后,在\Python\PythonXX\Scripts路径下,会有一个canconvert.exe。可以直接在命令行中:

  • 输入"canconvert xxx.dbc xxx.xlsx"将dbc转成xlsx格式。(表格中一些单元格中的字体是透明的,可以全选改成黑色。)

  • 输入"canconvert xxx.xls xxx.dbc"将xls转成dbc格式。(不支持xlsx格式,可先将xlsx导出为xls格式)

也可以用canmatrix.convert py脚本,比如:

from canmatrix import convert

convert.convert(
    r'aa.dbc',
    r'aa.xlsx'
)

canconvert导入导出的表格是有固定格式的,常用于临时查看dbc中的报文和信号。一般公司会有matrix特定的表格格式,这就需要特定处理了。

3. 读取dbc文件

3.1 matrix信息

import canmatrix
file = r'Test.dbc'
dbs = canmatrix.formats.loadp(file)
print(type(dbs), dbs)
  • canmatrix.formats.loadp(file)用于load不同格式的文件。打印其信息,是一个字典类型。

matrix = dbs.get('')
print(type(matrix), matrix)
for k, v in matrix.__dict__.items():
    print(k, v)
  • 获取字典中的value,其类型是CanMatrix,dbc中的信息都在这里。打印其中包含的信息,如下图所示:

3.2 Ecu信息

for ecu in matrix.ecus:
    print(type(ecu), ecu.__dict__)
  • matrix.ecus包含了dbc中所有的ecu节点,信息如下:

3.3 Message(Frame)信息

for msg in matrix.frames:
    print(type(msg), msg.__dict__)
    for k, v in msg.__dict__.items():
        print(k, v)
  • 报文的信息的类型是Frame,参考图中打印的信息,一般用到:
    • name:报文的名称
    • arbitration_id.id:报文的id
    • transmitters:发送报文节点(发送节点只会有一个)
    • receivers:接收报文的节点
    • signals:报文中的信号
    • signalGroups:报文中的signalGroups
    • cycle_time:报文周期

一些其他信息会在attributes 字典中,比如Nm或者诊断报文。如果有其他信息想知道,可以用类似方式打印其.__dict__查看。

3.4 signal信息

    for signal in msg.signals:
        print(type(signal), signal.__dict__)
        for k, v in signal.__dict__.items():
            print(k, v)
  • signal的信息参考图中打印的内容,一般用到:
    • name:信号名称
    • start_bit:在layout中的起始位
    • size:长度(bit)
    • is_little_endian:Motorola(Big)和Intel(Little)格式
    • is_signed:有无符号
    • offset和factor:偏移和系数,用于转换成物理值
    • min和max:最小值和最大值
    • is_multiplexer:多路复用信号的multiplexor signal
    • mux_val:multiplex value
    • multiplex:和is_multiplexer、mux_val两个量信息是重复的。当信号是multiplexor signal时,这个量是字符串“Multiplexor”;当信号是multiplexed signal时,这个量是multiplex value。

3.5 signalGroup信息

    for signalGroup in msg.signalGroups:
        print(type(signalGroup), signalGroup.__dict__)
        for k, v in signalGroup.__dict__.items():
            print(k, v)
  • signalGroup中主要包含信号的信息,其中的信号也包含在Frame中,注意避免信号重复使用。

4. 常见应用示例

以下示例都是应用于vector的达芬奇开发工具,其他工具不清楚是否适用。用到的场景基本都是读取dbc中的报文和信号名称,再做一些其他处理。

4.1 ComCbk回调函数添加

一般E2E信号的名称是有特定字符的,可判断其名称来确定所在报文是否为E2E报文。再结合xml解析脚本,可以在ComCbk中自动添加回调函数的名称。

def is_signal_e2e(signal: canmatrix.Signal):
    """
    判断信号是否是E2E信号,checksum or rolling_counter
    """
    RCs = ("RollCnt", "RollingCounter", "AliveCounter", "Rolling_Counter", "Alive_Counter", "RollgCnt")
    CRCs = ("Chksum", "Chksm", "CheckSum", "CRC")
    for rc in RCs:
        if rc.lower() in signal.name.lower():
            return True
    for crc in CRCs:
        if crc.lower() in signal.name.lower():
            return True
    return False

4.2 Can_Wrapper模块arxml或者代码生成

一般在项目中,ASW和com之间会有一个中间模块(Can_Wrapper)进行数据的映射。这个模块和com之间的delegation接口可根据读取dbc自动生成。达芬奇Developer也可以批量自动创建,但和ASW的接口就得手动创建了。所以这里提下生成Can_Wrapper过程中和dbc有关的部分。接口的名称可以根据信号名再加一些特定格式,数据类型按照信号size和is_signed等定义计算出。示例代码如下:

def get_signal_dataType(signal: canmatrix.Signal):
    """
    计算信号生成代码的数据类型。
    """
    dataType = "UnknownType "
    if signal.is_float is True:
        if signal.size == 32:
            dataType = "float32"
        elif signal.size == 64:
            dataType = "float64"
        else:
            print(f"Not supported <{signal.size}> size of <float> data type. <{signal.__dict__}>")
    elif (signal.factor != 1) or (signal.offset != 0):
        dataType = "float32"
    elif signal.size == 1:
        dataType = "boolean"
    elif signal.size <= 8:
        if signal.is_signed:
            dataType = "sint8"
        else:
            dataType = "uint8"
    elif signal.size <= 16:
        if signal.is_signed:
            dataType = "sint16"
        else:
            dataType = "uint16"
    elif signal.size <= 32:
        if signal.is_signed:
            dataType = "sint32"
        else:
            dataType = "uint32"
    elif signal.size <= 64:
        if signal.is_signed:
            dataType = "sint64"
        else:
            dataType = "uint64"
    else:
        print(f"Unexpected datatype of signal. <{signal.__dict__}>")
    return f"{dataType}"

总结

canmatrix不仅可以读取数据库文件,也可以写入,个人感觉还是比较好用的。当然其中也存在一些bug,在使用中慢慢探索并规避吧。 ^_^

到此这篇关于Python中canmatrix解析dbc文件应用的文章就介绍到这了,更多相关Python canmatrix解析dbc文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python操作mysql数据库实现增删查改功能的方法

    Python操作mysql数据库实现增删查改功能的方法

    这篇文章主要介绍了Python操作mysql数据库实现增删查改功能的方法,涉及Python针对mysql数据库的连接、增删改查等相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • python MysqlDb模块安装及其使用详解

    python MysqlDb模块安装及其使用详解

    本篇文章主要介绍了python MysqlDb模块安装及其使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • 深入了解如何基于Python读写Kafka

    深入了解如何基于Python读写Kafka

    这篇文章主要介绍了深入了解如何基于Python读写Kafka,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Python判断远程服务器上Excel文件是否被人打开的方法

    Python判断远程服务器上Excel文件是否被人打开的方法

    这篇文章主要介绍了Python如何判断远程服务器上Excel文件是否被人打开,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Ubuntu安装PySide6开发桌面应用实践

    Ubuntu安装PySide6开发桌面应用实践

    文章介绍了在Ubuntu非桌面端安装PySide6并使用WSL2在Windows上开发Python桌面应用的全过程,首先,通过wS安装基础工具并用使用pip安装PySide6,接着,在WindowsD安装VSCode并配置WSL支持支持GUI显示,最后D在WSL中开发Python桌面应用
    2026-04-04
  • Django中的AutoField字段使用

    Django中的AutoField字段使用

    这篇文章主要介绍了Django中的AutoField字段使用,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Python中根据时间自动创建文件夹的代码实现

    Python中根据时间自动创建文件夹的代码实现

    这篇文章主要介绍了Python中根据时间自动创建文件夹的代码实现,这样的话给工作带来极大的便利,方便桌面文件按时间存放,具体实例代码跟随小编一起看看吧
    2021-10-10
  • 将python脚本打包进docker的完整步骤记录

    将python脚本打包进docker的完整步骤记录

    Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,这篇文章主要介绍了将python脚本打包进docker的相关资料,需要的朋友可以参考下
    2025-09-09
  • Python实现的Excel文件读写类

    Python实现的Excel文件读写类

    这篇文章主要介绍了Python实现的Excel文件读写类,涉及Python针对Excel常见的读写、打印等操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 如何在Python中编写并发程序

    如何在Python中编写并发程序

    让计算机程序并发的运行是一个经常被讨论的话题,今天我想讨论一下Python下的各种并发方式。
    2016-02-02

最新评论