使用CANOE进行CAN总线的DBC文件制作
- 格式:docx
- 大小:347.94 KB
- 文档页数:8
竭诚为您提供优质文档/双击可除can,dbc文件协议篇一:dbc编辑器使用说明书dbc文件配置向导一、软件安装双击安装程序,开始安装该软件,一路点击“下一步”安装下去,直至“完成”,就完成了该软件的安装。
备注:安装完毕后,会在桌面生成四个图标:can总线协议编辑器、k_line协议编辑器、ccp_daq编辑器、idc诊断协议编辑器。
用户只需使用第一个:can总线协议编辑器。
二、新增车型1、打开can总线协议编辑器,点击新增车型标识(点击红色方框即可),弹出如下对话框,填写车型名称。
三、新增节点点击红色框图部分,增加节点,弹出如下对话框,填写ecu名称即可。
四、配置can报文配置can报文分两步:第一步,配置can报文,即配置每条can报文的id、类型以及对应的信号。
第二步,配置can信号,即配置所有can报文里包含的所有信号;配置can报文选中一个ecu,右键点击该ecu,在右键菜单中选择新增can报文随即弹出一个对话框1、在“报文名称”项填写can报文的名称。
注明:同一个dbc文件中不允许出现重复使用的报文名称2、选择can报文属于标准帧还是扩展帧3、在“报文id”内填写can报文的十六进制id4、dlc表示在数据帧时实际数据长度。
配置完报文后再选择添加在该报文下的信号,即选中该报文,在右键菜单中选择“新增信号”,如下图:弹出如下选项框按照报文里的can信号顺序依次添加can信号。
注意事项:1、在信号名称栏填写该can信号的名称2、开始位栏填写该信号开始的bit位,位数量栏填写该can信号的长度,以bit为单位。
3、在字节序栏选择该can信号的字节序intel——小端字节序,即低字节在前,高字节在后motorola——大端字节序,即高字节在前,低字节在后5、在数据类型栏填写该信号类型7、在增益栏设置信号的乘积系数,在偏置栏填写偏置值因为实际值=增益值*can信号数值+偏置值8、在maximum和minimum栏填写实际值的最大值和最小值例如:如果can信号为8bit,增益值为2,偏置值为4,接收到的数据为00000101,那么实际值=2*5+4=144、在单位栏填写该can信号的单位,例如:km,kg等五、第一步:配置can波特率选择can1、can2、can3的波特率六、第二步:选择需要的通道该步用来将配置的信号中,不需要用的信号删除掉。
License 识别在控制面板里,打开,可以查询相应的CAN 硬件。
硬件设置在 NET WORK HARDWARE新建工程File new confirgration然后选择 temp-通道扩展DB9: 7 HIGH 2 LOW , WITH THERMAL RESISITANCE for high speed canCan case: 有CAN1 CAN2,来配置 channel 1, 2 与CAN 1 CAN 2对应设置波特率、应用此窗口来扫描波特率。
采样点的设置。
一般默认值。
在数据链路层中,对CAN H/CAN L进行采样点。
问题“:采样点是如何计算出来的,并且正确设置的。
是最大最远节点间的延迟时间的2倍的%。
注意:simulated bus是接收不到信号的。
添加模块进行仿真时,仍然选择real bus。
左键点击ECU 1,按Space 键,进行使能此模块。
此模块编译.can 文件。
TraceGraphic点击右键加载信号需要两个Trace 窗口添加过滤器,添加CAN DBC 编辑-----设计、仿真、测试、分析设计首先CAN上面要有两个以上的节点,这样才能完成通讯,应答关系。
命题:Node 1—sw ECU ,Node 2 –Light ECUNode 1: tX:SW- Command 0x123Rx:SW-linght responseNode 2: rX:SW- Command 0x123tx:SW-linght responseSignal : SW- Command, light response,Envirement variable: sw, light新建 file configure.--open db editorCreat one new dbCAN type: standard 11 bit ectend 29 bits建立好了 node message signal关联之间关系。
CAN通讯进阶-基于Python使⽤dbc⽂件解析CAN数据(dbc⽂件的创建、使⽤⽅法)CAN通讯进阶-基于Python使⽤DBC⽂件解析CAN数据配置环境使⽤环境:python3.6平台:Windows10IDE:PyCharm1.环境配置1.1安装CAN通讯需要的包pip install canlib1.2 安装kvaser_drivers以及Kvaser CanKing下载下来之后的⽂件是这样的,三个⽂件依次双击安装就⾏了安装完后,在开始栏可以查看到已经安装好了2.使⽤DBC⽂件解析CAN帧2.1DBC⽂件DBC是Database Can的缩写,其代表的是CAN的数据库⽂件,在这个⽂件中把CAN通讯的信息定义的⾮常完整清楚,在Windows下其存在的格式便是dbc,如图所⽰:有了DBC⽂件便可以对接收到的CAN帧进⾏解析,分析⼀系列CAN帧代表的真实物理含义。
正因为如此,每⼀个DBC⽂件都对应着⼀种CAN帧的规则,使⽤CAN作为通讯⼿段的设备(如汽车中发动机、车灯、车载空调等等)都有对应的DBC⽂件。
2.2本博客布局本博客将从DBC⽂件的创建、使⽤DBC⽂件发送指定格式的CAN数据、使⽤DBC⽂件解析接收到的CAN数据来展开。
3.DBC⽂件的创建3.1创建DBC⽂件代码# author:Hurricane# date: 2021/4/16# File : CAN_Create_Database.py# E-mail:hurri_cane@import argparsefrom collections import namedtuplefrom canlib import kvadblibMessage = namedtuple('Message','name id dlc signals')Signal = namedtuple('Signal','name size scaling limits unit')EnumSignal = namedtuple('EnumSignal','name size scaling limits unit enums')_messages =[Message(name='EngineData',id=100,dlc=8,signals=[Signal(name='PetrolLevel',size=(24,8),scaling=(1,0),limits=(0,255),unit="l",),Signal(name='EngPower',size=(48,16),scaling=(0.01,0),limits=(0,150),unit="kW",),Signal(name='EngForce',size=(32,16),scaling=(1,0),limits=(0,0),unit="N",),EnumSignal(name='IdleRunning',size=(23,1),unit="",enums={'Running':0,'Idle':1},),Signal(name='EngTemp',size=(16,7),scaling=(2,-50),limits=(-50,150),unit="degC",),Signal(name='EngSpeed',size=(0,16),scaling=(1,0),limits=(0,8000),unit="rpm",),]),Message(name='GearBoxInfo',id=1020,dlc=1,signals=[Signal(name='EcoMode',size=(6,2),scaling=(1,0),limits=(0,1),unit="",),EnumSignal(name='ShiftRequest',size=(3,1),scaling=(1,0),limits=(0,0),unit="",enums={'Shift_Request_On':1,'Shift_Request_Off':0}, ),EnumSignal(name='Gear',size=(0,3),scaling=(1,0),limits=(0,5),unit="",enums={'Idle':0,'Gear_1':1,'Gear_2':2,'Gear_3':3,'Gear_4':4,'Gear_5':5,},),]),]def create_database(name, filename):db = kvadblib.Dbc(name=name)for _msg in _messages:message = db.new_message(name=_,)for _sig in _msg.signals:if isinstance(_sig, EnumSignal):_type = kvadblib.SignalType.ENUM_UNSIGNED_enums = _sig.enumselse:_type = kvadblib.SignalType.UNSIGNED_enums ={}message.new_signal(name=_,type=_type,byte_order=kvadblib.SignalByteOrder.INTEL,mode=kvadblib.SignalMultiplexMode.MUX_INDEPENDENT,size=kvadblib.ValueSize(*_sig.size),scaling=kvadblib.ValueScaling(*_sig.scaling),limits=kvadblib.ValueLimits(*_sig.limits),unit=_sig.unit,enums=_enums,)db.write_file(filename)db.close()if __name__ =='__main__':parser = argparse.ArgumentParser(description="Create a database from scratch.")parser.add_argument('--filename', default=r'..\engine_example.dbc',help=("The filename to save the database to."))parser.add_argument('-n','--name', default='Engine example',help=("The name of the database (not the filename, the internal name."))args = parser.parse_args()create_database(, args.filename)3.2使⽤⽅法代码中if __name__ == '__main__':下:parser.add_argument('--filename', default=r'..\engine_example.dbc',help=("The filename to save the database to."))指定的filename为创建的DBC⽂件的路径以及⽂件名,本代码中便是将DBC⽂件存在代码所在⽬录的上层⽬录中,以engine_example.dbc⽂件名保存代码中_messages列表便是定义CAN帧解析的规则,可以定义:CAN帧的idCAN帧的数据长度CAN帧的解析single规则等等…创建⽅式如下:4.DBC⽂件发送指定格式的CAN数据4.1DBC⽂件发送指定格式的CAN数据代码# author:Hurricane# date: 2021/4/12# File : CAN_Random_Send.py# E-mail:hurri_cane@import argparseimport timeimport randomfrom canlib import canlib, kvadblibbitrates ={'1M': canlib.canBITRATE_1M,'500K': canlib.canBITRATE_500K,'250K': canlib.canBITRATE_250K,'125K': canlib.canBITRATE_125K,'100K': canlib.canBITRATE_100K,'62K': canlib.canBITRATE_62K,'50K': canlib.canBITRATE_50K,'83K': canlib.canBITRATE_83K,'10K': canlib.canBITRATE_10K,}# 随机在dbc结构中抽取⼀个结构def set_random_framebox_signal(db, framebox, signals):sig = random.choice(signals)value = get_random_value(db, sig)framebox.signal().phys = value# 随机在抽取到的结构帧的数值范围中产⽣⼀个值def get_random_value(db, sig):limits = sig.limitsvalue = random.uniform(limits.min, limits.max)# round value depending on type...if(sig.type is kvadblib.SignalType.UNSIGNED orsig.type is kvadblib.SignalType.SIGNED):# ...remove decimals if the signal was of type unsignedvalue =int(round(value))else:# ...otherwise, round to get only one decimalvalue =round(value,1)return valuedef ping_loop(channel_number, db_name, num_messages, quantity, interval, bitrate, seed=0): db = kvadblib.Dbc(filename=db_name)ch = canlib.openChannel(channel_number, canlib.canOPEN_ACCEPT_VIRTUAL)ch.setBusOutputControl(canlib.canDRIVER_NORMAL)ch.setBusParams(bitrate)ch.busOn()random.seed(seed)if num_messages ==-1:# used_messages为dbc⽂件定义的所有帧结构used_messages =list(db)else:used_messages = random.sample(list(db), num_messages)print()print("Randomly selecting signals from the following messages:")print(used_messages)print("Seed used was "+repr(seed))print()while True:# Create an empty framebox each time, ignoring previously set signal# values.framebox = kvadblib.FrameBox(db)# Add all messages to the framebox, as we may use send any signal from# any of them.for msg in db:framebox.add_message()# Make a list of all signals (which framebox has found in all messages# we gave it), so that set_random_framebox_signal() can pick a random# one.signals =[bsig.signal for bsig in framebox.signals()]# Set some random signals to random valuesfor i in range(quantity):set_random_framebox_signal(db, framebox, signals)# Send all messages/framesfor frame in framebox.frames():print('Sending frame', frame)ch.writeWait(frame, timeout=5000)time.sleep(interval)if __name__ =='__main__':description="Send random CAN message based on a database.")parser.add_argument('channel',type=int, default=0, nargs='?',help=("The channel to send messages on."))parser.add_argument('--bitrate','-b', default='500k',help=("Bitrate, one of "+', '.join(bitrates.keys())))parser.add_argument('--db', default="../Mobileye.dbc",help=("The database file to base messages on."))parser.add_argument('-Q','--quantity',type=int, default=5,help=("The number of signals to send each tick."))parser.add_argument('-I','--interval',type=float, default=0.2,help=("The time, in seconds, between ticks."))parser.add_argument('-n','--num-messages',type=int, default=-1,help=("The number of message from the database to use, or -1 to use all."))parser.add_argument('-s','--seed', nargs='?', default='0',help=("The seed used for choosing messages. If possible, will be converted to an int. If no argument is given, a random seed will be used."))args = parser.parse_args()if args.seed is None:seed =Noneelse:try:seed =int(args.seed)except ValueError:seed = args.seedping_loop(channel_number=args.channel,db_name=args.db,num_messages=args.num_messages,quantity=args.quantity,interval=args.interval,bitrate=bitrates[args.bitrate.upper()],seed=args.seed,)4.2使⽤⽅法这份代码的功能为:以DBC⽂件规定的数据格式,随机发送⼀些数据帧出去代码中if __name__ == '__main__':下:parser.add_argument('--db', default="../Mobileye.dbc",help=("The database file to base messages on."))指定的filename为读取的DBC⽂件的路径,本代码中读取的DBC⽂件存在代码所在⽬录的上层⽬录中,以Mobileye.dbc⽂件名存在PS:这⾥⾯的DBC⽂件也可以改为3.1创建DBC⽂件代码中⽣成的engine_example.dbc⽂件此处附上两个DBC⽂件的云盘链接运⾏4.1代码:可以看到Kvaser Can King接收到各式各样的数据,但是其中的具含义我们并不清楚,这边涉及到第5节,使⽤DBC⽂件解析接收到的CAN 帧。
CANoe是Vector公司的针对汽车电子行业的总线分析工具,现在我用CANoe7.6版本进行介绍,其他版本功能基本差不多。
硬件我使用的是CAN case XL.1,CANoe软件的安装很简单,先装驱动,再装软件。
安装完成,插上USB,连接硬件,这样在控制面板中,Vector Hardware 进行查看通过查看信息可知,CANcaseXL中的两个piggy,一个是251(高速CAN),一个是7269(LIN),另外常用的还有1054(低速CAN,或称容错CAN),因为CANcaseXL中只能支持两路通讯,这样piggy可以自由组合2,硬件连接正常,打开CANoe软件File->New Configuration 可以选择新建工程的模版,我们这里选择CAN_500kBaud.tcn,这样新建了波特率为500K CAN工程,可以File->Save Configuration,进行保存3,接下来就要使用CAN db++ Editor工具对总线网络节点,消息,信号,进行定义了。
点击工具栏的这个图标,或开始菜单中找这个工具启动启动后,File->Create Database,选择CANTemplate.dbc,选择目录及文件名,进行保存右键Network nodes->New ,进行网络节点的定义,这里只需要填写Name即可,例如:Node_A然后添加Node_B,完成后如下图,这样在Network nodes目录下面添加出来两个节点节点添加完成后,下一步添加CAN消息,右键Messages->New,这是需要定义名称,ID,DLC 等信息,如下:然后在Transmitters页面,点击Add按钮,添加Node_A为发送节点,意思就是说,此消息是从Node_A节点发送出来的其实还有一种方法就是,此时暂时不定义发送节点,然后直接以拖曳的方式拖曳到发送节点上,功能上是一样的有了消息,消息里携带的东西自然是信号咯,那么我们开始创建一个信号右键Signals->New,填写如下信息信号当然要放到消息中咯,切换到Messages页面,Add 我们刚刚建立的Message_A,当然和上面一样,采用拖曳的方式从Signal到Message中建立关联也是可以的。
DBC文件是一种用于描述Controller Area Network (CAN) 通信网络上消息的格式。
它是由Vector公司开发的,并被广泛使用在汽车和其他嵌入式系统中。
DBC 文件包含了关于消息和信号的元数据信息,例如消息的ID、信号的名称、数据类型、偏移量等等。
使用DBC文件可以方便地对CAN网络进行诊断和开发。
以下是使用DBC文件的一些常见方式:
1.使用Vector CANoe等CAN总线分析仪进行读取和解析DBC文件。
这些
工具通常会提供对DBC文件的解析和查看功能,帮助用户理解网络上的
消息结构和内容。
2.在嵌入式系统中使用专门的CAN协议栈来读取和解析DBC文件。
嵌入式
系统通常会使用CAN协议栈来处理CAN总线上的数据,而DBC文件可
以提供关于消息和信号的元数据信息,帮助系统正确地解析和处理数据。
3.在开发过程中,可以使用DBC文件来生成测试用例和验证网络通信的正
确性。
例如,可以将DBC文件导入到仿真环境中,生成虚拟的CAN消
息,以便于进行测试和验证。
总之,DBC文件是一种非常重要的工具,可以帮助用户理解和处理CAN通信网络的数据。
DBC和CANdb++1.简介CAN总线数据帧中的原始信号均为数字(可显示为十六进制或者十进制等等)。
在实际trace解析中,仅仅解析原始数字,效率会相当低下。
因此引入DBC(CAN数据库)的概念。
DBC数据库可以将原始数字解析为信号,DBC相当于一部针对原始数字的“百科词典”。
CANoe软件中用CANdb++编辑DBC。
2.DBC介绍DBC自下而上分别为Signals->Messages->Network nodes,自下而上是从属关系,即Messages中包含Signals,Network nodes中包含多个Messages。
创建DBC的过程一般也是自下而上的过程,即先创建Signal;再创建Message, 将signal加入到Message中;将Message加入到Network Nodes中。
环境变量类似于系统变量,可用于CAPL中作为中间变量,实现一些复杂的功能。
3. CANdb++ 介绍CANdb++是CANoe中一个独立的模块。
启动CANoe软件后,Tools->CANdb++Editor中打开指定的数据库。
也可直接双击打开.dbc的文件。
如果CANdb++Editor中没有数据库,说明当前配置中还没有添加数据库。
添加数据库:右下角进入configuration界面,选择Databases,右键add…,添加数据库。
4.DBC编辑1.CANdb++,添加signal:空白处右键,NEW,设置信号的长度,Name,分辨率,偏移量,最大值和最小值等,2. 添加Message:单击Message,NEW。
设置Message的name,ID,长度等。
3.添加Node:单击Network node,NEW。
设置节点Name 等4.将Signal添加到Message中。
双击创建的Message单击Signal->add,添加创建的信号单击Layout,拖动Signal,放到指定的位置即可5.将Message添加到Network node中。
制作多帧DBC文件的方法包括以下步骤:
导入原始DBC文件:使用CANoe或CANdb++等工具打开原始DBC文件,并确认DBC文件中已经包含了需要的信号和报文。
创建新的Frame:在DBC文件中创建一个新的Frame,用于存储多帧数据。
配置多帧参数:在新建的Frame中配置多帧参数,包括多帧数据的起始帧、数据帧数量、数据帧顺序等。
添加信号到多帧数据:将需要拆分成多帧发送的信号添加到新建的Frame中。
配置信号参数:为添加到多帧数据中的信号配置参数,包括信号的起始位、长度、缩放因子、偏移量、单位等。
生成多帧DBC文件:在完成以上配置后,保存并生成多帧DBC文件。
注意事项:
在制作多帧DBC文件时,需要确保CAN网络中的其他节点也支持多帧传输协议,并且能够正确解析和处理多帧数据。
多帧数据的传输效率会受到一定影响,因此需要根据实际情况评估是否需要使用多帧传输方式。
在使用多帧DBC文件进行调试时,需要使用支持多帧传输的调试工具,例如CANoe或CANalyzer等。
使用CANOE进行CAN总线的DBC文件制作A DBC file is a standardized database format used to define and represent CAN messages and signals within a network. This file contains information about the message identifiers, signal descriptions, and signal values. It is essential for the successful implementation and testing of a CAN-based system.To create a DBC file using CANOE, follow the steps below:3. Select the network configuration: In the project setup wizard, choose the type of network you will be working with (e.g., CAN, LIN, FlexRay, etc.). Select the appropriate network configuration and baud rate. Click on "Next."4. Define the ECU nodes: In this step, you need to define the ECU nodes participating in the network. Enter the node names and assign unique Node IDs or addresses to each node. Click on "Finish."5. Create a new DBC file: In the project explorer window, right-click on the project root and select "New > CAN > DBC." Choose a name for your DBC file and click on "Finish."8. Define message and signal values: If your application requires predefined signal values, you can define them in the DBC file. This allows you to associate specific values with signals, making it easier to interpret and analyze the data during testing and analysis.9. Import or export DBC files: CANOE allows you to import or export DBC files in various formats, such as .dbc, .arxml, .xls, etc. This feature enables collaboration with other tools or systems that support different file formats.11. Apply the DBC file to the CAN network: Finally, apply the generated DBC file to the CAN network in CANOE. This step ensures that the defined messages and signals are correctly transmitted and received by the participating ECUs.。
dbc文件制作方法(一)DBC文件制作方法什么是DBC文件?DBC文件(Diagnostic Data C(CAN)file)是用于描述数据通信结构的文件格式,常用于汽车诊断系统中。
它定义了CAN通信网络上的节点、消息、信号以及其属性等信息。
DBC文件制作方法下面列举了几种常见的DBC文件制作方法:方法一:使用专用工具制作1.查找并选择一款专用的DBC文件编辑工具,例如[VectorCANoe](2.打开工具后,创建一个新的DBC文件项目3.在项目中,创建所需的节点、消息和信号等4.设定节点的属性,如名称、地址等5.按需设定消息的属性,如ID、周期等6.定义信号的属性,如名称、长度、物理值等7.保存文件,生成最终的DBC文件方法二:使用文本编辑器制作1.使用文本编辑器(如Notepad++、Sublime Text等)打开空白文本文件2.在文件中按照[DBC文件格式](3.保存文件,并将文件后缀改为”.dbc”表示为DBC文件方法三:基于现有DBC文件修改1.找到一个已有的DBC文件作为基础模板2.使用文本编辑器打开该文件3.根据需求修改节点、消息和信号等信息4.保存文件,并生成最终的修改后DBC文件总结制作DBC文件可以通过使用专用工具、文本编辑器或基于现有文件进行修改等方法来完成。
根据实际情况选择合适的方法,熟悉DBC 文件格式规则可以更好地制作出符合要求的DBC文件。
方法一:使用专用工具制作1.首先,选择一款专门用于编辑DBC文件的工具,例如 VectorCANoe。
这种工具提供了直观的用户界面,便于创建和编辑DBC文件。
2.打开Vector CANoe并创建一个新的DBC文件项目。
可以通过点击菜单栏中的“File -> New -> DBC File”来创建一个新的项目。
3.在项目中,创建所需的节点、消息和信号等。
可以使用工具提供的选项和按钮进行创建。
例如,可以选择“Node”选项并点击“Add”按钮以创建一个节点。
使用CANOE进行CAN总线的设计
信号定义与分配
DBC文件制作
我们在进行CAN总线的通讯设计过程中,对于通讯矩阵的建立,我们常常会选择一种编码方式,最常见的编码格式是Intel 格式和Motorola 格式。
但是往往人们都是以一种习惯去选择,究竟两种格式具体的区别在哪里呢?我们需要明白两种格式对信号是如何排布的,又是按照什么顺序进行正确解析的。
本篇文章就是作者根据在整理通讯矩阵和dbc 文件中遇到的一些问题,提出的自己的一些体会和见解,希望大家通过此篇文章对两种格式有更加深刻的理解。
我们在设计初期,都会首先选择一种编码格式,这种选择大多都是根据设计者自己的习惯,具体Intel 格式和Motorola 格式哪个更有优势的问题,在这里没有区别。
但是就使用者而言,需要对接收到数据帧进行正确的解析,否则就无法得到想要的信号。
下面我们就来说一下两种格式的区别。
首先我们需要明确一点,无论是Intel 格式还是Motorola 格式,在每个字节中,数据传输顺序都是从高位(msb)传向低位(lsb )。
如下图所示。
bit(8* x+7) byte x
bit(8* x)
msb lsb
注:x=0,1,2,3 7
图 1
一般主机厂设计人员在设计初期都会定义好字节的发送顺序,定义Byte0 为LSB,Byte7 为MSB。
第一种情况:先发送Byte0 ,然后Byte1 到Byte7 ;第二种情况:先发送Byte7 ,然后Byte6 到Byte0 。
根据我了解到的大部分主机厂都会
采取第一种发送方法,很少会采取后者。
我们在用CANoe中的CANdb+编+
库时,肯定会用到如下图所示的编辑界面。
辑数据
图 2
结合工作中的出现的问题,有的网络设计者会在排布信号的时候出现误区。
上图中用的是比较常规的排布方式,即位在字节中的索引是从右至左,还有一种是颠倒过来的,即从左至右。
如下图所示。
图 3
我们现在以第一种矩阵模式进行说明。
在这种情况下,如果主机厂在初期定义先发送LSB,再发送的MSB的形式,那么数据信号可以按照从上到下,从左到右的顺序发送,非常方便,接收器解析起来也比较容易。
如果主机厂定义先发送MSB 再发送LSB的形式,那样数据传输比较复杂,所以一般都不建议用这种方案。
至
于设计者常出现的错误我们在下文中会重点说明,下面我们先了解一下Intel 格式和Motorola 格式在CANdb+中+的区别。
一、Motorola 编码格式:
如果我们选择使用Motorola 编码格式,那需要知道它在CANdb+中+的 3 种信号排布方式。
这三种排布的主要区别在于它们的起始位不同。
我们假设一个信号的位长为12,那么它就要跨字节排布。
在Motorola 格式中的第一种排布形式为Motorola Forward LSB ,即从小端开始,它的起始位为lsb (16);第二种排布形式为Motorola Forward MSB ,即从大端开始,它的起始位为msb(11);第三种排布形式为Motorola Backward,它的起始位为第8 位,这种形式基本不采用,因为排布规律相对于前两种比较复杂。
如下图所示;
图 4
针对上述Motorola 格式第一种排布形式,信号的起始位为高字节的低位。
在CANdb+中+的具体体现如图所示。
在CANdb+中+
图 5
,无法区别这三种排布形式,它的起始位也是自动定义的,所以
我们在设计通讯矩阵时,一般都会采用第一种,即Motorola Forward LSB 。
只是有的工程师根据自己的个人习惯,去改变起始位,但我们需要明确一点就是,
在Canoe软件中,一种格式的信号排布是没有区别的。
二、Intel 编码格式
如果我们选择使用Intel 编码格式,它在CANdb+中+
我们假设一个信号位长为12,它也是要跨字节排布。
也有两种信号排布方式。
第一种排布形式为Intel Standard ,即标准形式,它的起始位为lsb (12)。
信号的起始位为低字节的低位。
如下图所示:
图6
图7
第二种排布形式为Intel Sequential ,即顺序排布形式或者叫颠倒排布。
这种
形式不太常用,但我们也需要了解,它的起始位为lsb (11)。
如下图所示:
图8
以上文字介绍了当信号的位长超过一个字节的情况下,信号分别以Motorola 编码格式和Intel 编码格式排布时的区别。
我们现在假设一个信号的位长为4,观察在CANdb+中+信号的排布有什么区别。
Motorola 编码格式下的信号排布:(绿色信号)
图9
Intel 编码格式下的信号排布:(绿色信号)
图10
由图可知,两种格式的起始位不同,但是他们的排布方式相同,都是信号的高位放在该字节的高位(msb),信号的低位放在该字节的低位(lsb )。
所以,当一个信号的位长小于8 时,那么两种编码格式没有区别。
如果信号的位长大于8,那么两种编码格式将会产生很大差别。
这是我们在网络通讯设计初期必须要掌握的。
下面我们说一下一些工程师在做通讯矩阵的设计时,常会出现的几个问题:
1. 在编写通讯矩阵时,在起始位的编写中,常会将Intel 格式和Motorola 格式
弄混。
例如:如下图所示的通讯矩阵
如果一个信号的位长为4,那么若是Motorola 编码格式,那它的起始位就是4;而若是Intel 编码格式,那它的起始位就是0。
2. 在CANdb+中+进行通讯矩阵的调整时,首先应明确信号选取的编码格式,然
后进行拖曳,有的工程师常常在没有区分编码格式,凭借主观感觉对通讯矩
阵进行调整,这往往会导致信号的传输错误。
3. 在信号跨字节排布中,未明确msb和lsb ,在拖曳过程中会出现错误。
综上所述,Motorola 编码格式和Intel 编码格式主要区别还是在信号位长大
于8 或者信位长不超过8 但是跨字节的情况下,前者的规则:该信号的高位
(S_msb)将被放在低字节(MSB)的高位,信号的低位(S_lsb )将被放在高字节(LSB)的低位;后者的规则:该信号的高位(S_msb)将被放在高字节(MSB)的高位,信号的低位(S_lsb )将被放在低字节(LSB)的低位。
希望大家能从此篇文章中收获一些经验。
2
文中术语解释及定义:
1. 信号的高位,即最能表达信号特性的因子,比如:车速信号
500km/h 按
照给定的公式,转换成十六进制数为
0x6A5,因为 6 代表的数量级最大
(16 ),那么其中 6 就是其信号的高位。
2. 信号的低位,即最不能表达信号特性的因子,比如:车速信号
500km/h
按照给定的公式, 转换成十六进制数为 0x6A5,因为 5 代表的数量级最小 (16 ),那么其中 5 就是其信号的低位。
3. 信号的起始位,一般来讲,主机厂在定义整车
CAN 总线通信矩阵 时,其
每一个信号都从其最低位开始填写,这样也符合使用习惯。
所以信号的 起始位就是信号的最低位。
这也与 CANoe 中 CANdb+的+ 义一致。
定义 Startbit 含。