解码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
模块:
(可选)安装canmatrix
和pandas
以加载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)
回购中还包括更多的例子。在
文档
提供解码规则
数据解码是基于一组信号,这些信号可以在帧中组合在一起。这些帧依次分组在一个数据库中。规则列表可以手工创建,使用原语Signal
、Frame
和{
来自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 datetimeCanID
-发送帧中的CAN IDSignal
-解码信号的名称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框架的PGNSource Address
-数据源Signal
-信号名
要从输出中删除列,可以使用关键字columns_to_drop
:
df_phys = df_decoder.decoder_frame(df_raw, columns_to_drop=["CAN ID", "Raw Value"])
- 项目
标签: