python解析can报⽂_⽤Python处理CAN数据库
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这是介绍如何⽤Kvaser数据库(kvadblib)和Python管理DBC数据库的⽂章第⼀部分(总计为2部分):
在Python⾥处理CAN数据库
发送和接收数据库信号
随着CANlib SDK软件开发包v5.22的发布, 数据库(kvaDbLib) 性能增强,同时Python canlib 包装函数包(v1.5) 通过kvadblib 模块加强了对数据处理的⽀持。此 kvaDbLib数据库是⽤来⽣成,书写,读取和修改DBC 数据库。[1] 在这第⼀篇博客⾥,我们先介绍怎样⽤Python canlib包装函数包⽣成和检验⼀个DBC 数据库。 这个Python canlib包是以Python Wheel⽂件发布的,以便 using pip install安装。如果你还没安装它,请参阅博客 ‘Python samples are now bundled in a package[2] (Python 范例现在已包含在⼀个软件包⾥)’了解更多这⽅⾯的介绍。
⽣成⼀个数据库
我们需要⼀个数据库来把原始 CAN 数据转换为⼈⼯可读信号。在本范例中我们使⽤⼀个假设的汽车数据库。
让我们先从头开始⽣成数据。⾸先,我们从canlib python包引进kvadblib,⽣成⼀个名为“Histogram”[3] 的数据库, 加上⼀个标识符为id “402”报⽂, dlc “8” 并命名此报⽂为 “LIM_002”。
from canlib import kvadblib# ⽣成⼀个数据库db = kvadblib .Dbc(name=’Histogram ’ )# 加上报⽂message =
下⼀步是在我们刚刚⽣成的报⽂上加⼀个信号。让我们加⼀个名为“Load” 的float (浮标)信号,此信号附带了⼀个单位和评论⽂字。
message . new_signal( name=’Load ’ , type=kvadblib . SignalType .FLOAT, byte_order=kvadblib . SignalByteOrder .INTEL, # 预设值 mode=kvadblib . SignalMultiplexMode .MUX_INDEPENDENT, # 预设值 size=kvadblib . ValueSize( startbit=0,
length=32) , scaling=kvadblib . ValueScaling( factor=1, offset=0) , limits=kvadblib . ValueLimits(min=0, max=100) , unit=’metric ton ’ , comment=’Measured load in system . ’ )
在⽣成⼀个信号时,我们要限定很多⽅⾯的信息,现在我们来快速看⼀下这些选项:
名字给此信号⼀个特别的字串。这个名字必须是在整个数据库⾥独⼀⽆⼆的。
类型此信号可被设为 SIGNED, UNSIGNED, (DOUBLE[4] ), 或 FLOAT。 这个信号也可为列举信号,那样我们就在Python包⾥把信号设为ENUM_SIGNED 或ENUM_UNSIGNED。
模式 The signal byte order can be either INTEL or MOTOROLA, defaults to INTEL.
模式 信号的预设模式是 MUX_INDEPENDENT, 也就是说这是⼀个普通信号。[5] 在⼀个CAN 报⽂中,如果将模式设为 MUX_SIGNAL,⼀个信号也可被定义为数据选择器。现在这个数据选择器在这个报⽂帧⾥选择传输哪个多路数据。此多路数据应被设为它应有的正整数值,这样这个多路数据信号才能被使⽤。kvadblib⽬前只⽀持简单的多路数据。对简单多路传输来说,只有多路数据器信号能在⼀个报⽂⾥被定义,对每个多路数据信号来说,只能定义⼀个多录数据器值。
⼤⼩这个信号的起始位 (⼜称为startbit), 和它的长度,以bit数来度量。
⽐例⽐例有⼀个系数和⼀个调整量。⼀个原始CAN值乘以这个系数,然后再由调整量增值,就被转换为⼀个物理值。
限制此信号的最⼩和最⼤物理值。
单位 ⼀个字串代表这个信号的单位。
注释 ⼀个字串⽤来记录此信号。
让我们以定义另外三个报⽂和信号来完成这个数据库。
message = db.new_message(name=’ECM_004’ , id=504, dlc=8)message . new_signal(name=’Fuel ’ , type=kvadblib . SignalType .FLOAT size=kvadblib . ValueSize( startbit=0, length=32) , limits=kvadblib . ValueLimits(min=0, max=300) ,
unit=’ l /100 km’ , comment=’Current fuel consumption . ’ )message = db.new_message(name=’ECM_003’ ,
id=503, dlc=8)message . new_signal(name=’EngineTemp ’ , type=kvadblib . SignalType .FLOAT, size=kvadblib . ValueSize( startbit=0, length=32) , limits=kvadblib . ValueLimits(min=-60, max=200) ,
最后⼀步是把我们的新数据库存到⼀个⽂件⾥并关上它。
# 写数据库⽂件db. write_file ( ’db_histogram . dbc ’ )db. close ()检测我们的数据库
让我们来看⼀下我们刚刚⽣成的DBC 数据库。我们从Python书写内容开始:
import textwrapfrom canlib import kvadblibwith kvadblib .Dbc( filename=’db_histogram . dbc ’ ) as db: print (db) for message in db: print ( ’\n {} ’ . format(message) ) for signal in message : print (textwrap . f i l l ( ’ {} ’ . format( signal ) , 80))
使⽤textwrap模块来⽣成⼀个简洁的80字宽输出:
Dbc db_histogram: flags:0, protocol:CAN, messages:4 Message(name=’LIM_002’, id=402, flags=, dlc=8, comment=’’) Signal(name=’Load’, type=,byte_order=, mode=-1, size=ValueSize(startbit=0,length=32),
python怎么读取文件中的数据scaling=ValueScaling(factor=1.0, offset=0.0),limits=ValueLimits(min=0.0, max=100.0), unit=’metric ton’,
comment=’Measuredload in system.’) Message(name=’ECM_004’, id=504, flags=, dlc=8, comment=’’)
Signal(name=’Fuel’, type=,byte_order=, mode=-1, size=ValueSize(startbit=0,length=32),
scaling=ValueScaling(factor=1.0, offset=0.0),limits=ValueLimits(min=0.0, max=300.0), unit=’l/100 km’,
comment=’Current fuelconsumption.’) Message(name=’ECM_003’, id=503, flags=, dlc=8, comment=’’)
Signal(name=’EngineTemp’, type=,byte_order=, mode=-1, size=ValueSize(startbit=0,length=32),
scaling=ValueScaling(factor=1.0, offset=0.0),limits=ValueLimits(min=-60.0, max=200.0), unit=’Celsius’,
comment=’Systemtemperature consumption.’) Message(name=’ECM_001’, id=501, flags=, dlc=8, comment=’’) Signal(name=’EngineSpeed’, type=,byte_order=, mode=-1, size=ValueSize(startbit=0,length=32),
scaling=ValueScaling(factor=1.0, offset=0.0),limits=ValueLimits(min=0.0, max=6000.0), unit=’rpm’,
comment=’Current enginespeed.’)
希望这⾥不要有什么不正常,所以让我们看⼀下我们的数据库在Kvaser 数据库编辑器⾥是怎么样。
在Kvaser数据库编辑器的中间框⾥,我们能看到4个已定义的报⽂。在图1中1, 报⽂“LIM_002”被选择,该报⽂的内容显⽰在此报⽂下⾯。在我们的例⼦⾥,有⼀个名为“Load”的信号,它的单位unit被设为“metric ton”。在右边的⽅框中,当前报⽂的数据bits以⼀个布局(有阴影的格⼦)显⽰。 在图中 1, 我们能看到被选中的信号是从第⼀个byte 的bit 0 到第三个byte的bit 7, 这和开始位置0和给出的长度32相对应。
这样我们就结束了此博客的第⼀部分,介绍怎样⽣成⼀个数据库。在下⼀个部分我们将看⼀下在发送
和接收信号时怎样使⽤数据。
注释
1 DBC 数据库描述CAN 总线的属性,各连接节点,和CAN 报⽂及信号。
2如果你看过CANlib SDK 软件开发包的t 范例CANlib SDK,你可能见过这个特别的数据库,因为你可以在⽂件夹folder
Samples\tScript\Learn more\Misc\histogram 那⾥看到它。
3 kvadblib⽬前不⽀持DOUBLE 型信号。
4 我们只在此博客⾥介绍普通(⾮选择数据) 信号。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论