解码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如何在导入到Google工作表时使用ApachePOI显示系列标签   java在Swing表上修改数据生成SQL   java TCP数据包在网络级别合并   java自动连线bean在线程位置为空   javasocket。禁用无线连接时getOutputStream()阻塞   JSON上的javascript字符串数组。stringify输出unicode字符   java在Oracle数据库中存储不同类型数据的最佳体验   Spring MVC中模板引擎后的java进程输出   不知从哪里来的java空字符串。   如何加载java。使用Adobe Flex的客户端的属性文件?   java如何替换多层括号之间的所有内容?   {JSONObject必须以java'开头   java使用commandButton或commandLink返回并管理HTML控件值   java Android大文本视图动态   java JMock需要自定义类   java Android应用程序在emulator中工作,但在设备中失败   java连接到derby数据库时使用什么文件路径格式?   java在一个函数调用中返回两个结果?