如何用Kvaser数据库(kvadblib)和Python管理DBC数据库
2021-04-08 09:49阅读:
- 在Python里处理CAN数据库
- 发送和接收数据库信号
随着CANlib SDK软件开发包v5.22的发布, 数据库(kvaDbLib) 性能增强,同时Python canlib
包装函数包(v1.5) 通过kvadblib 模块加强了对数据处理的支持。此 kvaDbLib数据库是用来生成,书写,读取和修改DBC
数据库
先介绍怎样用Python canlib包装函数包生成和检验一个DBC 数据库。 这个Python
canlib包是以Python Wheel文件发布的,以便 using pip
install安装
生成一个数据库
我们需要一个数据库来把原始 CAN 数据转换为人工可读信号。在本范例中我们使用一个假设的汽车数据库。
让我们先从头开始生成数据。首先,我们从canlib
python包引进kvadblib,生成一个名为“Histogram”
[3]
的数据库, 加上一个标识符为id “402”报文, dlc “8” 并命名此报文为 “LIM_002”。
fro
m canlib
import kvadblib
# 生成一个数据库
db = kvadblib
.Dbc(name
=’Histogram
’
) # 加上报文 message
=
db.new_message
(name
=’LIM_002’
, id
=402,
dlc
=8)
View sourceCopy to clipboard
下一步是在我们刚刚生成的报文上加一个信号。让我们加一个名为“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
. ’ )
View sourceCopy to clipboard
在生成一个信号时,我们要限定很多方面的信息,现在我们来快速看一下这些选项:
名字给此信号一个特别的字串。这个名字必须是在整个数据库里独一无二的。
类型此信号可被设为
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) ,
unit=’ Celsius ’ ,
comment=’System temperature consumption .
’ ) message =
db.new_message(name=’ECM_001’
, id=501,
dlc=8) message
.
new_signal(name=’EngineSpeed ’
, type=kvadblib . SignalType
.UNSIGNED, size=kvadblib
. ValueSize(
startbit=0,
length=32) ,
limits=kvadblib .
ValueLimits(min=0,
max=6000) ,
unit=’rpm’ ,
comment=’Current engine speed . ’
)
View sourceCopy to clipboard
最后一步是把我们的新数据库存到一个文件里并关上它。
# 写数据库文件
db. write_file (
’db_histogram . dbc ’ )
db. close
()
View sourceCopy to clipboard
检测我们的数据库
让我们来看一下我们刚刚生成的DBC 数据库。我们从Python书写内容开始:
import textwrap
from canlib import kvadblib
with kvadblib
.Dbc(
filename=’db_histogram . dbc
’ ) as db:
print (db)
for message in
db: print ( ’
{} ’ .
format(message) )
for signal in message :
print (textwrap .
f i l l ( ’ {}
’ . format( signal )
,
80))
View sourceCopy to clipboard
使用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),
scaling=ValueScaling(factor=1.0, offset=0.0),
limits=ValueLimits(min=0.0, max=100.0), unit=’metric ton’,
comment=’Measured load 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 fuel consumption.’) 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=’System temperature 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 engine speed.’)
希望这里不要有什么不正常,所以让我们看一下我们的数据库在Kvaser 数据库编辑器里是怎么样。

图1:在Kvaser 数据库编辑器里看我们的数据库。
在Kvaser数据库编辑器的中间框里,我们能看到4个已定义的报文。在图1中1,
报文“LIM_002”被选择,该报文的内容显示在此报文下面。在我们的例子里,有一个名为“Load”的信号,它的单位unit被设为“metric
ton”。在右边的方框中,当前报文的数据bits以一个布局(有阴影的格子)显示。 在图中
1,
我们能看到被选中的信号是从第一个byte 的bit 0 到第三个byte的bit 7,
这和开始位置0和给出的长度32相对应。