技术博客

10/02/2017 作者 Mikkel

数据导出格式和属性

这是关于CANlib SDK 软件开发工具包里的转换器库Converter Library (kvlclib)使用的博客第一部分(总计为3部分))

  1. 数据导出格式与属性
  2. 转换到 纯ASCII (2 of 3)
  3. 特别转换器条件(3 of 3)

包括在Kvaser Memorator设置工具里的转换器,是基于一个在CANlib SDK v5.19.[1]软件开发包内被称为kvlclib的转换器库提供的。 如果你已经用过Kvaser Memorator设置工具里的提取和转换文件助手, 你就已经了解此转换器库能做什么。

图 1: 从菜单中开始提取和转换文件 “Extract and convert files”助手

在此博客中,我们来看一下怎样使用Python里的转换器库。给转换器库(kvlclib)Python装饰器是包含在CANlib SDK软件开发包里的,同时也可另外下载[2]。 如果要看一个关于如何安装和使用Python软件包的简短介绍请看此文

此转换器库有两个C函数,kvlcGetFirstWriterFormat() 和 kvlcGetNextWriterFormat(), 它们可以被用来列出所有的受支持的转换器格式[3]。这两个函数的 Python代码为 kvlc.getFirstWriterFormat() 和 kvlc.getNextWriterFormat().[4]

我们在列表1中的程序使用这两个函数来写所有受支持的格式。

import canlib.kvlclib as kvlc

print("Supported formats:")
print(" Id Name (Extension), Description\n" + ’=’ * 50)

# 询问kvlclib第一书写格式 
id = kvlc.WriterFormat.getFirstWriterFormat() 
while True:
    fmt = kvlc.WriterFormat(id)
    print(str(fmt)) 11

    #询问kvlclib下一个支持的书写格式
    id = kvlc.WriterFormat.getNextWriterFormat(fmt.id_)

    # 如果没有任何受支持的书写格式,我们得到id 0.
    if id == 0:
	break

列表 1:用转换器库打印受支持的格式。

使用我们在列表1中的代码获得所有受支持的书写(如输出)格式:[5]

Supported formats:
  Id   Name  (Extension),  Description
==================================================
   4: CSV Frame (.csv), CAN frames in CSV format
 100: CSV Signal (.csv), Selected signals in CSV format
 200: CSV CCP/XCP (.csv), CCP/XCP calibration in CSV format
 102: Matlab (.mat), Selected signals in Matlab format for ATI Vision
   1: KME 2.4 (.kme), Kvaser binary format (KME 2.4) - used for Vector CANalyzer
   2: KME 2.5 (.kme25), Kvaser binary format (KME 2.5)
   7: KME 4.0 (.kme40), Kvaser binary format (KME 4.0)
   9: KME 5.0 (.kme50), Kvaser binary format (KME 5.0)
   5: Plain text (.txt), CAN frames in plain text format
 105: FAMOS (.dat), Selected signals in FAMOS format
 201: FAMOS CCP/XCP (.dat), CCP/XCP calibration in FAMOS format
   3: Vector ASCII (.asc), CAN frames in Vector ASCII format
   8: Vector BLF (.blf), CAN frames in Vector BLF format
1000: Debug output (.dbg), RAW Debug output
 101: MDF (.log), CAN frames in Vector Mdf
 107: MDF v4.1 (.mf4), CAN frames in MDF v4.1 for Vector CANalyzer
 106: MDF Signal (.mdf), Selected signals in MDF format for Vector CANalyzer
 108: MDF v4.1 Signal (.mf4), Selected signals in MDF v4.1 for Vector CANalyzer
 103: ASCII J1587 (.asc), Vector ASCII J1587

每种书写格式都有一些性能, 使用函数kvlcIsPropertySupported(), 我们就可以看出一个具体书写格式是否支持某个特定性能。如性能 KVLC_PROPERTY_ATTACHMENTS表明是否我们可以给某个输出文件附加其他文件。

import canlib.kvlclib as kvlc

# 设置输出格式
fmt = kvlc.WriterFormat(kvlc.FILE_FORMAT_PLAIN_ASC)

# 查看是否此格式支持KVLC_PROPERTY_ATTACHMENTS
if fmt.isPropertySupported(kvlc.PROPERTY_ATTACHMENTS):
    print("PROPERTY_ATTACHMENTS is supported") 
else:
    print("PROPERTY_ATTACHMENTS is not supported")

列表 2: 查看书写格式性能的范例代码。

使用我们在列表2中的代码展示书写性能 KVLC_PROPERTY_ATTACHMENTS不受书写格式 KVLC_FILE_FORMAT_PLAIN_ASC支持

PROPERTY_ATTACHMENTS is not supported

当我们列出一个转换器,大部分书写性能(但不是全部性能)可用kvlcSetProperty() 和 kvlcGetProperty()读取或书写。[6] 一个具体性能的缺省设置也可用 kvlcGetWriterPropertyDefault()来查看。如性能. KVLC_PROPERTY_CHANNEL_MASK是设置选择通道数据的一个掩码,在转换中使用。

import canlib.kvlclib as kvlc

# 设置输出格式
fmt = kvlc.WriterFormat(kvlc.FILE_FORMAT_PLAIN_ASC)

# 利用格式定义的延伸设置输出结果文件名
# 产生转换
outfile = "myresult." + fmt.extension
# 产生转换
kc = kvlc.Kvlclib(outfile, fmt) 

# 检查是否转换器支持KVLC_PROPERTY_CHANNEL_MASK
if kc.isPropertySupported(kvlc.PROPERTY_CHANNEL_MASK):

    # 书写当前(缺省)值(以二进制格式)
    print("Original value for CHANNEL_MASK is %s" % bin(kc.getProperty(kvlc.PROPERTY_CHANNEL_MASK))) 

    # 设置新值
    kc.setProperty(kvlc.PROPERTY_CHANNEL_MASK, 1)
    # 书写当前值
    print("New value for CHANNEL_MASK is %s" % bin(kc.getProperty(kvlc.PROPERTY_CHANNEL_MASK))) 

    #书写缺省值(以二进制格式)
    print("Default value for CHANNEL_MASK is %s" % bin(kc.getPropertyDefault(kvlc.PROPERTY_CHANNEL_MASK)))

列表 3: 读取和书写转换器性能

使用列表3 中的代码让我们得到下列输出结果:

Original value for CHANNEL_MASK is 0b11
New value for CHANNEL_MASK is 0b1
Default value for CHANNEL_MASK is 0b11

本文谈了书写格式和性能,下一部分我们将谈实际转换。

注释

[1] 此转换器库kvlclib, 目前仅可在Windows视窗操作系统内使用。

[2] CANlib SDK软件开发工具包和另外下载Python包均可从此获取 www.kvaser.com/downloads。

[3] 我将尽量在博客中继续在运行操作文字部分写C 格式函数名和定义。

[4] 在我们的代码中, 我们以kvlc 的名称导入canlib.kvlclib 转换器库,来简化名称。

[5] 由于实施的具体细节,结果被重调为任意命令。

[6]  除了 KVLC_PROPERTY_ATTACHMENTS, 性能 KVLC_PROPERTY_SIGNAL_BASED
和 KVLC_PROPERTY_SHOW_SIGNAL_SELECT 只能用函数kvlcIsPropertySupported()操作。

Author Image

Mikkel Gerdes