本文是通过Python使用Kvaser产品三篇系列文章的第二篇:
- 通过Python访问Kvaser CANlib
- 通过Python连接到远程设备
- 通过Python访问Kvaser设备的面向对象程度更高的方法
本文是通过Python使用Kvaser产品三篇系列文章的第二篇:
上次我提到,在Kvaser CANlib SDK中,kvrlib还有一个Python v2.7包装器,我想我们可以快速查看下。 kvrlib库用于处理远程设备,如Blackbird和Ethercan设备。我们将在以下两个示例中尝试一些发现和配置。
首先让我们使用发现功能扫描并连接到远程设备。我们的远程设备序列号16,已经连接到与我们的计算机相同的网络:
import sys
sys.path.append("C:/temp/Canlib_SDK_v5.9/Samples/Python")
import kvrlib
kl = kvrlib.kvrlib()
print "kvrlib version: %s" % kl.getVersion()
serialNo = 16
print "Connecting to device with serial number %s" % serialNo
addressList = kvrlib.kvrDiscovery.getDefaultAddresses(kvrlib.kvrAddressTypeFlag_BROADCAST)
print "Found %d addresses." % addressList.count
#print addressList
discovery = kl.discoveryOpen()
discovery.setAddresses(addressList)
delay_ms = 100
timeout_ms = 1000
discovery.setScanTime(delay_ms, timeout_ms)
print "Scanning devices...\n"
deviceInfos = discovery.getResults()
#print "Scanning result:\n%s" % deviceInfos
for deviceInfo in deviceInfos:
if deviceInfo.ser_no == serialNo:
deviceInfo.connect()
print 'Connecting to the following device:'
print '---------------------------------------------'
print deviceInfo
discovery.storeDevices(deviceInfos)
break;
discovery.close()
kl.unload()
在调用脚本之前,您应该设置好envar PYTHONPATH,而不是附加到sys.path
(如第2行所示)。还要注意,打包结果变量时,Python包装器通常是非常有用的。这意味着您可以取消对第13行和第22行的注释,并获得可读输出。
以上代码输出如下:
kvrlib version: 8.9
Connecting to device with serial number 16
Found 4 addresses.
Scanning devices...
Connecting to the following device:
---------------------------------------------
name/hostname : "Kvaser Remote #16" / "kv-07130-000016"
ean/serial : 73301-30007130 / 16
fw : 2.4.126
addr/cli/AP : 10.0.3.32 (IPV4) / 10.0.3.27 (IPV4) / unknown (UNKNOWN)
usage/access : FREE / PUBLIC
pass/enc.key : no / no
现在让我们在设备上作少许配置,为什么不更改设备名称?远程设备现在已经在CANlib通道0(第6行)上打开,我们将设备名称设置为“MrKvaser”(第7行)。
import sys
sys.path.append("C:/temp/Canlib_SDK_v5.9/Samples/Python")
import kvrlib
canChannel = 0
deviceName = "MrKvaser"
kl = kvrlib.kvrlib()
print "Configurating device on channel %d." % canChannel
try:
config = kl.configOpen(channel=canChannel, mode=kvrlib.kvrConfig.MODE_RW)
config.getXml()
print "Current device configuration:\n%s" % config.xml.toxml()
print "Device name was '%s'" % config.xml.getElementsByTagName('NETWORK')[0].attributes['device_name'].value
print "Setting new device name '%s'" % deviceName
config.xml.getElementsByTagName('NETWORK')[0].attributes['device_name'].value = deviceName
config.setXml()
config.close()
except (kvrlib.kvrError) as ex:
print ex
kl.unload()
我们从第12行开始以读/写模式打开配置,然后读入第13行的现有配置。在第14行输出整个XML配置后,我们在将其写回到第18行的设备之前设置设备名称元素。
以下内容将被输出到面板:
Configurating device on channel 0.
Current device configuration:
<?xml version="1.0" ?><KVASER>
<VERSION>4.3</VERSION>
<PRODUCTFAMILY>ethercan</PRODUCTFAMILY>
<DEVICE_ACCESS level="PUBLIC" password=""/>
<CONFIG_PROTECTION password="" protected="NO"/>
<NETWORK address_type="DHCP" device_name="Kvaser Remote #16" host_name="kv-07130-000016" mtu="1492" port="11416"/>
<PROFILE_INFO name="Unnamed Profile"/>
<TRAFFIC_ENCRYPTION key="" type="NONE"/>
<WEBSERVER change_log_settings="NO" debug_commands="NO" enabled="NO" user_data_download="NO"/>
</KVASER>
Device name was 'Kvaser Remote #16'
Setting new device name 'MrKvaser'
我们从设备获取的XML配置可以通过使用内置Python XML支持进行操作,如第14行和第17行所示。
有关配置过程XML完整说明,请在下载页面查看“Kvaser远程设备配置XML格式规范”文档。
还有,我们真的需要“知道”设备需要在CANlib通道0(第6行)上打开吗?让我们在下一篇文章中解决这个问题。
2015-05-22编辑:申明当前的包装器是为Python v2.7所编写。