¼¼Êõ²©¿Í

18/09/2018 ×÷Õß ÔÆº£ÓÎÏ·

½øÒ»²½Á˽âkvmlib

±¾ÎÄÊǹ²°üÀ¨4²¿·ÖµÄ¼¼Êõ²©¿ÍµÄµÚÈý²¿·Ö¡£´Ë²©¿Í½éÉÜͨ¹ýkvmlib£¬Ê¹Óõڶþ´úÔÆº£ÓÎÏ· MemoratorÊý¾Ý¼Ç¼ÒÇ£¬ÅäÖúͶÁÈ¡ÒѼǼµÄÊý¾Ý:

ÔÚ±¾²©¿ÍµÄµÚÒ»²¿·ÖÖУ¬ÎÒÃÇ˵Ã÷ÁËÈçºÎʹÓÃkvmlibÅäÖÃÉ豸£¬²¢¶ÁÈ¡ÓÃpythonÅäÖõı¨ÎÄ¡£ÔÚÕâÒ»²¿·ÖÖУ¬ÎÒÃǽ«ÔÙÈ¥¿´Ò»ÏÂÎÒÃÇÔÚµÚ¶þ²¿·ÖÖÐËù×öµÄÅäÖ㬽éÉÜÔõÑùʹÓÃkvmlib×ö¸ü¶à²Ù×÷£¬°üÀ¨±£´æºÍ»Ö¸´ÄãÔÚÔÆº£ÓÎÏ· MemoratorµÄSD¿¨ÉϵÄÅäÖá£Äã¿ÉÄܶÔÏÂÃæÓÐÒ»¸ö²©¿ÍϵÁиÐÐËȤ£ºSetting Up CANlib for Visual Studio£¨ÎªÊÓ¾õ¹¤×÷ÊÒÉèÖÃCANlib£©¡£

3.1 ´ò¿ªÉ豸

ʹÓÃkvmlib´ò¿ªÉ豸ÐèÒªµÄ²»½öÊÇEAN±àºÅ¡£µ±Ê¹ÓÃPython canlibÉ豸Ä£¿éÁ¬½Óµ½Ò»¸öÉ豸ʱ£¬´Ë´úÂë»áÔÚÄÚ²¿²éÕÒÁ¬½Óµ½¼ÆËã»úÉϵÄËùÓÐÉ豸£¬²¢¸ø³öµÚÒ»¸ö·ûºÏËÑË÷Ìõ¼þµÄÉ豸£¬ÔÚ±¾ÀýÖеÄÌõ¼þÊÇEAN±àºÅ¡£

# 05_±¨¸æ_É豸.py
from canlib import Device, EAN


#ͨ¹ý×îºó6λÊý×Ö£¬ÎªÎÒÃǵÄÉ豸Éú³ÉÒ»¸öEANÄ¿±ê
ean = EAN('00819-9')
print('Full EAN: {}\n'.format(ean))

# ѰÕÒÎÒÃÇµÄ ÔÆº£ÓÎÏ· Memorator Pro 2xHS £¬ÏµÁкÅEAN 00819-9
dev = Device.find(ean=ean, serial=None)

# ´òÓ¡ÓйØÕâ¸öÉ豸µÄÐÅÏ¢
print(dev.probe_info())
Full EAN: 73-30130-00819-9

CANlib Channel: 0
Card Number   : 0
Device        : ÔÆº£ÓÎÏ· Memorator Pro 2xHS v2 (channel 0)
Driver Name   : kcany0a
EAN           : 73-30130-00819-9
Firmware      : 3.11.0.557
Serial Number : 11573

Áбí 8: ´òÓ¡Ò»¸öÒÑÁ¬½ÓÉϵÄÔÆº£ÓÎÏ·É豸µÄÐÅÏ¢¡£


ÏÖÔÚÄã¿ÉÒÔ×¢Òâµ½£¬ÎÒÃǵÄÉ豸Á¬½Óµ½CANlibͨµÀ0£¬Õâ¸öCANlibͨµÀºÅÓÃÀ´´ÓCANlib1´ò¿ª´ËÉ豸¡£Èç¹ûÎÒÃÇ´ò¿ªµÄÊǵڶþ¸öÉ豸£¬µÚ¶þ¸öÉ豸ÉϵÄÄÇЩ±àºÅ½«²»Í¬¡£

µ±Ê¹ÓÃkvmlib´ò¿ªÎÒÃǵÄÉ豸£¬³ýÁËÖ¸¶¨Õâ¸öCANlibͨµÀºÅ£¬ÎÒÃÇ»¹¿ÉÒÔÖ¸¶¨Ò»¸öÉ豸ÀàÐÍ¡£Õâ¸öÉ豸ÀàÐÍÓÃÀ´È·¶¨¸ÃÉ豸ÔÚʹÓÃʲô°æ±¾µÄLIOÊý¾Ý¸ñʽ2/a>¡£¹Ì¼þ°æ±¾v3.0ʹÓà É豸ÐͺÅ?kvmDEVICE_MHYDRA_EXT, ÕâÊÇv1.7°æ±¾python canlibÄ£¿éµÄȱʡÉèÖá£kvmlib.openDeviceµÄ×îºóÒ»¸ö×Ô±äÁ¿ÊÇmount£¬Ëü±íÃ÷MemoratorµÄ´æ´¢ÇøÊÇ·ñÒÑ×°ÉÏ£¨È±Ê¡ÊÇFalse£©¡£

ÈÃÎÒÃÇÀ´¿´Ò»ÏÂÔõÑùÓÃkvmlibÅäÖôËÉ豸¡£

# 06_ÉèÖÃ_ʱÖÓ.py
from canlib import kvmlib
import datetime


# ÎÒÃÇÖªµÀÎÒÃǵÄÉ豸ÒÑÁ¬½Óµ½CANlib ͨµÀ0
channel = 0

# ÎÒÃÇ»¹ÖªµÀÎÒÃǵÄÉ豸µÄÀàÐÍÊÇkvmDEVICE_MHYDRA_EXT
with kvmlib.openDevice(
        channel_number=channel,
        device_type=kvmlib.Device.MHYDRA_EXT) as device:
    # ÎÒÃÇÒѾ­»ñµÃÁË´ËÉ豸, ±ÈÈç˵£¬ÏÖÔÚÎÒÃÇ¿ÉÒԲ鿴ϵÁкÅ

    print("Serial number:", device.serial_number)

    # ¶ÁÈ¡É豸ʱ¼ä
    print("Current device time is", device.rtc)

    # ÉèÖøÃÉ豸µÄʵʱÖÓ
    device.rtc = datetime.datetime.now()

    # ¶ÁÈ¡É豸ʱ¼ä
    print("New device time is", device.rtc)

Áбí 9: ÓÃkvmlibΪһ¸öÔÆº£ÓÎÏ·É豸ÉèÖÃʵʱÖÓ¡£

Serial number: 11573
Current device time is 2018-08-10 07:47:46
New device time is 2018-08-10 07:52:48

ÔËÐÐÉÏÃæµÄ´úÂë¿É»ñµÃÏÂÃæµÄ½á¹û:

3.2 ³õʼ»¯SD¿¨

ÈçǰËùÊö£¬ÔÚ´ò¿ªÒ»¸öÉ豸ʱ£¬Ê¹ÓÃÕýÈ·µÄÉ豸ÀàÐÍÊǷdz£ÖØÒªµÄ¡£Èç¹ûÎÒÃÇʹÓôíÎóµÄLIOÊý¾Ý¸ñʽ£¨ÈçʹÓÃÉ豸ÀàÐ͹涨µÄÄÇÑù£©´ò¿ªÒ»¸öÉ豸£¬ÔÚ¶ÁÈ¡Êý¾Ýʱ£¬ÎÒÃǽ«ÎÞ·¨¿´µ½ÈκμǼµÄ±¨ÎÄ¡£ÔÚ³õʼ»¯SD¿¨Ê±£¬Ê¹ÓÃÕýÈ·µÄÉ豸ÀàÐ͸üÎªÖØÒª£¬ÒòΪÈç¹ûʹÓò»ÕýÈ·µÄLIOÊý¾Ý¸ñʽ³õʼ»¯SD¿¨£¬¹Ì¼þ½«ÎÞ·¨·ÃÎʸÿ¨¡£

ΪÁ˳õʼ»¯´ËSD¿¨£¬ÎÒÃÇÐèÒªÉ豸ÀàÐÍ¡£ÎÒÃÇÓÃkvmlib.openDeviceÀ´´ò¿ªÉ豸£¬ÔÚÒ»¸öÔÆº£ÓÎÏ· Memorator¶þ´úÉ豸£¨ÔËÐй̼þ°æ±¾v3.0£©ÉϵÄÉ豸ÀàÐÍÊÇ?kvmDEVICE_MHYDRA_EXT?3¡£

È»ºóÎÒÃǵ÷ÓÃ?format_disk³õʼ»¯SD¿¨¡£ÔÚ³õʼ»¯µ±ÖУ¬SDµÄ´ó²¿·Ö¿Õ¼äÊÇÓÃÀ´´æ´¢¼Ç¼±¨Îĵ쬵«ÊÇÎÒÃÇ¿ÉÒÔͨ¹ý¸ø³õʼ»¯ÃüÁîÌí¼ÓÁ½¸ö²»Í¬µÄ×Ô±äÁ¿£¬Ó°ÏìÁ½¸ö²¿·ÖµÄ´æ´¢¿Õ¼ä´óС¡£

µÚÒ»¸ö×Ô±äÁ¿ÊÇÖ¸¶¨¡°ÎªÓû§Îļþ±£Áô¿Õ¼ä¡±£¬ÕâÒâζ×ÅSD¿¨µÄÕⲿ·Ö¿Õ¼ä½«¹©Óû§Ö§ÅäʹÓá£ÎÒÃÇ¿ÉÒÔÔÚ¸ÃÉ豸ÖÐÔËÐÐÒ»¸ö?t³ÌÐò£¬Éú³ÉÎı¾Îļþ£¬»òÕßÎÒÃÇ¿ÉÄÜÓÐÆäËûÓû§ÎļþÒª¸´ÖƵ½SD¿¨ÉÏ¡£

µÚ¶þ¸ö×Ô±äÁ¿ÄÜÓ°ÏìÒ»¸ö½Ð×öDATABASE.BIN?µÄÎļþ´óС£¬?ÔÆº£ÓÎÏ· Memorator Config ToolÔÚʹÓÃËü£¬ÁíÍâËü¿ÉÄÜ»¹°üº¬ÉèÖúÍÊý¾Ý¿âÎļþ£¬Óû§¿ÉÒÔÑ¡Ôñ°ÑÕâÀàÎļþ´æ´¢ÔÚSD¿¨ÉÏ¡£

ÔÚ×°ÉÏMemoratorиñʽ»¯µÄ¼ÇÂ¼ÇøÒÔºó£¬ÎÒÃǼì²éÊÇ·ñ»ñµÃÁËÔ¤ÆÚµÄLIOÊý¾Ý¸ñʽ£¬´Ó¶øÑéÖ¤ÎÒÃÇÌṩÁËÕýÈ·µÄÉ豸ÀàÐÍ¡£

# 07_ÑéÖ¤_lio_³õʼ»¯_sdcard.py
from canlib import kvmlib
from canlib import VersionNumber

# ֮ǰÎÒÃÇ¿´µ½¸ÃÉ豸ÒÑÁ¬½Óµ½CANlib ͨµÀ 0
channel = 0

# ÎÒÃÇ»¹ÖªµÀ´ËÉ豸ÀàÐÍÊÇkvmDEVICE_MHYDRA_EXT
device_type = kvmlib.kvmDEVICE_MHYDRA_EXT

# ´ò¿ªÉ豸
with kvmlib.openDevice(channel_number=channel,
                       device_type=device_type,
                       mount=False) as memorator:

    # ¸ñʽ»¯ SD ¿¨²¢¸øÅäÖÃÎļþ±£Áô 10 MB 
    # (i.e. DATABASE.BIN) ºÍ 10000 MB ¸øÎÒÃÇ×Ô¼ºµÄÎļþ¡£
    print('Initializing SD card...')
    memorator.format_disk(reserved_space=10000,
                          database_space=10)

    # ×°ÉÏ´æ´¢Çø
    memorator.mount()

    # ¶ÁÈ¡LIOÊý¾Ý¸ñʽ°æ±¾
    lio_data_format = memorator.log.ldf_version

    # ÑéÖ¤SD¿¨µÄLIOÊý¾Ý¸ñʽºÍ´ËÉ豸µÄÀàÐÍÏà·û - ÎÒÃÇÓÃÕâ¸öÀàÐÍÀ´´ò¿ªÉ豸
 
    if lio_data_format != VersionNumber(major=5, minor=0):
        if lio_data_format == VersionNumber(major=3, minor=0):
            raise ValueError('This log file can be read if you reopen the'
                             ' device as kvmDEVICE_MHYDRA.')
        raise ValueError('Unexpected Lio Data Format: ' +
                         str(lio_data_format))

    # ±¨¸æ´Ë¿¨ÉÏ·ÖÅ䏸Êý¾Ý´æ´¢ÇøµÄÐÅÏ¢ 
    print('Disk size: {disk:.0f} MB\n'
          '  Log size: {log:.0f} MB. Used: {used:.0f} MB'.
          format(disk=memorator.disk_size,
                 log=memorator.disk_usage.total,
                 used=memorator.disk_usage.used))

Áбí10: ÑéÖ¤ LIOÊý¾Ý¸ñʽºÍ³õʼ»¯Ò»¸öÔÆº£ÓÎÏ·É豸µÄSD¿¨¡£

Initializing SD card...
Disk size: 15932 MB
  Log size: 5895 MB. Used: 0 MB

ÎÒÃǵÄÔÆº£ÓÎÏ· MemoratorÉ豸ÓÐÒ»¸ö16 GBµÄSD¿¨£¬µ±ÎÒÃÇÏÖÔÚΪDATABASE.BIN±£Áô10 MB£¬ºÍ·ÖÅä10 GBµ½ÏÐÓà¿Õ¼äʱ£¬ÎÒÃÇֻʣÏÂ5895 MBÓÃÓڼǼ´æ´¢¡£ÒòΪÎÒÃǸոճõʼ»¯ÁËSD¿¨£¬ËùÒÔÎÒÃǼǼÁË0 MB£¨ÒÑÓã©Êý¾Ý¡£

´ËÉ豸¼°ÆäSD¿¨ÏÖÔÚÒѳõʼ»¯²¢ÎªÅäÖÃ×öºÃ×¼±¸¡£


3.3 ±£´æÅäÖÃ

ΪÁ˽«ÅäÖñ£´æµ½É豸µÄSD¿¨£¬ÎÒÃǽ«ÑéÖ¤¹ýµÄXMLÅäÖÃת»»Îª¶þ½øÖÆÅäÖ㬲¢½«´Ë¶þ½øÖÆÅäÖÃÏÂÔØµ½É豸ÉÏ£¨¾ÍÏñÎÒÃÇÔÚÕâ¸ö²©¿ÍϵÁеĵÚÒ»²¿·ÖÖÐËù×öµÄÄÇÑù£©¡£

# 08_±£´æ_ÉèÖÃ.py
from canlib import kvamemolibxml
from canlib import kvmlib


# ÎÒÃÇ֮ǰ¿´µ½´ËÉ豸Á¬½Óµ½ÁËCANlib ͨµÀ 0
channel = 0
# ¶ÁÈ¡ XML ÉèÖÃÎļþ
with open("config.xml", 'r') as myfile:
    print('Reading xml')
    config_xml = myfile.read()

# °ÑXMLÉèÖÃת»»Îª¶þ½øÖÆÉèÖÃ
config_lif = kvamemolibxml.kvaXmlToBuffer(config_xml)

# ´ò¿ªmemorator É豸²¢Êéд¸ÃÉèÖÃ
# É豸ÀàÐÍ kvmDEVICE_MHYDRA_EXT ÊÇȱʡÉèÖÃ
with kvmlib.openDevice(channel_number=channel) as memorator:
    print('Writing config')
    memorator.write_config(config_lif)

Áбí 11: ת»»²¢ÏÂÔØÅäÖõ½Ò»¸öÔÆº£ÓÎÏ· É豸ÉÏ¡£

ΪÁËÔÚÖ®ºóÒÔÃ÷È·ÎÄ×ÖÐÎʽÕÒ»ØÅäÖà , ÎÒÃǰÑÎÒÃÇÓùýµÄÎļþ±ä³ÉÒ»¸öѹËõÎļþ(config.zip)ÏÂÔØµ½É豸ÉÏ4?¡£ÒòΪÎÒÃÇ֮ǰÔÚ±àÖÆt?³ÌÐò5ʱʹÓùý×Ô±äÁ¿?-addsrc?, ÎÒÃÇÖ»ÐèÒªÕâ¸ö±àÖÆºÃµÄ?.txe?ÎļþºÍÎÒÃǵÄXMLÅäÖá£Èç¹ûÎÒÃÇʹÓÃÁËÈκÎÊý¾Ý¿â, ÎÒÃÇÒ²½«°ÑÄÇЩÊý¾Ý¿âÌí¼Óµ½Ñ¹ËõÎļþ´æµµ¡£

# 09_¸´ÖÆ_Îļþ_µ½_É豸.py
import zipfile
from canlib import canlib

# Éú³ÉѹËõÎĵµ
with zipfile.ZipFile("config.zip", mode='w',
                     compression=zipfile.ZIP_DEFLATED) as zipf:
    # Ìí¼ÓÎļþµ½Ñ¹ËõÎĵµÖÐ
    zipf.write("config.xml")
    zipf.write("myCanGenerator.txe")

# ÎÒÃÇÖªµÀ´ËÉ豸ÒÑÁ¬½Óµ½CANlibͨµÀ0
channel = 0

# ´ò¿ªÉ豸²¢ÊéдѹËõÎĵµ 
with canlib.openChannel(channel=channel) as ch:
    # ÒòΪSD¿¨ÊÇÓÃFAT¸ñʽ»¯µÄ, ÎÒÃÇÓ¦¸ÃʹÓÃÒ»¸ö8.3¸ñʽµÄÎļþÃû×÷ΪĿ±êÎļþÃû
    ch.fileCopyToDevice("config.zip", "config.zip")

Áбí 12:ÓÃѹËõÎĵµÏÂÔØÃ÷È·ÎÄ×ÖÅäÖá£


3.4¶ÁÈ¡½á¹û²¢±£´æµ½ÎļþÉÏ

µ±´ËÉ豸½øÈëÏÖ³¡ÔËÐк󣨼´ÎÒÃÇͨ¹ýCAN½Óͷͨµç²¢ÔËÐнű¾£©£¬ÎÒÃÇ¿ÉÒÔÔٴν«É豸Á¬½Óµ½¼ÆËã»úÉϲ¢¶ÁÈ¡ÒѼǼµÄÊý¾Ý6?¡£

ΪÁ˽«À´±£´æÊý¾Ý£¬ÎÒÃÇÏÖÔÚʹÓÃkme50¸ñʽ½«Êý¾ÝдÈëÎļþ¡£´Ë¸ñʽ¿ÉÔÚÖ®ºóʹÓÃת»»Æ÷ – °üÀ¨ÔÚÔÆº£ÓÎÏ· Memorator Config ToolÖÐ – ת»»Îª¶àÖÖ¸ñʽ¡£

ËùÓмǼÎļþÖеĵÚÒ»¸öÌõÄ¿¶¼°üº¬Óйش洢É豸µÄÐÅÏ¢¡£ÎÒÃÇÔÚÕâÀïÀûÓÃÕâ¸öÌØµã£¬½«²¿·ÖEANºÍÐòÁкżӵ½Éú³ÉµÄ.kme50ÎļþµÄÃû³ÆÖС£

µ±´ÓÉ豸ÖжÁÈ¡µ½ËùÓмǼÎļþºó£¬ÎÒÃǽ«É¾³ýÉ豸ÉϵļǼÎļþ£¬ÒÔ±ãΪеļǼ²Ù×÷×öºÃ×¼±¸£¨Öظ´Ê¹ÓÃÏàͬµÄÅäÖã©¡£

# 10_¶ÁÈ¡_ÒѼǼµÄ_Êý¾Ý.py
import glob
import os

from canlib import EAN, VersionNumber
from canlib import kvmlib

# ÎÒÃÇ֮ǰ¿´µ½ÎÒÃǵÄÉ豸Á¬½Óµ½ CANlib ͨµÀ 0
channel = 0

# ½«´æ·Å½á¹ûÎļþµÄĿ¼
resultDir = "result"

# È·ÈϽá¹ûĿ¼´æÔÚ¶øÇÒÊÇ¿ÕÏеÄ
if os.path.isdir(resultDir):
    files = glob.glob(os.path.join(resultDir, "*"))
    for f in files:
        os.remove(f)
else:
    os.mkdir(resultDir)
os.chdir(resultDir)

# ´ò¿ªÉ豸²¢×°ÉÏ´æ´¢ÇøÅäÖà 
# É豸ÀàÐÍ kvmDEVICE_MHYDRA_EXT ÊÇȱʡÉèÖÃ
# ×¢Òâ openDevice() ¿ÉÄܻῴµ½KvmDiskNotFormated
with kvmlib.openDevice(channel_number=channel, mount=True) as memorator:
    lio_data_format = memorator.log.ldf_version
    # È·ÈÏSD¿¨µÄLIO Êý¾Ý¸ñʽ·ûºÏÉ豸ÀàÐÍ£¬ÎÒÃÇÓôËÀàÐÍÀ´´ò¿ª¸ÃÉ豸
    if lio_data_format != VersionNumber(major=5, minor=0):
        if lio_data_format == VersionNumber(major=3, minor=0):
            raise ValueError('This log file can be read if you reopen the'
                             ' device as kvmDEVICE_MHYDRA.')
        raise ValueError('Unexpected Lio Data Format: ' + str(lio_data_format))

    # ¶ÁÈ¡¼Ç¼ÏÂÀ´µÄ¼Ç¼ÎļþÊýÁ¿
    num_log_files = len(memorator.log)
    print("Found {num} file(s) on card: ".format(num=num_log_files))

    # Ñ¡ÔñËùÓмǼÎļþ²¢½«ËüÃǵÄÄÚÈÝÊéдµ½.kme50 Îļþ
    for i, log_file in enumerate(memorator.log):
        print("\n==== File {index}: {start} - {end}, approx {num} events".
              format(index=i,
                     start=log_file.start_time,
                     end=log_file.end_time,
                     num=log_file.event_count_estimation()))
        # µÚÒ»¸ö¼Ç¼Ê¼þ°üÀ¨É豸ÐÅÏ¢
        event_iterator = iter(log_file)
        first_event = next(event_iterator)
        ean = EAN.from_hilo([first_event.eanHi, first_event.eanLo])
        serial = first_event.serialNumber
        # °ÑEANºÍϵÁкÅÌí¼Óµ½ÎļþÃûÉÏ
        logfile_name = ('log_{ean}_{sn}_{index:03}.kme50'.
                        format(ean=str(ean), sn=serial, index=i))
        print('Saving to:', logfile_name)
        with kvmlib.createKme(logfile_name) as kme:
            print(first_event)
            kme.write_event(first_event)
            for event in event_iterator:
                # °ÑʼþÊéдµ½stdoutÉÏ
                print(event)
                kme.write_event(event)

    # ɾ³ýËùÓмǼÎļþ
    # memorator.log.ɾ³ýËùÓÐÎļþ()

Áбí 13:¶ÁÈ¡ÒѼǼµÄÊý¾Ý²¢±£´æµ½.kme50ÎļþÉÏ¡£

ÔËÐÐÉÏÃæµÄ³ÌÐò£¬Ôڴ˼ǼÀï³öÏÖµÄÿ¸öͨµÀÉÏ£¬ÎÒÃÇÄÜ¿´µ½6¸ö±¨ÎÄ¡£

Found 1 file on card: 

==== File 0: 2018-08-09 15:19:45 - 2018-08-09 15:19:51, approx 20 events
Saving to: log_73-30130-00819-9_11573_000.kme50
*t:             - EAN:73-30130-00819-9  s/n:11573  FW:v3.11.557  LIO:v5.0
 t:   2.824746112  DateTime: 2018-08-09 15:19:45
 t:   2.824746112 Log Trigger Event (type: 0x2, trigno: 0x01, pre-trigger: 0, post-trigger: 0)

 t:   2.824746112  ch:1 f:    2 id:   3 dlc: 8 d:12 21 13 31 22 34 41 15
 t:   2.824746137 Log Trigger Event (type: 0x2, trigno: 0x01, pre-trigger: 0, post-trigger: 0)

 t:   2.824746137  ch:0 f:   42 id:   3 dlc: 8 d:12 21 13 31 22 34 41 15
 t:   3.824770237  ch:1 f:    2 id:   4 dlc: 8 d:12 21 13 31 22 34 41 15
 t:   3.824770262  ch:0 f:   42 id:   4 dlc: 8 d:12 21 13 31 22 34 41 15
 t:   4.824788362  ch:1 f:    2 id:   5 dlc: 8 d:12 21 13 31 22 34 41 15
 t:   4.824788387  ch:0 f:   42 id:   5 dlc: 8 d:12 21 13 31 22 34 41 15
 t:   5.824810487 Log Trigger Event (type: 0x2, trigno: 0x01, pre-trigger: 0, post-trigger: 2500)

 t:   5.824810487  ch:1 f:    2 id:   6 dlc: 8 d:12 21 13 31 22 34 41 15
 t:   5.824810512  ch:0 f:   42 id:   6 dlc: 8 d:12 21 13 31 22 34 41 15
 t:   6.824826612  ch:1 f:    2 id:   7 dlc: 8 d:12 21 13 31 22 34 41 15
 t:   6.824826637  ch:0 f:   42 id:   7 dlc: 8 d:12 21 13 31 22 34 41 15
 t:   7.824851737  ch:1 f:    2 id:   8 dlc: 8 d:12 21 13 31 22 34 41 15
 t:   7.824851762  ch:0 f:   42 id:   8 dlc: 8 d:12 21 13 31 22 34 41 15

²ÎÔIJ©¿Í?Examining logged data with kvmlib and Python?ÉϵÄÁíÒ»¸ö·¶Àý ¨C ÓйØÔõÑùʹÓÃkvmlib¶Áȡһ¸öÉ豸µÄÊý¾Ý¡£


3.5 ´ÓÉ豸É϶ÁÈ¡ÅäÖá£

֮ǰ£¬ÎÒÃǽ«ÅäÖõĸ±±¾·ÅÔÚSD¿¨µÄconfig.zipÎļþÖУ¬ÏÖÔÚ¿ÉÒÔʹÓÃCANlib¶ÁÈ¡ËùÓÐÓû§Îļþ£¬È»ºó¿ÉÒÔʹÓÃ7-zip7´ò¿ª½á¹ûÎļþ¡£

# 11_¶ÁÈ¡_ÅäÖÃ_´Ó_É豸.py
import os

from canlib import canlib

# ÎÒÃǵÄÉ豸ÊÇÁ¬½Óµ½ CANlib ͨµÀ 0
channel = 0

# ´ò¿ªÉ豸
with canlib.openChannel(channel=channel) as ch:
    # ÁгöÉ豸ÉϵÄÎļþ
    numFiles = ch.fileGetCount()

    if numFiles:
        for i in range(numFiles):
            name = ch.fileGetName(i)
            # Ìø¹ýÒÑÖªÎļþ
            if (os.path.splitext(name)[1].lower() == '.kmf'
                    or name.lower() == 'param.lif'
                    or name.lower() == 'database.bin'):
                print('Skipping', name)
            else:
                # ¸´ÖÆÓû§Îļþµ½µçÄÔ
                print('Copying: ', name)
                ch.fileCopyFromDevice(name, name)

Áбí 14: ´Ó ÔÆº£ÓÎÏ·É豸Éϸ´ÖÆÓû§Îļþ¡£

ÖÁ´Ë±¾ÎÄÌÖÂÛÁËÓÃkvmlibÉèÖÃʱ¼äºÍÅäÖÃÎÒÃǵÄÔÆº£ÓÎÏ· MemoratorÉ豸¡£ÎÒÃǽ«ÔÚÏÂÒ»²¿·Ö£¬Ò²ÊDZ¾ÏµÁв©¿ÍµÄ×îºóÒ»²¿·Ö£¬½éÉܵ±ÎÒÃÇÖ»ÄÜ´¦ÀíSD¿¨Ê±£¬ÔõÑù½øÐвÙ×÷£¬Ö®ºó½«Ëü²åÈëÔÆº£ÓÎÏ· Memorator É豸ÖС£


×¢ÊÍ

1 Read more in the post Was that the CANlib channel number or Card Number?

2 The LIO data format is the specification on how to store data on the SD card. The latest LIO data format, v5.0, is capable of handling the larger data frames that can be generated by CAN FD.

3?Firmware earlier than 3.0 should use device type kvmDEVICE.MHYDRA.

4?µ±Äãµã»÷¡°Save?Configuration and Databases on the Disk£¨±£´æÅäÖúÍÊý¾Ý¿âµ½¿¨ÉÏ£©¡±Ê±£¬ÕâºÍ?ÔÆº£ÓÎÏ· Memorator Config Tool?µÄ¹¦ÄÜÏàËÆ¡£´Ë¹¤¾ßÈ»ºó½«°ÑʹÓùýµÄÅäÖúÍÊý¾Ý¿âÎļþ·ÅÈë?DATABASE.BINÎļþ¡£

5?ÔÚ±¾²©¿ÍµÄµÚ¶þ²¿·Ö,?Adding script and triggers to a configuration.£¨ÎªÅäÖÃÌí¼Ó½Å±¾ºÍ´¥·¢µã
£©¡£

6?ÎÒÃǺܿÉÄÜ»¹Ó¦¸ÃÔÚÕâÀï¼ì²éLIOÊý¾Ý¸ñʽ°æ±¾, ²ÎÕÕÎÒÃÇ֮ǰµÄ³õʼ»¯´úÂëÀ´Á˽âÔõÑù²Ù×÷¡£

7?7-zipÊÇÒ»¸ö¿ª·Å×ÊÔ´Windowsµµ°¸´¦ÀíʹÓù¦ÄÜ, Çë¼û?www.7-zip.org?Á˽â¸ü¶àÐÅÏ¢¡£



±¾ÎÄÒѸüС£ Òª²é¿´Ô­¼þ£¬Çëµ¥»÷ÏÂÃæµÄ¿ò¡£

Author Image

Magnus Carlsson

Margus CarlssonÊÇÔÆº£ÓÎÏ· AB¹«Ë¾µÄÈí¼þ¿ª·¢ÈËÔ±£¬´Ó2007ÄêÒÔÀ´Éî¶È²ÎÓëÁËÔÆº£ÓÎÏ·¹Ì¼þºÍÈí¼þµÄ¿ª·¢¡£Ëû»¹ÎªÔƺ£ÓÎÏ·µÄ¼¼Êõ²©¿Í׫дÁËÐí¶àÓÃÁ÷ÐеÄPythonÓïÑÔ±àдӦÓóÌÐòµÄÎÄÕ¡£

¡¾ÍøÕ¾µØÍ¼¡¿¡¾sitemap¡¿