最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中canmatrix解析dbc文件應(yīng)用常見示例

 更新時間:2024年08月16日 08:36:42   作者:kook?1995  
DBC是一種用于描述CAN網(wǎng)絡(luò)協(xié)議的文件格式,Python作為一種流行的編程語言,也提供了解析DBC文件的相關(guān)類庫,這篇文章主要給大家介紹了關(guān)于Python中canmatrix解析dbc文件的相關(guān)資料,需要的朋友可以參考下

前言

dbc文件是汽車行業(yè)常見的數(shù)據(jù)庫文件,用于描述CAN總線數(shù)據(jù)的物理值、單位、發(fā)送周期、計算公式、信號名稱等信息。

用Python處理dbc文件的庫有很多,比如 python-can,cantools和canmatrix,甚至可以用正則表達(dá)式自行進(jìn)行解析。其解析本質(zhì)差不多,下面分享下canmatrix常用的一些方法。

1. 相關(guān)庫安裝

canmatrix使用時直接"import canmatrix"即可,但是會打印出一些 "xxx is not supported"的提示信息,這是使用到的庫沒安裝導(dǎo)致的。
在.\canmatrix\formats路徑下有很多 xxx.py文件,這些文件用于解析相對應(yīng)后綴名的文件。打開"xxx is not supported"對應(yīng)的.py,安裝文件中用到(import)的三方庫即可。

2. dbc和Excel格式互轉(zhuǎn)

安裝canmatrix后,在\Python\PythonXX\Scripts路徑下,會有一個canconvert.exe??梢灾苯釉诿钚兄校?/p>

  • 輸入"canconvert xxx.dbc xxx.xlsx"將dbc轉(zhuǎn)成xlsx格式。(表格中一些單元格中的字體是透明的,可以全選改成黑色。)

  • 輸入"canconvert xxx.xls xxx.dbc"將xls轉(zhuǎn)成dbc格式。(不支持xlsx格式,可先將xlsx導(dǎo)出為xls格式)

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

from canmatrix import convert

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

canconvert導(dǎo)入導(dǎo)出的表格是有固定格式的,常用于臨時查看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節(jié)點,信息如下:

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:發(fā)送報文節(jié)點(發(fā)送節(jié)點只會有一個)
    • receivers:接收報文的節(jié)點
    • 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的信息參考圖中打印的內(nèi)容,一般用到:
    • name:信號名稱
    • start_bit:在layout中的起始位
    • size:長度(bit)
    • is_little_endian:Motorola(Big)和Intel(Little)格式
    • is_signed:有無符號
    • offset和factor:偏移和系數(shù),用于轉(zhuǎn)換成物理值
    • min和max:最小值和最大值
    • is_multiplexer:多路復(fù)用信號的multiplexor signal
    • mux_val:multiplex value
    • multiplex:和is_multiplexer、mux_val兩個量信息是重復(fù)的。當(dāng)信號是multiplexor signal時,這個量是字符串“Multiplexor”;當(dāng)信號是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中,注意避免信號重復(fù)使用。

4. 常見應(yīng)用示例

以下示例都是應(yīng)用于vector的達(dá)芬奇開發(fā)工具,其他工具不清楚是否適用。用到的場景基本都是讀取dbc中的報文和信號名稱,再做一些其他處理。

4.1 ComCbk回調(diào)函數(shù)添加

一般E2E信號的名稱是有特定字符的,可判斷其名稱來確定所在報文是否為E2E報文。再結(jié)合xml解析腳本,可以在ComCbk中自動添加回調(diào)函數(shù)的名稱。

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)進(jìn)行數(shù)據(jù)的映射。這個模塊和com之間的delegation接口可根據(jù)讀取dbc自動生成。達(dá)芬奇Developer也可以批量自動創(chuàng)建,但和ASW的接口就得手動創(chuàng)建了。所以這里提下生成Can_Wrapper過程中和dbc有關(guān)的部分。接口的名稱可以根據(jù)信號名再加一些特定格式,數(shù)據(jù)類型按照信號size和is_signed等定義計算出。示例代碼如下:

def get_signal_dataType(signal: canmatrix.Signal):
    """
    計算信號生成代碼的數(shù)據(jù)類型。
    """
    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}"

總結(jié)

canmatrix不僅可以讀取數(shù)據(jù)庫文件,也可以寫入,個人感覺還是比較好用的。當(dāng)然其中也存在一些bug,在使用中慢慢探索并規(guī)避吧。 ^_^

到此這篇關(guān)于Python中canmatrix解析dbc文件應(yīng)用的文章就介紹到這了,更多相關(guān)Python canmatrix解析dbc文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python操作mysql數(shù)據(jù)庫實現(xiàn)增刪查改功能的方法

    Python操作mysql數(shù)據(jù)庫實現(xiàn)增刪查改功能的方法

    這篇文章主要介紹了Python操作mysql數(shù)據(jù)庫實現(xiàn)增刪查改功能的方法,涉及Python針對mysql數(shù)據(jù)庫的連接、增刪改查等相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • python MysqlDb模塊安裝及其使用詳解

    python MysqlDb模塊安裝及其使用詳解

    本篇文章主要介紹了python MysqlDb模塊安裝及其使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • 深入了解如何基于Python讀寫Kafka

    深入了解如何基于Python讀寫Kafka

    這篇文章主要介紹了深入了解如何基于Python讀寫Kafka,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Python判斷遠(yuǎn)程服務(wù)器上Excel文件是否被人打開的方法

    Python判斷遠(yuǎn)程服務(wù)器上Excel文件是否被人打開的方法

    這篇文章主要介紹了Python如何判斷遠(yuǎn)程服務(wù)器上Excel文件是否被人打開,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Ubuntu安裝PySide6開發(fā)桌面應(yīng)用實踐

    Ubuntu安裝PySide6開發(fā)桌面應(yīng)用實踐

    文章介紹了在Ubuntu非桌面端安裝PySide6并使用WSL2在Windows上開發(fā)Python桌面應(yīng)用的全過程,首先,通過wS安裝基礎(chǔ)工具并用使用pip安裝PySide6,接著,在WindowsD安裝VSCode并配置WSL支持支持GUI顯示,最后D在WSL中開發(fā)Python桌面應(yīng)用
    2026-04-04
  • Django中的AutoField字段使用

    Django中的AutoField字段使用

    這篇文章主要介紹了Django中的AutoField字段使用,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Python中根據(jù)時間自動創(chuàng)建文件夾的代碼實現(xiàn)

    Python中根據(jù)時間自動創(chuàng)建文件夾的代碼實現(xiàn)

    這篇文章主要介紹了Python中根據(jù)時間自動創(chuàng)建文件夾的代碼實現(xiàn),這樣的話給工作帶來極大的便利,方便桌面文件按時間存放,具體實例代碼跟隨小編一起看看吧
    2021-10-10
  • 將python腳本打包進(jìn)docker的完整步驟記錄

    將python腳本打包進(jìn)docker的完整步驟記錄

    Docker是一個開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個可移植的容器中,然后發(fā)布到任何流行的Linux或Windows操作系統(tǒng)的機器上,這篇文章主要介紹了將python腳本打包進(jìn)docker的相關(guān)資料,需要的朋友可以參考下
    2025-09-09
  • Python實現(xiàn)的Excel文件讀寫類

    Python實現(xiàn)的Excel文件讀寫類

    這篇文章主要介紹了Python實現(xiàn)的Excel文件讀寫類,涉及Python針對Excel常見的讀寫、打印等操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 如何在Python中編寫并發(fā)程序

    如何在Python中編寫并發(fā)程序

    讓計算機程序并發(fā)的運行是一個經(jīng)常被討論的話題,今天我想討論一下Python下的各種并發(fā)方式。
    2016-02-02

最新評論

阳泉市| 台东县| 哈巴河县| 通山县| 福清市| 泊头市| 南漳县| 曲周县| 通城县| 疏勒县| 仲巴县| 临汾市| 乐昌市| 台东县| 顺义区| 景洪市| 元朗区| 城市| 平和县| 上栗县| 松滋市| 安溪县| 曲阜市| 余干县| 凤阳县| 馆陶县| 博白县| 武城县| 乌海市| 双牌县| 杭州市| 高陵县| 北京市| 桃江县| 玉林市| 虹口区| 洪洞县| 麻栗坡县| 石阡县| 富锦市| 固原市|