¼¼Êõ²©¿Í

30/03/2018 ×÷Õß ÔÆº£ÓÎÏ·

ÓÃPython´¦ÀíCANÊý¾Ý¿â

ÕâÊǽéÉÜÈçºÎÓÃÔÆº£ÓÎÏ·Êý¾Ý¿â(kvadblib)ºÍPython¹ÜÀíDBCÊý¾Ý¿âµÄ²©¿ÍµÚÒ»²¿·Ö£¨×ܼÆÎª2²¿·Ö£©£º

  1. ÔÚPythonÀï´¦ÀíCANÊý¾Ý¿â
  2. ·¢ËͺͽÓÊÕÊý¾Ý¿âÐźÅ

Ëæ×ÅCANlib SDKÈí¼þ¿ª·¢°üv5.22µÄ·¢²¼, Êý¾Ý¿â(kvaDbLib) ÐÔÄÜÔöÇ¿£¬Í¬Ê±Python canlib °ü×°º¯Êý°ü(v1.5) ͨ¹ýkvadblib Ä£¿é¼ÓÇ¿Á˶ÔÊý¾Ý´¦ÀíµÄÖ§³Ö¡£´Ë kvaDbLibÊý¾Ý¿âÊÇÓÃÀ´Éú³É£¬Êéд£¬¶ÁÈ¡ºÍÐÞ¸ÄDBC Êý¾Ý¿â¡£[1]?ÔÚÕâµÚһƪ²©¿ÍÀÎÒÃÇÏȽéÉÜÔõÑùÓÃPython canlib°ü×°º¯Êý°üÉú³ÉºÍ¼ìÑéÒ»¸öDBC Êý¾Ý¿â¡£ Õâ¸öPython canlib°üÊÇÒÔPython WheelÎļþ·¢²¼µÄ£¬ÒÔ±ã?using pip install°²×°¡£Èç¹ûÄ㻹û°²×°Ëü£¬Çë²ÎÔIJ©¿Í?¡®Python samples are now bundled in a package[2]?£¨Python ·¶ÀýÏÖÔÚÒѰüº¬ÔÚÒ»¸öÈí¼þ°üÀ¡¯Á˽â¸ü¶àÕâ·½ÃæµÄ½éÉÜ¡£


Éú³ÉÒ»¸öÊý¾Ý¿â

ÎÒÃÇÐèÒªÒ»¸öÊý¾Ý¿âÀ´°Ñԭʼ CAN Êý¾Ýת»»ÎªÈ˹¤¿É¶ÁÐźÅ¡£ÔÚ±¾·¶ÀýÖÐÎÒÃÇʹÓÃÒ»¸ö¼ÙÉèµÄÆû³µÊý¾Ý¿â¡£

ÈÃÎÒÃÇÏÈ´ÓÍ·¿ªÊ¼Éú³ÉÊý¾Ý¡£Ê×ÏÈ£¬ÎÒÃÇ´Ócanlib python°üÒý½økvadblib£¬Éú³ÉÒ»¸öÃûΪ¡°Histogram¡±[3]?µÄÊý¾Ý¿â, ¼ÓÉÏÒ»¸ö±êʶ·ûΪid ¡°402¡±±¨ÎÄ, dlc ¡°8¡± ²¢ÃüÃû´Ë±¨ÎÄΪ ¡°LIM_002¡±¡£

from canlib import kvadblib

# Éú³ÉÒ»¸öÊý¾Ý¿â
db = kvadblib .Dbc(name=’Histogram ’ )

# ¼ÓÉϱ¨ÎÄ
message = db.new_message(name=’LIM_002’ ,
			 id=402,
			 dlc=8)

ÏÂÒ»²½ÊÇÔÚÎÒÃǸոÕÉú³ÉµÄ±¨ÎÄÉϼÓÒ»¸öÐźÅ¡£ÈÃÎÒÃǼÓÒ»¸öÃûΪ¡°Load¡±?µÄfloat?£¨¸¡±ê£©Ðźţ¬´ËÐźŸ½´øÁËÒ»¸öµ¥Î»ºÍÆÀÂÛÎÄ×Ö¡£

message . new_signal(
       name=’Load ’ ,
       type=kvadblib . SignalType .FLOAT,
       byte_order=kvadblib . SignalByteOrder .INTEL, # Ô¤ÉèÖµ
       mode=kvadblib . SignalMultiplexMode .MUX_INDEPENDENT, # Ô¤ÉèÖµ
       size=kvadblib . ValueSize( startbit=0, length=32) ,
       scaling=kvadblib . ValueScaling( factor=1, offset=0) ,
       limits=kvadblib . ValueLimits(min=0, max=100) ,
       unit=’ metric ton ’ ,
       comment=’Measured load in system . ’ )

ÔÚÉú³ÉÒ»¸öÐźÅʱ£¬ÎÒÃÇÒªÏÞ¶¨ºÜ¶à·½ÃæµÄÐÅÏ¢£¬ÏÖÔÚÎÒÃÇÀ´¿ìËÙ¿´Ò»ÏÂÕâЩѡÏî:

Ãû×Ö¸ø´ËÐźÅÒ»¸öÌØ±ðµÄ×Ö´®¡£Õâ¸öÃû×Ö±ØÐëÊÇÔÚÕû¸öÊý¾Ý¿âÀï¶ÀÒ»ÎÞ¶þµÄ¡£

ÀàÐÍ´ËÐźſɱ»ÉèΪ?SIGNED,?UNSIGNED, (DOUBLE[4]?), »ò?FLOAT¡£ Õâ¸öÐźÅÒ²¿ÉΪÁоÙÐźÅ,ÄÇÑùÎÒÃǾÍÔÚPython°üÀï°ÑÐźÅÉèΪ?ENUM_SIGNED?»òENUM_UNSIGNED¡£

ģʽ?The signal byte order can be either?INTEL?or?MOTOROLA, defaults to?INTEL.

ģʽ ÐźŵÄÔ¤ÉèģʽÊÇ?MUX_INDEPENDENT, Ò²¾ÍÊÇ˵ÕâÊÇÒ»¸öÆÕͨÐźÅ¡£[5]?ÔÚÒ»¸öCAN ±¨ÎÄÖУ¬Èç¹û½«Ä£Ê½ÉèΪ?MUX_SIGNAL£¬Ò»¸öÐźÅÒ²¿É±»¶¨ÒåΪÊý¾ÝÑ¡ÔñÆ÷¡£ÏÖÔÚÕâ¸öÊý¾ÝÑ¡ÔñÆ÷ÔÚÕâ¸ö±¨ÎÄÖ¡ÀïÑ¡Ôñ´«ÊäÄĸö¶à·Êý¾Ý¡£´Ë¶à·Êý¾ÝÓ¦±»ÉèΪËüÓ¦ÓеÄÕýÕûÊýÖµ£¬ÕâÑùÕâ¸ö¶à·Êý¾ÝÐźŲÅÄܱ»Ê¹Óá£kvadblibĿǰֻ֧³Ö¼òµ¥µÄ¶à·Êý¾Ý¡£¶Ô¼òµ¥¶à·´«ÊäÀ´Ëµ£¬Ö»Óжà·Êý¾ÝÆ÷ÐźÅÄÜÔÚÒ»¸ö±¨ÎÄÀï±»¶¨Ò壬¶Ôÿ¸ö¶à·Êý¾ÝÐźÅÀ´Ëµ£¬Ö»Äܶ¨ÒåÒ»¸ö¶à¼Êý¾ÝÆ÷Öµ¡£

´óСÕâ¸öÐÅºÅµÄÆðʼλ (ÓÖ³ÆÎªstartbit), ºÍËüµÄ³¤¶È£¬ÒÔbitÊýÀ´¶ÈÁ¿¡£

±ÈÀý±ÈÀýÓÐÒ»¸öϵÊýºÍÒ»¸öµ÷ÕûÁ¿¡£Ò»¸öԭʼCANÖµ³ËÒÔÕâ¸öϵÊý£¬È»ºóÔÙÓɵ÷ÕûÁ¿ÔöÖµ£¬¾Í±»×ª»»ÎªÒ»¸öÎïÀíÖµ¡£

ÏÞÖÆ´ËÐźŵÄ×îСºÍ×î´óÎïÀíÖµ¡£

µ¥Î» Ò»¸ö×Ö´®´ú±íÕâ¸öÐźŵĵ¥Î»¡£

×¢ÊÍ Ò»¸ö×Ö´®ÓÃÀ´¼Ç¼´ËÐźš£

ÈÃÎÒÃÇÒÔ¶¨ÒåÁíÍâÈý¸ö±¨ÎĺÍÐźÅÀ´Íê³ÉÕâ¸öÊý¾Ý¿â¡£

message = db.new_message(name=’ECM_004’ ,
                         id=504,
                         dlc=8)

message . new_signal(name=’Fuel ’ ,
                     type=kvadblib . SignalType .FLOAT
                     size=kvadblib . ValueSize( startbit=0, length=32) ,
                     limits=kvadblib . ValueLimits(min=0, max=300) ,
                     unit=’ l /100 km’ ,
                     comment=’Current fuel consumption . ’ )

message = db.new_message(name=’ECM_003’ ,
                         id=503,
                         dlc=8)

message . new_signal(name=’EngineTemp ’ ,
                     type=kvadblib . SignalType .FLOAT,
                     size=kvadblib . ValueSize( startbit=0, length=32) ,
                     limits=kvadblib . ValueLimits(min=-60, max=200) ,
                     unit=’ Celsius ’ ,
                     comment=’System temperature consumption . ’ )

message = db.new_message(name=’ECM_001’ ,
                         id=501,
                         dlc=8)

message . new_signal(name=’EngineSpeed ’ ,
                     type=kvadblib . SignalType .UNSIGNED,
                     size=kvadblib . ValueSize( startbit=0, length=32) ,
                     limits=kvadblib . ValueLimits(min=0, max=6000) ,
                     unit=’rpm’ ,
                     comment=’Current engine speed . ’ )

×îºóÒ»²½ÊǰÑÎÒÃǵÄÐÂÊý¾Ý¿â´æµ½Ò»¸öÎļþÀï²¢¹ØÉÏËü¡£

# дÊý¾Ý¿âÎļþ
db. write_file ( ’db_histogram . dbc ’ )
db. close ()

¼ì²âÎÒÃǵÄÊý¾Ý¿â

ÈÃÎÒÃÇÀ´¿´Ò»ÏÂÎÒÃǸոÕÉú³ÉµÄDBC Êý¾Ý¿â¡£ÎÒÃÇ´ÓPythonÊéдÄÚÈÝ¿ªÊ¼:

import textwrap
from canlib import kvadblib

with kvadblib .Dbc( filename=’db_histogram . dbc ’ ) as db:
    print (db)
    for message in db:
        print ( ’\n {} ’ . format(message) )
        for signal in message :
            print (textwrap . f i l l ( ’ {} ’ . format( signal ) , 80))

ʹÓÃtextwrapÄ£¿éÀ´Éú³ÉÒ»¸ö¼ò½àµÄ80×Ö¿íÊä³ö:

Dbc db_histogram: flags:0, protocol:CAN, messages:4

 Message(name=’LIM_002’, id=402, flags=<MessageFlag.0: 0>, dlc=8, comment=’’)
  Signal(name=’Load’, type=<SignalType.FLOAT: 3>,
byte_order=<SignalByteOrder.INTEL: 0>, mode=-1, size=ValueSize(startbit=0,
length=32), scaling=ValueScaling(factor=1.0, offset=0.0),
limits=ValueLimits(min=0.0, max=100.0), unit=’metric ton’, comment=’Measured
load in system.’)

  Message(name=’ECM_004’, id=504, flags=<MessageFlag.0: 0>, dlc=8, comment=’’)
   Signal(name=’Fuel’, type=<SignalType.FLOAT: 3>,
byte_order=<SignalByteOrder.INTEL: 0>, mode=-1, size=ValueSize(startbit=0,
length=32), scaling=ValueScaling(factor=1.0, offset=0.0),
limits=ValueLimits(min=0.0, max=300.0), unit=’l/100 km’, comment=’Current fuel
consumption.’)

  Message(name=’ECM_003’, id=503, flags=<MessageFlag.0: 0>, dlc=8, comment=’’)
   Signal(name=’EngineTemp’, type=<SignalType.FLOAT: 3>,
byte_order=<SignalByteOrder.INTEL: 0>, mode=-1, size=ValueSize(startbit=0,
length=32), scaling=ValueScaling(factor=1.0, offset=0.0),
limits=ValueLimits(min=-60.0, max=200.0), unit=’Celsius’, comment=’System
temperature consumption.’)

  Message(name=’ECM_001’, id=501, flags=<MessageFlag.0: 0>, dlc=8, comment=’’)
   Signal(name=’EngineSpeed’, type=<SignalType.UNSIGNED: 2>,
byte_order=<SignalByteOrder.INTEL: 0>, mode=-1, size=ValueSize(startbit=0,
length=32), scaling=ValueScaling(factor=1.0, offset=0.0),
limits=ValueLimits(min=0.0, max=6000.0), unit=’rpm’, comment=’Current engine
speed.’)

Ï£ÍûÕâÀï²»ÒªÓÐʲô²»Õý³££¬ËùÒÔÈÃÎÒÃÇ¿´Ò»ÏÂÎÒÃǵÄÊý¾Ý¿âÔÚÔÆº£ÓÎÏ· Êý¾Ý¿â±à¼­Æ÷ÀïÊÇÔõôÑù¡£

ͼ1:ÔÚÔÆº£ÓÎÏ· Êý¾Ý¿â±à¼­Æ÷Àï¿´ÎÒÃǵÄÊý¾Ý¿â¡£

ÔÚÔÆº£ÓÎÏ·Êý¾Ý¿â±à¼­Æ÷µÄÖмä¿òÀÎÒÃÇÄÜ¿´µ½4¸öÒѶ¨ÒåµÄ±¨ÎÄ¡£ÔÚͼ1ÖÐ1, ±¨ÎÄ¡°LIM_002¡±±»Ñ¡Ôñ£¬¸Ã±¨ÎĵÄÄÚÈÝÏÔʾÔڴ˱¨ÎÄÏÂÃæ¡£ÔÚÎÒÃǵÄÀý×ÓÀÓÐÒ»¸öÃûΪ¡°Load¡±µÄÐźţ¬ËüµÄµ¥Î»unit±»ÉèΪ¡°metric ton¡±¡£ÔÚÓұߵķ½¿òÖУ¬µ±Ç°±¨ÎĵÄÊý¾ÝbitsÒÔÒ»¸ö²¼¾Ö(ÓÐÒõÓ°µÄ¸ñ×Ó)ÏÔʾ¡£ ÔÚͼÖÐ?1, ÎÒÃÇÄÜ¿´µ½±»Ñ¡ÖеÄÐźÅÊÇ´ÓµÚÒ»¸öbyte µÄbit 0 µ½µÚÈý¸öbyteµÄbit 7£¬ ÕâºÍ¿ªÊ¼Î»ÖÃ0ºÍ¸ø³öµÄ³¤¶È32Ïà¶ÔÓ¦¡£

ÕâÑùÎÒÃǾͽáÊøÁ˴˲©¿ÍµÄµÚÒ»²¿·Ö£¬½éÉÜÔõÑùÉú³ÉÒ»¸öÊý¾Ý¿â¡£ÔÚÏÂÒ»¸ö²¿·ÖÎÒÃǽ«¿´Ò»ÏÂÔÚ·¢ËͺͽÓÊÕÐźÅʱÔõÑùʹÓÃÊý¾Ý¡£


×¢ÊÍ

1?DBC Êý¾Ý¿âÃèÊöCAN ×ÜÏßµÄÊôÐÔ£¬¸÷Á¬½Ó½Úµã£¬ºÍCAN ±¨Îļ°ÐźÅ¡£.

2??https://www.kvaser.com/developer-blog/python-samples-now-bundled-package/

3?Èç¹ûÄã¿´¹ýCANlib SDK Èí¼þ¿ª·¢°üµÄt ·¶ÀýCANlib SDK£¬Äã¿ÉÄܼû¹ýÕâ¸öÌØ±ðµÄÊý¾Ý¿â£¬ÒòΪÄã¿ÉÒÔÔÚÎļþ¼Ðfolder Samples\tScript\Learn more\Misc\histogram ÄÇÀï¿´µ½Ëü¡£

4?kvadblibĿǰ²»Ö§³ÖDOUBLE?ÐÍÐźÅ¡£

5 ÎÒÃÇÖ»Ôڴ˲©¿ÍÀï½éÉÜÆÕͨ(·ÇÑ¡ÔñÊý¾Ý) ÐźÅ¡£

Author Image

whind gutr

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