该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

这是介绍如何用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 = db.new_message(name=’LIM_002’ , id=402, dlc=8)

下一步是在我们刚刚生成的报文上加一个信号。让我们加一个名为“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), 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 我们只在此博客里介绍普通(非选择数据) 信号。

python处理can协议文件_用Python处理CAN数据库相关推荐

  1. python用什么处理文件_利用Python如何快速处理文件

    利用Python如何快速处理文件 我之前要合并将近1000个CSV表格 每个表格共370列,约360行不等,列名相同 三个方案瞬间浮现在我眼前: 1.Ctrl C + Ctrl V--可以睡公司了: ...

  2. python删除指定路径文件_基于python实现删除指定文件类型

    Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语 ...

  3. python读取raw数据文件_【Python】OGR库(1):读取矢量数据

    OGR库是一个非常流行的处理地理空间矢量数据的开源库.它可以读取丰富的数据格式,允许用户进行几何处理.属性表操作.数据分析,是个非常强大的开源GIS库.目前OGR已集成在GDAL库中,可以说是GIS的 ...

  4. python如何播放mp3文件_使用python怎么播放音频

    使用 python 播放音频有以下几种方式: os.system() os.system(file) 调用系统应用来打开文件,file 可为图片或者音频文件. 缺点:要打开具体的应用,不能在后台播放音 ...

  5. python怎么读取word文件_使用python编辑和读取word文档

    python调用word接口主要用到的模板为python-docx,基本操作官方文档有说明. 使用python新建一个word文档,操作就像文档里介绍的那样: 1 from docx importDo ...

  6. python读取raw数据文件_在python下读取并展示raw格式的图片实例

    raw文件可能有些人没有,因此,先用一张图片创建一个raw格式的文件(其实可以是其他类型的格式文件) import numpy as np import cv2 img = cv2.imread('c ...

  7. python怎样导出py文件_导出python模块(到字符串或py文件)

    摘要: 我想要一个'module'类型的变量并导出它.在 我使用import从.py文件导入python模块并对其进行更改.我需要将模块导出回一个文件,或者获取完整模块的字符串表示形式,然后将其写入磁 ...

  8. python autoit上传文件_结合python+selenium使用AutoIt V3实现文件、图片上传

    1.下载.安装AutoIt V3 下载官网:https://www.autoitscript.com/site/autoit/downloads/ 2.AutoIt V3组件介绍 AutoIt Win ...

  9. python读取raw图片文件_在python下读取并展示raw格式的图片实例

    raw文件可能有些人没有,因此,先用一张图片创建一个raw格式的文件(其实可以是其他类型的格式文件) import numpy as np import cv2 img = cv2.imread('c ...

  10. python 模糊匹配ftp文件_使用python实现正则匹配检索远端FTP目录下的文件

    遇到一个问题,需要正则匹配远端FTP目录下的文件,如果使用ftp客户端可以通过命令行很容易的做到这一点,但是暂时没有一个工具支持这样的需求,于是通过python对FTP的支持和对正则表达式的支持,写了 ...

最新文章

  1. python的快速入门-1.1、Python快速入门(0529)
  2. CMake基础 第7节 编译标志
  3. Centos 升级GLIBCXX3.4.25
  4. 科学数据中心资源和用户访问控制体系
  5. asp 文本转时间_三分钟学会在ASP.NET Core MVC 中使用Cookie
  6. Q143:FS,物质导数(Material Derivative)
  7. Makefile中关于all和.PHONY
  8. 【Android】 Android实现录音、播音、录制视频功能
  9. linux 位置参数数组,荐Linux中的shell编程Ⅱ——位置参数、数组、date和cal
  10. Thrift 对象序列化、反序列化-字节数组分析
  11. ubuntu 20.04上配置 QT_ROS的插件
  12. 导入JasperReports坐标时无法下载com.lowagie:itext:jar:2.1.7.js6
  13. 网页监控之自己设计监控界面
  14. 解决双击excel文件打开多个excel.exe进程的问题
  15. sdn主要包含哪些接口_SDN个人理解
  16. 关闭IE浏览器窗口时触发的动作js
  17. android dialog设置背景图片,如何为Dialog设置背景图片?
  18. 默认禁用SMB1协议的Samba 4.11-RC1 发布了
  19. MongoDB4.4版本源码部署分片集群
  20. 史鉴使人明智;诗歌使人巧慧;数学使人精细;博物使人深沉;伦理之学使人庄重;逻辑与修辞使人善辩

热门文章

  1. 时间戳——微信保存视频时发现的问题
  2. unity教程:MMORPG网络游戏如何实现玩家同步
  3. Unity MMORPG游戏的设计(一)前期简单分析
  4. 根据页面结构,用jquery取里面对应的内容 组装成json数据
  5. 算法导论 2-3 霍纳(Horner)规则的正确性
  6. 微信文章如何自动排版
  7. 统一诊断服务(UDS) - 诊断会话控制(Diagnostic Session Control)
  8. 数据结构如何申请一个空间的队列_如何用鞋柜来作为隔断,隔出一个玄关空间...
  9. dingo php,dingo/api 使用
  10. TestCenter IGMP Proxy组播测试(bridge)