技术博客
数据导出格式和属性
这是关于CANlib SDK 软件开发工具包里的转换器库Converter Library (kvlclib)使用的博客第一部分(总计为3部分))
- 数据导出格式与属性
- 转换到 纯ASCII (2 of 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()操作。