使用CANOE进行CAN总线的DBC文件制作
DBC文件解析CAN信息

以图形显示(Graphic window)为例,如图示,加入.dbc文件中包含的 数据帧或信号。
如图,选择一帧信号的全部或是某些,点击Apply。
点击Apply,即可以图形的形式观测相关的信号变化情况。
谢谢!
在“Device”中选择“New from路径下的.dbc文件,导入。此时上图红色框位置由灰色变为蓝 色,说明成功导入。
点击上述变为蓝色的按钮,弹出.dbc文件中包含的信息,如下图所示。
Message下为各帧信息,Signals子目录下为所有的信号。
各信号需要在Signals下面定义好。如需增加, 可以在空白处点击鼠标右键,New,新建信号, 根据通讯协议定义好信号的名称,长度,偏移 量,缩放因子等参数。
双击Message下某一帧,弹出如图示对话框,可以在definition中定义 数据帧名称,类型,ID,长度等,在Signals下可以为数据帧添加所需 包含的且已经在Signals下定义好的信号。
在Layout下可以为某一 帧信息中各信号的存储 位置,存储方式进行自 定义。
要观测信号,可在主界面右键,在Display windows中选择显示的方式, 如图形,数显等。
DBC文件解析CAN数据包 ----基于CANAPE
打开CANape,新建一个 工程,如右图所示。
如图示过程,建立新的project(例如 名称为demo),存储路径自行定义。点 击“完成”后,弹出的提示信息点击 “确定”或“ok”跳过,进入CANape 主界面。
上图为CANape主界面。可以把已有的dbc文件最后放到工程的路径下。
CAN通讯进阶-基于Python使用dbc文件解析CAN数据(dbc文件的创建、使用方法)

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 帧。
dbc文件使用

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通信网络的数据。
debugcan 多帧dbc制作方法

制作多帧DBC文件的方法包括以下步骤:
导入原始DBC文件:使用CANoe或CANdb++等工具打开原始DBC文件,并确认DBC文件中已经包含了需要的信号和报文。
创建新的Frame:在DBC文件中创建一个新的Frame,用于存储多帧数据。
配置多帧参数:在新建的Frame中配置多帧参数,包括多帧数据的起始帧、数据帧数量、数据帧顺序等。
添加信号到多帧数据:将需要拆分成多帧发送的信号添加到新建的Frame中。
配置信号参数:为添加到多帧数据中的信号配置参数,包括信号的起始位、长度、缩放因子、偏移量、单位等。
生成多帧DBC文件:在完成以上配置后,保存并生成多帧DBC文件。
注意事项:
在制作多帧DBC文件时,需要确保CAN网络中的其他节点也支持多帧传输协议,并且能够正确解析和处理多帧数据。
多帧数据的传输效率会受到一定影响,因此需要根据实际情况评估是否需要使用多帧传输方式。
在使用多帧DBC文件进行调试时,需要使用支持多帧传输的调试工具,例如CANoe或CANalyzer等。
CANOE基本使用教程

CANOE基本使用教程CANOE可谓是常用的总线测试工具之一,不管是总线开发工程师还是测试工程师,甚至是驻场工程师,都对它很熟悉。
天正好闲来有空,趁此机会,来分享一波CANOE的基本使用操作。
其整体的框图如下所示,详细地列举了各个窗口。
1.搭建CANOE工程首先肯定是打开CANOE,然后点击File→New Configuration新建工程;然后点击Configuration→Options,弹出CANoe Options 窗口,左边栏默认为General,在General配置中,需要选择通道的使用情况,注意这里选择的通道数不能超过CANoe 实际的通道数。
最后点击OK。
接下来就是配置CANoe 硬件通道接口,点击Configuration→Network Hardware,然后点击driver,配置连接的硬件。
然后就是加载dbc了,点击菜单栏View→Simulation Setup,弹出CAN 模拟窗口,在窗口右侧的CAN Network 上右击,增加CAN通道,然后在database出添加相应通达的dbc即可。
然后点击菜单栏View→Measurement Setup,设置是否记录数据,以及数据时来源离线播放还是实际测试。
在这里,还可以添加过滤模块,来选择要记录的特定数据。
2.诊断功能加载加载诊断功能的第一步,首先是需要在菜单栏Configuration→Diagnotics/ISO TP..,弹出诊断配置窗口,在左侧栏的 CAN 网络上上右击, Add ECU…加载 cdd 诊断文件。
加载完之后,基本大部分配置都有了,只需要在添加0x27服务的dll文件了。
然后就可以正常使用cdd中添加的诊断服务了,只需要在下图的左边栏点击服务即可,有些比如写DID,还是需要在填写需要写入的数据的。
另外如果是需要做自动化测试,可以添加capl脚本模块,通过脚本来实现,下图是添加capl脚本模块,最后就是导入现有的.can文件,或者是开始愉快的编写capl脚本了。
使用CANOE进行CAN总线的DBC文件制作

使用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文件?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工程案例

CANoe 入门 Step by step系列(一)基础应用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中建立关联也是可以的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用CANOE进行CAN总线的设计
信号定义与分配
DBC文件制作
我们在进行CAN总线的通讯设计过程中,对于通讯矩阵的建立,我们常常会选择一种编码方式,最常见的编码格式是Intel格式和Motorola格式。
但是往往人们都是以一种习惯去选择,究竟两种格式具体的区别在哪里呢?我们需要明白两种格式对信号是如何排布的,又是按照什么顺序进行正确解析的。
本篇文章就是作者根据在整理通讯矩阵和dbc文件中遇到的一些问题,提出的自己的一些体会和见解,希望大家通过此篇文章对两种格式有更加深刻的理解。
我们在设计初期,都会首先选择一种编码格式,这种选择大多都是根据设计者自己的习惯,具体Intel格式和Motorola格式哪个更有优势的问题,在这里没有区别。
但是就使用者而言,需要对接收到数据帧进行正确的解析,否则就无法得到想要的信号。
下面我们就来说一下两种格式的区别。
首先我们需要明确一点,无论是Intel格式还是Motorola格式,在每个字节中,数据传输顺序都是从高位(msb)传向低位(lsb)。
如下图所示。
byte x
bit(8*x+7)
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++中的具体体现如图所示。
图5
在CANdb++中,无法区别这三种排布形式,它的起始位也是自动定义的,所以我们在设计通讯矩阵时,一般都会采用第一种,即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)的低位。
希望大家能从此篇文章中收获一些经验。
文中术语解释及定义:
1.信号的高位,即最能表达信号特性的因子,比如:车速信号500km/h按
照给定的公式,转换成十六进制数为0x6A5,因为6代表的数量级最大(162),那么其中6就是其信号的高位。
2.信号的低位,即最不能表达信号特性的因子,比如:车速信号500km/h
按照给定的公式,转换成十六进制数为0x6A5,因为5代表的数量级最小(160),那么其中5就是其信号的低位。
3.信号的起始位,一般来讲,主机厂在定义整车CAN总线通信矩阵时,其
每一个信号都从其最低位开始填写,这样也符合使用习惯。
所以信号的起始位就是信号的最低位。
这也与CANoe中CANdb++的定义Startbit含义一致。