技术博客

16/09/2018 作者 Magnus Carlsson

开始使用kvmlib

本文是共包括4部分的技术博客的第一部分。此博客介绍通过kvmlib语言,使用第二代Kvaser Memorator数据记录仪,配置和读取已记录的数据:

这第一部分文章将概述如何使用python配置kvaser设备。此博客的第二部分介绍了更为复杂的配置,而第三部分将更进一步,介绍如何在C API水平上使用kvmlib。最后一部分介绍了如何在只能访问SD卡的情况下,配置设备。GitHub上提供完整的程序列表。

1.1 介绍

较新的Kvaser Memorator设备的配置通常可使用 Kvaser Memomorator Config Tool – 一个Windows GUI工具。但是你也可以使用Kvaser Memorator library (kvmlib) – Kvaser CANlib SDK.1的一部分,来配置这些设备。

我们这里选择的设备是具备3.113固件版本的kvaser Memorator 5xHS2

我们还将使用python canlib包的v1.6版,和kvaser canlib SDK的v5.23版,最新版本可从www.kvaser.com/downloads下载。


1.2 初始化SD

仅在我们的操作系统的文件管理器中格式化SD卡是不够的,我们还需要使用Kvaser Memorator设备初始化SD卡。将SD卡插入Kvaser Memorator设备后,我们将Kvaser Memorator设备连接到电脑的一个USB端口,并运行第一部分编码来格式化SD卡。

# 01_init_sdcard.py
from canlib import EAN
from canlib.device import Device
from canlib import kvmlib

# 找到已连接上的 Kvaser Memorator Pro 5xHS,其代码为EAN 73-30130-00778-9
ean = EAN('73-30130-00778-9')
dev = Device.find(ean=ean)

# 向该硬件询问一些信息, 并打印出来
print(dev.probe_info())

# 使用我们在Kvaser Memorator上找到的 CANlib 通道号,打开该设备来进行配置。LED 灯将开始慢速"运行灯" ,显示该设备正在打开,以进行配置。

# 我们将使用一个文字管理器,来确保在完成时,我们能正确关闭Memorator内部处理。
with kvmlib.openDevice(dev.channel_number()) as memo:
    # 用缺省值初始化SD 卡。CAN 通道LED灯在这个初始化过程中,会快速闪动。
    print('Formatting disk...', end='')
    memo.format_disk()
    print(' done!')

列表 1:在一个 Kvaser Memorator 设备上初始化SD卡

当我们运行下面的编码,我们可以确认该设备确实在运行固件版本v3.11, 并且连接到canlib 通道0上。

CANlib Channel: 0
Card Number   : 0
Device        : Kvaser Memorator Pro 5xHS (channel 0)
Driver Name   : kcany0a
EAN           : 73-30130-00778-9
Firmware      : 3.11.0.557
Serial Number : 1023
Formatting disk... done!

1.3 创建配置

现在我们必须通过编写一段XML代码4来创建一个配置。让我们举一个简单的例子,只使用通道0和1。我们将把这两个通道的比特率设置为1 Mbit/s,并在安静模式下记录所有内容。

<?xml version="1.0" ?>
<!-- loggall.xml -->
<!DOCTYPE KVASER>
<KVASER>
  <VERSION>2.0</VERSION>
  <BINARY_VERSION>6.0</BINARY_VERSION>
  <SETTINGS>
    <MODE fifo_mode="NO" log_all="YES"/>
  </SETTINGS>
  <CAN_BUS>
    <PARAMETERS bitrate="1000000" channel="0" silent="YES" sjw="1"
       tseg1="5" tseg2="2"/>
    <PARAMETERS bitrate="1000000" channel="1" silent="YES" sjw="1"
       tseg1="5" tseg2="2"/>
  </CAN_BUS>
  <TRIGGERBLOCK/>
  <SCRIPTS/>
</KVASER>

列表 2: 简单 XML 配置范例.

当前XML配置版本是v2.0,我们的设备使用固件版本v3.11, 预期二进制(配置)版本6.0。

在下一篇文章中,我们将增加配置的复杂程度,介绍如何在下载配置之前,明确验证配置。现在,我们只需确保正确无误地使用XML。


1.4 下载配置

我们现在几乎可以开始数据记录了,只是需要把配置加到设备上。我们将读取我们刚创建的XML文件,来实现这一操作,将此XML配置转换为二进制配置,并将二进制配置下载到设备上。

# 02_config_device.py
from canlib import EAN, Device
from canlib import kvamemolibxml
from canlib import kvmlib

# 寻找我们已连接上的 Kvaser Memorator Pro 5xHS
# 要点: 只要输入最后6位数就可以了。
dev = Device.find(ean=EAN('00778-9'))

# 读取 XML 配置文件
with open("logall.xml", 'r') as myfile:
    config_xml = myfile.read()

# 把 XML 配置转换为二进位配置
config_lif = kvamemolibxml.kvaXmlToBuffer(config_xml)

# 打开memorator 设备,并书写此二进位配置
with kvmlib.openDevice(dev.channel_number()) as memo:
    memo.write_config(config_lif)

列表 3:把配置下载到 Kvaser 设备上。

现在,我们已准备好,把配置好的设备与电脑断开,并将设备连接到现有的CAN总线,并通过给设备的CAN 1总线连接器接电,来开始数据记录。


1.5 读取已记录的报文

在我们记录了一些报文后,我们再次将这个Kvaser Memorator 设备连接到电脑的USB 接口上,并读取结果。

# 03_read_logged.py
from canlib import EAN, Device
from canlib import kvmlib

# 连接到 Kvaser Memorator Pro 5xHS设备上,编码EAN 73-30130-00778-9
# 登入数据记录区
dev = Device.find(ean=EAN('00778-9'))
memo = kvmlib.openDevice(dev.channel_number(), mount=True)

fileCount = len(memo.log)
print('Found {} file{} on card.'.format(
    fileCount,
    "s" if fileCount > 1 else "")
)

# 连接所有日志文件,并把它们的内容书写到标准输出上
for i, logfile in enumerate(memo.log):
    print('Reading file {}:'.format(i))
    print("Logging started at", logfile.start_time.isoformat(' '))

    for event in logfile:
        print(event)

# memo.log.delete_all()   # 可选项, 删除所有日志文件

# 关闭memorator设备
memo.close()

列表 4: 读取已记录的报文并打印到标准输出上。

请注意我们并没有运行列表4中的‘# memo.log.delete_all()’行 – 删除已记录文件的命令,因为这样我们不必重新在CAN总线上记录,可以多次运行这个脚本。

Found 1 file on card.
Reading file 0:
Logging started at 2018-05-22 11:08:56
*t:             - EAN:73-30130-00778-9  s/n:1023  FW:v3.11.557  LIO:v5.0
 t:   0.236734012  DateTime: 2018-05-22 11:08:56
 t:   0.236734012 Log Trigger Event (type: 0x1, trigno: 0x00, pre-trigger: 0, post-trigger: -1)

 t:   4.453331987  ch:0 f:    2 id: 490 dlc: 2 d:5d d6
 t:   4.453332025  ch:1 f:    2 id: 490 dlc: 2 d:5d d6
 t:   4.453731112  ch:0 f:    2 id: 284 dlc: 2 d:a8 b1
 t:    4.45373115  ch:1 f:    2 id: 284 dlc: 2 d:a8 b1
 t:   4.454201237  ch:0 f:    2 id: 739 dlc: 2 d:7a 4b
 t:   4.454201275  ch:1 f:    2 id: 739 dlc: 2 d:7a 4b
 t:   4.454729362  ch:0 f:    2 id: 622 dlc: 6 d:8d b9 69 8a 98 e1
 t:     4.4547294  ch:1 f:    2 id: 622 dlc: 6 d:8d b9 69 8a 98 e1
 t:   4.455189487  ch:0 f:    2 id: 559 dlc: 1 d:78
 t:   4.455189525  ch:1 f:    2 id: 559 dlc: 1 d:78
 t:   4.455685612  ch:0 f:    2 id: 33a dlc: 1 d:0d
 t:    4.45568565  ch:1 f:    2 id: 33a dlc: 1 d:0d
 t:   4.456254737  ch:0 f:    2 id: 463 dlc: 6 d:14 eb d6 ae ed 46
 t:   4.456254775  ch:1 f:    2 id: 463 dlc: 6 d:14 eb d6 ae ed 46
 t:   4.456754862  ch:0 f:    2 id: 59b dlc: 6 d:7f a9 28 3a f2 5d
 t:     4.4567549  ch:1 f:    2 id: 59b dlc: 6 d:7f a9 28 3a f2 5d
 t:   4.457269987  ch:0 f:    2 id: 103 dlc: 8 d:4e 0d 1a dd 8d b2 19 ab
 t:   4.457270025  ch:1 f:    2 id: 103 dlc: 8 d:4e 0d 1a dd 8d b2 19 ab
 t:  10.220507812  DateTime: 2018-05-22 11:09:06

本文简述至此。我们现在知道了怎样用kvmlib配置和读取已记录的数据。在下个部分,我们将着重讨论较复杂的配置。


注释:

1 要大概了解所有Kvaser SDK libraries, 请参阅博客,关于怎样 Get more from your hardware with Kvaser SDK libraries(利用Kvaser SDK软件开发包资料库来更充分地发挥Kvaser硬件的作用)。

此产品是 Kvaser Memorator Pro 5xHS ,编号为73-30130-00778-9。

Kvaser Memorator Pro 5xHS的固件是和 Kvaser Firmware Update Tool (Kvaser固件升级工具)捆绑在一起的,并可在此下载。

 XML配置格式在下文中有介绍: Specification of Kvaser Memorator Device configuration XML format, 可在此参阅。



本文已更新。 要查看原件,请单击下面的框。

Author Image

Magnus Carlsson

Margus Carlsson是Kvaser AB公司的软件开发人员,从2007年以来深度参与了Kvaser固件和软件的开发。他还为Kvaser的技术博客撰写了许多用流行的Python语言编写应用程序的文章。