解码CAN日志文件的实用程序

can-decoder的Python项目详细描述


CAN解码器-DBC解码CAN总线数据

这个包允许DBC将原始CAN数据从CANedge解码为Python中人类可读的形式(物理值)。在


主要功能

1. Easily decode raw CAN bus data via DBC files
2. Support for regular CAN, OBD2 and J1939
3. Very fast data conversion and minimal external dependencies
4. Output to pandas dataframe for easy use of the data
5. Conversion can be done iteratively (from iterator) or in bulk (from DataFrame) 
6. Can be used together with our mdf_iter and canedge_browser

安装

使用pip安装can_decoder模块:

^{pr2}$

(可选)安装canmatrixpandas以加载DBC文件并启用熊猫数据帧的转换:

pip install canmatrix pandas

依赖性

  • numpy(必需)
  • canmatrix(可选)
  • pandas(可选)

模块使用示例

下面我们通过mdf_iter加载一个日志文件,并使用can_decoder对其进行DBC解码:

import can_decoder
import mdf_iter

mdf_path = "00000001.MF4"
dbc_path = "j1939.dbc"

dbc_file = can_decoder.load_dbc(dbc_path)
df_decoder = can_decoder.DataFrameDecoder(dbc_file)

with open(mdf_path, "rb") as handle:
    mdf_file = mdf_iter.MdfFile(handle)
    df_raw = mdf_file.get_data_frame()

df_phys = df_decoder.decoder_frame(df_raw)
print(df_phys)

回购中还包括更多的例子。在


文档

提供解码规则

数据解码是基于一组信号,这些信号可以在帧中组合在一起。这些帧依次分组在一个数据库中。规则列表可以手工创建,使用原语SignalFrame和{}-或者从DBC文件生成。在

来自DBC文件

{cda>如果安装了DBC>库中的规则^,则可以从库中加载规则:

dbc_file = can_decoder.load_dbc(dbc_path)

默认情况下,输出将通过信号名称(例如EngineSpeed)来区分信号。通过提供可选的use_custom_attribute关键字,可以从主信号名切换到DBC文件中的另一个signal属性。它采用字符串的形式,例如可用于选择SPN,而不是J1939 DBC文件中的信号名称。如果未找到有效的属性,则返回名称。在

dbc_file = can_decoder.load_dbc(dbc_path, use_custom_attribute="SPN")

数据转换

库支持两种解码数据的方法:

  • 迭代地
  • 散装
数据转换(迭代器)

对于迭代解码(逐帧),库使用IteratorDecoder类。这个类接受一组转换规则(例如从DBC文件)和一个iterable对象(例如MDF文件):

decoder = can_decoder.IteratorDecoder(mdf_file, dbc_file)

for record in decoder:
    ...

此方法需要类似mdf_iter的迭代器结构,包括以下字段:

  • ID-指定11位或29位CAN ID的整数
  • IDE-布尔值,指定记录是使用常规的11位标识还是扩展的29位标识
  • DataBytes-按数据字节在CAN总线上出现的顺序排列。在
  • TimeStamp-一个浮点数,表示历元以来经过的秒数

如果从一个ID定义了多个信号,库迭代器将在内部对它们进行排队,从而推迟对更多数据的请求,直到迭代器中的所有信号都被消耗掉。在

输出的格式为decoded_signal,它是一个namedtuple,包含以下字段:

  • TimeStamp-记录的时间戳为常规Python datetime
  • CanID-发送帧中的CAN ID
  • Signal-解码信号的名称
  • SignalValueRaw-解码信号的原始值
  • SignalValuePhysical-解码信号的物理值

数据转换(数据帧)

对于消息的批转换,库使用DataFrameDecoder类。这是用转换规则作为参数构造的,可以从同一组参数中多次重复使用:

df_decoder = can_decoder.DataFrameDecoder(dbc_file)

df_phys_1 = df_decoder.decoder_frame(df_raw_1)
df_phys_2 = df_decoder.decoder_frame(df_raw_2)

提供的数据应该类似于迭代器方法的数据,但是作为一个数据帧。另请参见初始示例。与迭代器组件不同,此方法不需要存在时间戳条目。相反,传递给解码器的数据帧的索引将用作结果数据帧中的索引。在

输出是一个与输入数据帧具有相同索引的数据帧,包含与加载的DBC文件匹配的帧的解码结果。在

数据帧输出列

输出中的可用信号取决于转换类型。对于通用CAN数据(包括OBD2),包括以下输出列:

  • CAN ID-帧的CAN ID,扩展标志设为最高有效位
  • Signal-信号名称字符串
  • Raw Value-解码时用作输入的原始值
  • Physical Value-物理值(缩放和偏移校正后)

使用J1939 DBC解码数据时,输出包括以下额外列:

  • PGN-CAN框架的PGN
  • Source Address-数据源
  • Signal-信号名

要从输出中删除列,可以使用关键字columns_to_drop

df_phys = df_decoder.decoder_frame(df_raw, columns_to_drop=["CAN ID", "Raw Value"])

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java何时可以运行。toString()是否有可能返回重复的字符串?   使用REST进行Java应用程序登录验证?   java测试onErrorResume()Spring Webflux   java设置一个单元格样式,使数字显示为百分比ApachePOI   java仅替换regex az09   java将字符串附加到文件   java Hibernate:如何在集合中查找对象   当独立客户端为Web服务实例化代理时,java WebSphere会生成ClassNotFoundException   java简单算法。我做不好   java我的代码有什么问题?我想用Android制作一个“cardflip”动画   java如何模拟Springbean及其自动连接的参数?   java在Android中将arraylist对象的某些参数显示到列表视图中   java setOnclickListener(此)错误   java自动连接未按类型连接bean   java如何禁止在Viewpager上滑动?   java代码检查每个if语句吗?   java NIO选择器OP_READ和OP_WRITE,关于处理它们的一些问题   java如何在不锁定文件的情况下获取文件大小   Oculus Rift的Java API?   java是一种选择。仍然需要fork来设置bootClasspath