精华内容
下载资源
问答
  • 详情:可以通过客户给的Excel矩阵表通过配置生成DBC文件和位定义文件,也可以通过客户给的DBC文件生成Excel矩阵表和位定义文件, 附件里有demo模板,可自己创建配置ini文件,具体使用说明见博客会讲解:...
  • dbc转excelexcel转dbc的转换工具

    千次阅读 热门讨论 2019-04-18 13:49:45
    1 introduction ...而excel也就成了间接传输dbc内容的工具,但是不管是从exceldbc还是从dbcexcel,整车成千上万条的数据通过人工一条条的转换,效率低,且易出错。 基于提高生产效率的目的,开...

    1 introduction

     

    无论是OEM还是supplier,dbc文件在开发还是测试阶段都是必须的。

    然而由于其需要使用vector或者其他工具才能进行编辑,所以某种程度上造成了开发的不便利性。而excel也就成了间接传输dbc内容的工具,但是不管是从excel到dbc还是从dbc到excel,整车成千上万条的数据通过人工一条条的转换,效率低,且易出错。

    基于提高生产效率的目的,开发了一个DBC和excel之间的转换工具。

    但是由于各家oem给出的excel格式也并非统一,此工具终究不能尽善尽美,只能尽可能的减少人工耗时。

     

    2 architecture

          

     

    软件工作流程如图所示:

    底层定义了两个类:message和signal

    结构如下:

    MsgID

    Message ID

    MsgName

    Message name

    MsgType

    standard/extern

    Cycletime

    Cycle

    Delaytime

    //

    SendType

    //

    DLC

    Data length

    Transmiter

    //

    Receiver

    //

    Commants

    //

    Signals

    SigName

     

    StartBit

     

    Length

     

    ByteOrder

     

    ValueType

     

    InitialValue

     

    Factor

     

    Offset

     

    Minimum

     

    Maximum

     

    Transmiter

     

    Receiver

     

    Commants

     

    ValueTable

     

    Unit

     

     

             

     

    DBC2EXCEL

           1 定义并实例化List<message>

           2 按行读入dbc文件内容,同时解析每行内容并添加至list<message>相关属性

           3 完成读入之后,就已经将dbc相关内容变成了一个list,(由于dbc涉及到很多属性,目前工具只针对上述存在的属性值进行解析)

           4 选在保存excel的目录,启动生成excel步骤

           5 工具首先打开 excel 模板,如图

    6 便利list<message>内的每一条message,并根据表格定义的字段名,将相应每条message的属性值添加到excel里面;

    7 保存excel;

    8 DONE!

    工具界面如图

    1 press loaddbc button , select a dbc file

    2 press dbc2excel, select a folder to save the excel which need to be defined a name

    3 you will see the progress from the status bar and progressbar

    4 after completing the task, press openexcel button, the file generated will be open

     

    EXCEL2DBC

    1. 定义并实例化List<message>
    2. 加载excel文件

    为尽可能适应大多数excel定义的数据格式,设计如图,右侧列表定义了将要导入的excel,对于相关字段定义在哪一列进行说明。打开默认值为上面模板中的定义。用户可以修改

    1. 操作步骤与dbc2excel类似。
    2. 完成后点击opendbc将会在richtextbox内直接显示dbc文件内容。

     

     

    Appendix

           目前工具限制非常多,bug也很多,但基于当前手上的demo测试,双向打通,如果严格按照规范来,应该会省很多时间。

           1 excel2dbc时,数据行必须从第三行开始

           2 message和signal的格式如模板,前一行是message后面是该message下的signals(看了几个oem的excel大致都会这样操作)

           3 关键字段一定要指定清楚,如message ID等,如果没有这些基本信息也不会生成正确的dbc。

    1. Byterorder必须是Motorola或者是Intel(dbceditor里面也是这么定义的)
    2. Valuetype必须是Unsigned 或者是signed
    3. Valuetable是 “xx空格引号yy引号空格xx引号……”dbc里面的格式,这个不好做t统一,xx是10进制,yy为定义名称
    4. Dbc2excel就相对简单了,生成的都是按照模板来的,并且不能改变模板…

     

    更新版本0515--支持29bitsID(GitHub)

     

    综合留言反馈:不响应的问题,可能有很多,1,缺少excel模板,这个可以在github上下载放到exe目录里,2,dbc文件没有解析成功,这个可能是程序兼容性不好的原因,3 .net环境没有搭建,建议安装4.5以上版本;4 电脑office有关?不确定

    我的运行环境是office365,net4.5.1,win10.

    最近很忙已经无暇顾及这个应用了。代码也很乱,不拿出来献丑了...,能用则用,用不了,小生也爱莫能助了...sorry!

    如果发现不可救bug,大家可以留言哦...

    Ending

    展开全文
  • 关键字 DBC,DBC转ExcelDBC转位定义,Excel转DBC,Excel转位定义,DBC转XLSX,XLSX转DBC。 二、什么时候需要使用MatrixCreat工具 当客户给Excel的CAN矩阵时,却不方便给DBC文件,我们在调试的时候DBC文件可以大大...

    一、摘要

    1.描述

    • 本文主要描述的是MatrixCreat上位机的使用,通过本文可详细的了解DBC文件和Excel文件的相互转换的过程,了解如何对工具进行自定义配置。
    • 在网络上对于DBC和Excel转换的工具并不多,在早期的时候,由于工作的需要,常常需要使用到DBC文件,也需要根据客户提供的Excel文件转换位定义,在最开始的时候我的想法是固定Excel表格的格式,然后把客户给的Excel表格信息有效内容复制到对应标准的Excel中,然后在进行转换,这样虽然实现了转换,但是伴随的问题也来了,要很好的,高效率的复制粘贴也不是一件容易的事情,而且相对来说每次客户更改文件都需要再复制粘贴一次,显得异常麻烦。所以我想我们可以通过配置的方式,通过读取配置文件来识别不同Excel之间有效的信息,虽然不同客户提供的Excel格式差异比较大,但是具体的内容其实并没有太多的区别。
    • 对于刚开始接触MatrixCreat上位机的人来说可能觉得有些麻烦,觉得转换我只需要点击就可以,但其实你仔细阅读本文后,你会发现这种方式也是一种相对较好的方式,可以很好弥补不同Excel格式之间DBC的转换,也不需要你去网上下载了一个又一个转换工具,最后却发现没有一个工具好用的情况,毕竟每个软件工程师写代码的时候,都是有自己的开发环境和配置,当编译后的软件在其他地方运行时候会出现其他的问题,格式也会有不同的情况。
    • 本软编写的语言是基于C#语言,并未使用其他关联的DLL文件,所以不同的电脑之间兼容性很好,不会出现调用异常的问题。
    • 郑重申明,本软件可以适配绝大多数车厂给的Excel文件,但是不保证所有文件都能适配,绝大部分地方都做了容错处理,但是不排除有异常情况的发生,若遇到有异常的情况,可联系我对代码进行优化,我会听君言及时处理,对软件进行更新升级。

    2.关键字

    DBC,DBC转Excel,DBC转位定义,Excel转DBC,Excel转位定义,DBC转XLSX,XLSX转DBC。

    二、什么时候需要使用MatrixCreat工具

    • 当客户给Excel的CAN矩阵时,却不方便给DBC文件,我们在调试的时候DBC文件可以大大的提高我们的工作效率,我们就需要自己去生成DBC文件,如果编辑DBC文件我们都使用Vector工具CANdb++ Editor去编辑,那效率将会是十分的低下,我们可使用MatrixCreat工具进行转换。
    • 当客户给的Excel的CAN矩阵和客户给的DBC文件信号发生冲突时候,可以将客户给的DBC文件进行转换成Excel格式进行对比查看,或者当我们只有DBC文件却没有Excel文件时,我们可使用MatrixCreat工具进行转换。
    • 当我们需要通过客户给的Excel或者DBC文件生成位定义参与编译,手动生成效率低而且不能保证准确性,我们可使用MatrixCreat工具进行转换。

    三、MatrixCreat转换后效果图

    • 一个好的上位机软件不光要实现应有的功能,对用户的使用来说也需要友好的界面,对于容错的处理也需要尽可能的加入,对于生成的文本也需要尽可能的美观,软件的实用性和美观并不冲突。
    • 上位机人机交互界面如下图
      在这里插入图片描述
    • Excel转DBC文件,DBC文件如下图
      在这里插入图片描述
    • Excel转位定义文件,DBC转位定义文件,位定义文件如下图
      在这里插入图片描述
    • DBC转Excel文件,Excel文件如下图
      在这里插入图片描述

    四、MatrixCreat运行环境

    五、MatrixCreat使用介绍

    • 安装好NET Framework4.7.2后,下载MatrixCreat工具压缩包后解压,解压后选择MatrixCreat.exe执行文件,双击运行。
      在这里插入图片描述
    • 打开后即可显示人机交互界面,使用说明如下图所示
      在这里插入图片描述
    • 第一次使用时候默认配置为…\MatrixCreat V2.0\project\Test_Demo.ini,该配置和默认路径…\MatrixCreat V2.0\demo\Test_Demo.xlsx标题相对应,如果不会配置的朋友可以直接使用该模板,将CAN矩阵表复制到该Excel中,转换即可,如果选择的是DBC文件,可以不用太关注配置文件,选择文件后直接点击生成即可获取需要的文件,配置文件也可以自己编辑,每次启动软件都会自动读取上次选择的配置文件和转换的文件,缺少文件会提示错误信息,转换过程如下图所示
      在这里插入图片描述
      在这里插入图片描述

    六、MatrixCreat配置详解

    • 配置文件可实现不同Excel信号的提取,可以有效的提高转换的效率,不同的车厂对CAN矩阵的描述信息各有千秋,我们只需要提取我们需要的信息即可,了解配置文件可自行编辑配置文件已达到期望的效果。
    • 配置文件的后缀.ini结尾的,我们一般可将写好的配置文件存放在…\MatrixCreat V2.0\project目录下,配置文件其实是xml文件,xml文件作为存储信息的重要一种文本方式,可通过记事本进行打开编辑,打开后如下图所示
      在这里插入图片描述
    • 了解配置之前我们需要了解什么是列标识符,其实就是我们说的描述,一般在列的抬头,上位机就是通过识别标识符来达到对应信息的提取,标识符如下图所示
      在这里插入图片描述
    • 下面我们将对每一项配置进行详细的解释,方便用户去了解它,配置它。

    1.ProjectName

    ProjectName代表工程名称,是区分不同配置的重要信息,这个名称也可以为空。

    2.EndianType

    EndianType代表单片机的类型,在前面的章节我们提到过大端小端,如果不太懂的朋友可以仔细阅读以下前面的章节,这个主要是为了生存的位定义文件格式需要,这个配置只能为Big和Little,分别代表大端和小端。

    3.BitsName

    BitsName代表节点名称,主要是用于位定义生成代表是哪路CAN,一般没特别需要求默认配置为Can即可。

    4.SheetName

    SheetName代表Excel的sheet名称,当我们拿到客户给的Excel文件时候,一个文件里面有许多的表格,通过这个名称可以快速定位我们需要的信息在哪个文件,解析的时候上位机会自动查询到与SheetName相匹配的sheet,然后再进行下一步匹配工作。

    5.ParasRowNum

    ParasRowNum代表我们要识别的列的标识符是第几行,有的厂家给的Excel第一行给的空白,第二行才是描述信息,通过配置快速定位行信息是否相匹配,该配置是从0开始的,代表第一行,这个参数十分重要,否则无法匹配到数据,这个值不能为空。

    6.VariableNameLenth

    VariableNameLenth代表变量名称长度,主要是为了限制最大的信号定义长度,不同的单片机可能存在不同,建议保持默认配置35即可。

    7.NameIsEqual

    NameIsEqual代表名称是否需要完全相等还是说只要要包含即可,也就是相当于搜索中的模糊匹配和全字匹配,主要用于SheetName,报文消息,信号消息的匹配,所谓全字匹配是指大小写和空格均需匹配,不包含换行符。如果列标识符中没有相同的,可以将此设置为False,这样出现的问题几率小。该值只能是True和False。

    8.EcuName

    EcuName和MessageTransmitter,SignalReceivers是二选一,有的厂家提供的Excel模板和我的模板差不多,对于信号的收发,是哪些ECU接收还是发送,采用的是S和R来区分,这样就需要知道ECU的名称,通过ECU的名称来查询列的标识符,需要注意的是不同的ECU直接必须用“;”来分开,这个参数可不设置或者设置不相匹配的,生成的DBC文件报文的发送接收节点会是无,但是不影响使用。

    9.MessageName

    MessageName代表报文名称,这个配置可以为空,生成出来的DBC文件默认为传输ECU加报文ID。

    10.MessageType

    MessageType代表报文类型,报文类型前面章节也提到过有哪些,这里不再仔细介绍,这个配置可以为空,生成出来的DBC文件默认为Normal。

    11.MessageID

    MessageID代表报文标识符,这个配置不能为空,这个配置对应的列的数据必须要为16进制,可以加0x开头,也可以不加。

    12.MessageDLC

    MessageDLC代表报文长度,这个配置可以为空,生成的DBC文件默认报文长度为8。

    13.MessageTransmitter

    MessageTransmitter代表发送ECU,这个配置如果配置了,会去查找对应列的发送ECU,如果没有查找到,会使用EcuName配置进行二次查找。一般两个配置配置一个即可,该配置可以为空。

    14.MessageSendType

    MessageSendType代表报文发送类型,报文发送类型前面章节也提到过有哪些,这里不再仔细介绍,这个配置可以为空,生成出来的DBC文件默认报文发送类型为NoSendType。

    15.MessageCycleTime

    MessageCycleTime代表报文周期时间,这个配置可以为空,生成出来的DBC默认报文周期时间为0。

    16.MessageCycleTimeFast

    MessageCycleTimeFast代表报文发送的快速周期,这个配置可以为空,生成出来的DBC文件默认报文发送的快速周期为0。

    17.MessageNrOfRepetition

    MessageNrOfRepetition代表报文快速发送的次数,这个配置可以为空,生成出来的DBC文件默认报文快速发送的次数为0。

    18.MessageDelayTime

    MessageDelayTime代表报文延时时间,这个配置可以为空,生成出来的DBC文件默认报文延时时间为0。

    19.SignalName

    SignalName代表信号名称,这个配置可以为空,生成出来的DBC文件信号名称为null_加起始位和长度。

    20.SignalStartbit

    SignalStartbit代表起始位,这个配置不能为空。

    21.SignalLength

    SignalLength代表信号长度,这个配置不能为空。

    22.SignalByteOrder

    SignalByteOrder代表排列格式,这个配置可以为空,生成的DBC文件默认排列格式为Motorola格式。

    23.SignalDataType

    SignalDataType代表数据类型,这个配置可以为空,生成DBC文件默认数据类型为Unsigned格式。

    24.SignalSendType

    SignalSendType代表信号发送类型,信号发送类型前面章节也提到过有哪些,这里不再仔细介绍,这个配置可以为空,生成出来的DBC文件默认信号发送类型为NoSendType。

    25.SignalUnit

    SignalUnit代表单位,这个配置可以为空,生成DBC文件默认单位为空。。

    26.SignalInitValue

    SignalInitValue代表初始值,这个配置可以为空,生成DBC文件默认初始值为0。

    27.SignalInvalidValue

    SignalInvalidValue代表无效值,这个配置可以为空,生成DBC文件默认无效值为0。

    28.SignalInactiveValue

    SignalInactiveValue代表非使能值,这个配置可以为空,生成DBC文件默认非使能值为0。

    29.SignalFactor

    SignalFactor代表精度,这个配置不能为空。

    30.SignalOffst

    SignalOffst代表偏移量,这个配置不能为空。

    31.SignalMinValuePhy

    SignalInvalidValue代表物理最小值,这个配置可以为空,生成DBC文件默认物理最小值为0。

    32.SignalMaxValuePhy

    SignalMaxValuePhy代表物理最大值,这个配置可以为空,生成DBC文件默认物理最大值为0。

    33.SignalReceivers

    SignalReceivers代表接收ECU,这个配置如果配置了,会去查找对应列的接收ECU,不同ECU之间用“,”隔开,如果没有查找到,会使用EcuName配置进行二次查找。一般两个配置配置一个即可,该配置可以为空。

    34.SignalMinValue

    SignalMinValue代表总线最小值,这个配置可以为空,生成DBC文件默认总线最小值为0。

    35.SignalMaxValue

    SignalMaxValue代表总线最大值,这个配置可以为空,生成DBC文件默认总线最大值为0。

    36.SignalValueDescrptions

    SignalValueDescrptions代表信号值描述,这个配置可以为空,生成DBC文件默认信号值描述为空。

    37.SignalComments

    SignalComments代表信号描述,这个配置可以为空,生成DBC文件默认信号描述为空。

    七、其他

    本文主要是讲解MatrixCreat工具的使用,有些地方可能会有描述性的错误,希望看到的朋友及时指出,我会及时更正错误,其他地方有些借鉴的描述,写此文章的目的是为了交流,非商业用途,欢迎私信讨论,感谢大家阅读。

    八、参考

    【1】:DBC转Excel;DBC转位定义;Excel转DBC;Excel转位定义;MatrixCreat(一)之CAN矩阵详解
    【2】:DBC转Excel;DBC转位定义;Excel转DBC;Excel转位定义;MatrixCreat(二)之DBC文件创建
    【3】:DBC转Excel;DBC转位定义;Excel转DBC;Excel转位定义;MatrixCreat(三)之DBC文件详解

    展开全文
  • 详情:可以通过客户给的Excel矩阵表通过配置生成DBC文件和位定义文件,也可以通过客户给的DBC文件生成Excel矩阵表和位定义文件, 附件里有demo模板,可自己创建配置ini文件,具体使用说明见博客会讲解:...
  • 本文主要描述的是汽车行业中如何通过Vector工具CANdb++ Editor去创建DBC文件,本文主要通过图片的方式去指导用户去创建DBC,创建DBC的过程比较麻烦,所以我写了一个上位机可以直接通过Excel生成DBC文件,

    一、摘要

    1.描述

    本文主要描述的是汽车行业中如何通过Vector工具CANdb++ Editor去创建DBC文件,本文主要通过图片的方式去指导用户去创建DBC,创建DBC的过程比较麻烦,所以我写了一个上位机可以直接通过Excel生成DBC文件,但是我们首先要通过官方工具来创建DBC文件,这样才能更好的理解它的原理和内容。

    2.关键字

    DBC,DBC创建,CANdb++ Editor,CANoe,CAN。

    二、什么是DBC文件

    DBC是Database Can的缩写,其代表的是CAN的数据库文件,在这个文件中把CAN通讯的信息定义的非常完整清楚,而CAN网络的通讯就是依据这个文件的描述进行的,所以DBC文件的作用非常强大,正是因为有了它才可以使得整个CAN网路的节点控制器无差错的协同同步开发。

    三、DBC创建环境

    • Windows操作系统电脑一台。
    • 安装Vector工具CANoe。

    四、DBC创建过程

    1.软件运行

    • 方法一
      通过CANoe的Tools ->CANdb++ Editor运行。
      在这里插入图片描述
    • 方法二
      通过安装目录启动运行。
      在这里插入图片描述

    2.新建DBC文件

    打开CANdb++ Editor软件后,点击工具栏”File”下的”Create Database”,此时界面如下图所示。按需求选择模板,点击OK,然后选择保存路径,即完成DBC数据库文件的创建了。
    在这里插入图片描述
    在这里插入图片描述

    3.新建数值表

    数值表就是信号值描述,点击工具栏”View”下的”Value Tables”,右键空白部分,选择”New”进行新建。此时界面如下图所示,完成数值表名字及数值定义后,点击确定即完成该信号数值表的创建了,依次再将其它需要的数值表。
    在这里插入图片描述
    在这里插入图片描述

    4.新建信号消息

    右键点击”Signals”选择”New”进行信号的新建,此时界面如下图所示。根据通讯矩阵中对于该信号的定义进行设置,并关联上我们上一步创建的该信号的数值表,点击确定即完成了信号的创建,依次完成其他两个信号的创建工作。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    5.新建报文消息

    右键点击”Message”,选择”New”,此时的设置界面如下图所示,按通讯矩阵定义的报文信息进行设置,可添加描述信息。在这里可以关联之前建立的信号消息,点击确定即完成当前报文的建立工作。在建立其他报文时,可以以这个为模板进行复制操作再进行修改;也可重新创建。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    6.新建网络节点

    右键点击”Network nodes”,选择”New”,此时的设置界面如下图所示,这里我们只需输入创建的网络节点名字进行新建操作就行,可以在此添加报文信息,有多少节点就需要创建多少个节点。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    7.新建自定义属性

    在”View”下点击”Attribute Definitions”,右击选择”New”,按需要可以进行对报文、信号、节点、环境变量等进行属性创建。
    Attribute Definitions”中的属性也可以通过从其他已有的DBC文件中进行导入;操作如下:在”File”中选择”Import Attribute Definitions”,选择要导入的DBC文件,即可将该DBC中的属性定义导入到我们现在的DBC文件中来。
    根据上面的步骤我们完成了属性的自定义或导入工作;此时再双击打开信号、报文、或者节点,在其”Attributes”项下可以看到我们前面定义/导入的属性及其值;此时可根据通讯矩阵的定义对其进行修改设置。
    在这里插入图片描述
    在这里插入图片描述

    8.文件检查

    经过前面的几个步骤其实已经完成数据库文件的创建了。但我们还需要通过检查来确保数据库文件中的对象及内部关系的一致性。在”File”中选择”Consistency Check”,此时会在一致性检查窗口中输出检查结果,会有状态信息及对应的说明,以供我们检查出错/警告报警的原因。
    在这里插入图片描述

    五、MatrixCreat工具

    这儿我只把链接放上,具体使用说明见后续章节。
    DBC转Excel;DBC转位定义;Excel转DBC;Excel转位定义:https://download.csdn.net/download/weixin_44926112/12671320

    六、其他

    本文主要是讲解CANdb++ Editor工具的使用,有些地方可能会有描述性的错误,希望看到的朋友及时指出,我会及时更正错误,其他地方有些借鉴的描述,写此文章的目的是为了交流,非商业用途,欢迎私信讨论,感谢大家阅读。

    七、参考

    【1】:https://blog.csdn.net/lichenda/article/details/106958877
    【2】:https://blog.csdn.net/weixin_44536482/article/details/88914753

    展开全文
  • DBC文件详解一、摘要1.描述2.关键字二、为什么要了解DBC文件三、DBC文件构成1.版本2.新符号3.波特率4.网络节点5.报文消息6.信号消息7.注释8.自定义属性9.数值表四、DBC文件解析1.解析版本2.解析报文消息3.解析信号...

    一、摘要

    1.描述

    本文主要描述的是汽车行业中DBC文件的格式,如何去解析它,如何通过文本编辑器去修改它,了解DBC文件之前如果不懂DBC的请去查看我之前的博客。

    2.关键字

    DBC,DBC解析,DBC数据库,DBC文件,C#解析DBC文件。

    二、为什么要了解DBC文件

    DBC文件在汽车行业应用十分广泛,如果编辑DBC文件我们都使用Vector工具CANdb++ Editor去编辑,那效率将会是十分的低下,当我们了解了DBC文件的构成后,我们可以通过其他方式进行解析,可以大大的提高工作的效率,我们可以通过记事本或者其他工具打开DBC文件。
    在这里插入图片描述

    三、DBC文件构成

    1.版本

    关键字:VERSION
    格式:VERSION "version"
    version就是版本信息,版本信息可以为空,但是不能省略""符。
    例如:VERSION "V1.0"代表版本号为V1.0。
    在这里插入图片描述

    2.新符号

    关键字:NS_:
    DBC生成后都会自动生成新符号,所以这一部分的信息我们无需过多留意,一般默认即可,如果是通过其他方式去生成DBC文件时,可以直接复制该信息即可。
    在这里插入图片描述

    3.波特率

    关键字:BS_:
    格式:BS_:[baudrate:BTR1,BTR2]
    其中[ ]内容表示为可选部分,可以省略,但关键字”BS_:”必须存在,省略会出错。
    在这里插入图片描述

    4.网络节点

    关键字:BU_:
    格式:BU_: name1 name2 name3 …
    格式中的name1 、name2 等表示定义的网络节点名字,由用户自己定义;但需保证节点命名的唯一性。
    例如:BU_: GW代表网络节点有GW。

    5.报文消息

    关键字:BO_
    格式:BO_ Msg_ID Msg_Name: Msg_Length Msg_Transmitter
    Msg_ID:报文标识符,十进制表示。
    Msg_Name:报文名称,命名规则和C语言变量相同。
    Msg_Length :报文长度,长度范围为0-8。
    Msg_Transmitter:发送节点,如果该报文没有指定发送节点,则该值需设置为” Vector__XXX”。
    例如:BO_ 1024 BCM_400: 8 BCM代表报文ID为0x400,报文名称为BCM_400,长度为8一个字节,发送节点为BCM。
    在这里插入图片描述

    6.信号消息

    关键字:SG_
    格式:SG_ Signal_Name : Start_Bit|Bit_Length@Byte_Order Date_Type (Factor, Offset) [Signal_Min_Value_Phy|Signal_Max_Value_Phy] “Unit” Receivers
    Signal_Name:信号名称,命名规则和C语言变量相同。
    Start_Bit:信号的起始位,范围为0-63。
    Bit_Length:信号的长度,范围为1-64。
    Byte_Order:信号的字节顺序:0代表Motorola格式,1代表Inter格式,这儿强调一下Motorola格式下的文本存储的是Motorola Msb格式的;
    Date_Type:信号的数值类型:+表示无符号数,-表示有符号数。
    Factor:精度。
    Offset:偏移量,Factor和Offset这两个值于该信号的原始值与物理值之间的转换,转换如下:物理值=原始值*因子+偏移量。
    Signal_Min_Value_Phy:物理总线最小值。
    Signal_Max_Value_Phy:物理总线最大值。
    Unit:信号的单位,为字符串类型,可以省略。
    Receivers:信号的接收节点,若该信号没有指定的接收节点,则必须设置为” Vector__XXX”。
    例如:SG_ BCM_WakeUp : 0|1@0+ (1,0) [0|1] “%” Vector__XXX代表信号名称为BCM_WakeUp,信号起始位为0,信号长度为 1,排列格式为Motorola Msb,数据类型为无符号,精度为1,偏移量为0,单位为%,无接收节点。
    在这里插入图片描述

    7.注释

    关键字:CM_
    格式:CM_ Object Msg_ID/Signal_Name “Signal_Description;”
    Object:注解的对象类型,可以是节点“BU_”、报文“BO_”、消息”SG_”。
    Msg_ID:报文标识符,十进制表示。
    Signal_Name:信号名称,命名规则和C语言变量相同。
    Signal_Description:信号描述,为字符串类型。
    例如:CM_ BO_ 1024 “网络管理报文”;代表报文ID为0x400的报文描述为网络管理报文。
    CM_ SG_ 1024 BCM_WakeUp “唤醒信号”;代表报文ID为0x400的报文中信号名称为BCM_WakeUp的描述信息为唤醒信号。
    在这里插入图片描述

    8.自定义属性

    • 关键字:**BA_DEF_ **
      格式:BA_DEF_ Object AttributeName ValueType Min Max;”
      Object:注解的对象类型,可以是节点“BU_”、报文“BO_”、消息”SG_”、网络节点” ”(用空格表示)。
      AttributeName: 自定义属性名称,命名规则和C语言变量相同。
      ValueType:属性值的类型,可以是整型、字符串、浮点型、枚举类型等。
      Min:属性值的最小值(字符串类型没有此项)。
      Min:属性值的最大值(字符串类型没有此项)。
      例如:BA_DEF_ “ECU” STRING ;代表自定义网络节点属性名称为ECU,类型为字符串型。
      BA_DEF_ BO_ “MsgCycleTime” INT 0 1000;代表自定义报文属性名称为MsgCycleTime,类型为整型,取值范围为0-1000。

    • 关键字:**BA_DEF_DEF_ **
      格式:BA_DEF_DEF_ AttributeName DefaultValue;”
      AttributeName: 自定义属性名称,命名规则和C语言变量相同。
      DefaultValue:默认值。
      例如:BA_DEF_DEF_ “MsgCycleTime” 0;代表自定义属性名称为MsgCycleTime的默认值为0。

    • 关键字:BA_
      格式:BA_ AttributeName Object /Signal_Name Msg_ID DefaultValue;”
      AttributeName: 自定义属性名称,命名规则和C语言变量相同。
      Object:注解的对象类型,可以是节点“BU_”、报文“BO_”、消息”SG_”、网络节点” ”(用空格表示)。
      Signal_Name:信号名称,命名规则和C语言变量相同。
      Msg_ID:报文标识符,十进制表示。
      DefaultValue:默认值。
      例如:BA_ “MsgCycleTime” BO_ 1024 0;代表自定义报文ID为0x400的报文属性名称MsgCycleTime值为100。
      在这里插入图片描述

    9.数值表

    关键字:VAL_
    格式:VAL_ Msg_ID Signal_Name N “DefineN” …… 0 “Define0”;”
    Msg_ID:报文标识符,十进制表示。
    Signal_Name:信号名称,命名规则和C语言变量相同。
    N “DefineN” …… 0 “Define0”:表示定义的数值表内容,即该信号的有效值分别用什么符号表示。
    例如:VAL_ 1024 BCM_WakeUp 1 “off” 0 “on” ;代表报文ID为0x400中的信号名称为BCM_WakeUp的值0x01代表off,0x00代表on。
    在这里插入图片描述

    四、DBC文件解析

    通过以上描述,我相信各位对DBC文件的结构有一定的了解,但是我们如何去解析呢,很多人第一时间想到的应该是按行解析,其实DBC文件有许多容错处理,单纯按行解析我们会错过许多细节部分,例如下图其实也没有出错,如果按行解析的话报文就解析不到了。
    在这里插入图片描述
    还有很多类似的容错处理在里面,所以单纯按行解析是不行的,并且有的时候也是不能通过空格来分开数据的,比如带有“”的前后是可以不追加空格的。
    在这里插入图片描述
    经过好久的挣扎,查询资料,终于在一个博客的找到了一种解析的方式,通过正则表达式去解析,当然他其实是按行解析,其实会丢掉一些数据,我将方法进行了一些简单的优化,先读取整个文件到字符串,把多行空格转换成一行空格,然后把换行符转换成空格符,然后进行查找,然后按照标准进行拆分。我这边解析的主要使用的C#语言,因为C#语言对字符串有友好的操作,我将部分代码粘贴如下,方便大家参考学习。

    1.解析版本

           /***********************************************
              * Name    :AnalysisDBCVersion
              * Author  :WangHu
              * Function:***
              * Version :V1.0.0
              * Data    :2020.4.15
            ***********************************************/
            internal static bool AnalysisDBCVersion(string data)
            {
                string pattern = "VERSION(([ ]+)|)\"((\\w+)|)\"";
                MatchCollection matchs = Regex.Matches(data, pattern);
                foreach (Match match in matchs)
                {
                    if (matchs.Count == 1)
                    {
                        string[] array = match.Value.Split(new string[] {@"""" }, StringSplitOptions.RemoveEmptyEntries);
                        if (array.Length >= 2)
                        {
                            string version = array[1];
                        }
                        return true;
                    } 
                }
                return true;
            }
    

    2.解析报文消息

           /***********************************************
              * Name    :AnalysisDBCMessagePattern
              * Author  :WangHu
              * Function:***
              * Version :V1.0.0
              * Data    :2020.4.15
            ***********************************************/
            internal static bool AnalysisDBCMessagePattern(List<Message> messages, string data)
            {
                string pattern = "BO_[ ]+(\\d+)[ ]+(\\w+):(([ ]+)|)(\\d+)[ ]+(\\w+)";
                foreach (Match match in Regex.Matches(data, pattern))
                {
                    string[] array = match.Value.Split(new string[] { " ", ":" }, StringSplitOptions.RemoveEmptyEntries);
                    Message message = FindCanMsg(messages, (uint)ConvertToInt(array[1]));
                    if (message != null)
                    {
                        ShowMsg(@"Find line """ + match.Value + @""" message fault", ShowEnum.Fault);
                        return false;
                    }
                    message = new Message();
                    message.ID = (uint)ConvertToInt(array[1]);
                    message.Name = ConvertToName(array[2]);
                    message.DLC = ConvertToInt(array[3]);
                    message.Transmitter = array[4].Replace(" ", "") == "Vector__XXX" ? null : array[4].Replace(" ", "");
                    message.CycleTime = message.CycleTimeFast = message.NrOfRepetition = message.DelayTime = -1;
                    messages.Add(message);
                }
                return true;
            }
    

    3.解析信号消息

           /***********************************************
              * Name    :AnalysisDBCSignalPattern
              * Author  :WangHu
              * Function:***
              * Version :V1.0.0
              * Data    :2020.4.15
            ***********************************************/
            internal static bool AnalysisDBCSignalPattern(List<Message> messages, string data)
            {
                string pattern = "SG_[ ]+(\\w+)(([ ]+)|)(((m)(\\d+[ ]+))|(M[ ]+))?:(([ ]+)|)(\\d+)(([ ]+)|)\\|(([ ]+)|)(\\d+)(([ ]+)|)@(([ ]+)|)([0|1])(([ ]+)|)([+|-])(([ ]+)|)+\\((([ ]+)|)(-?\\d+(\\.\\d+)?)(([ ]+)|),(([ ]+)|)(-?\\d+(\\.\\d+)?)(([ ]+)|)\\)(([ ]+)|)\\[(([ ]+)|)(-?\\d+(\\.\\d+)?)(([ ]+)|)\\|(([ ]+)|)(-?\\d+(\\.\\d+((E\\+\\d+)|))?)(([ ]+)|)\\](([ ]+)|)\"((([^\"\\s])|([\\s\\u4e00-\\u9fa5]))*)\"(([ ]+)|)(\\w+(,[ ]*\\w+)*)";
                foreach (Match match in Regex.Matches(data, pattern))
                {
                    Signal signal = new Signal();
                    string strPre = data.Substring(0, data.IndexOf(match.Value));
                    pattern = "BO_[ ]+(\\d+)[ ]+(\\w+):(([ ]+)|)(\\d+)[ ]+(\\w+)";
                    MatchCollection mc = Regex.Matches(strPre, pattern);
                    if (mc.Count == 0)
                    {
                        ShowMsg(@"Find line """ + match.Value + @""" message fault", ShowEnum.Fault);
                        return false;
                    }
                    string[] arr = mc[mc.Count - 1].Value.Split(new string[] { " ", ":" }, StringSplitOptions.RemoveEmptyEntries);
                    uint id = (uint)ConvertToInt(arr[1]);
                    Message message = FindCanMsg(messages, id);
                    if (message == null)
                    {
                        ShowMsg(@"Find line """ + match.Value + @""" message fault", ShowEnum.Fault);
                        return false;
                    }
                    string str = match.Value.Replace("+", " +").Replace("-", " -");
                    string[] array1 = str.Split(new string[] { @"""" }, StringSplitOptions.None);
                    string[] array2 = array1[0].Split(new string[] { " ", ":", ",", "|", "@", "(", ")", "[", "]" }, StringSplitOptions.RemoveEmptyEntries);
                    int startbit = ConvertToInt(array2[2]);
                    int bitlenth = ConvertToInt(array2[3]);
                    int sigbyte = (startbit / 8 + (bitlenth - 1) / 8 + ((startbit % 8 + 1 - ((bitlenth % 8) == 0 ? 8 : (bitlenth % 8))) >= 0 ? 0 : 1));
                    int sigbit = (startbit + 8 + 1 - bitlenth % 8) % 8;
                    int siglsb = sigbyte * 8 + sigbit;
                    signal.Name = ConvertToName(array2[1]);
                    signal.Startbit = array2[4] == "0" ? siglsb : ConvertToInt(array2[2]);
                    signal.Length = ConvertToInt(array2[3]);
                    signal.ByteOrder = (ByteOrderEnum)ConvertToInt(array2[4]);
                    signal.DataType = array2[5] == "-" ? DataTypeEnum.Signed : DataTypeEnum.Unsigned;
                    signal.Factor = ConvertToDouble(array2[6]);
                    signal.Offst = ConvertToDouble(array2[7]);
                    signal.MinValuePhy = ConvertToDouble(array2[8]);
                    signal.MaxValuePhy = ConvertToDouble(array2[9]);
                    signal.Unit = array1[1].Replace(" ", "");
                    signal.Receivers = array1[2].Replace(" ", "") == "Vector__XXX" ? null : array1[2].Replace(" ", "");
                    signal.InitValue = signal.InvalidValue = signal.InvalidValue = signal.InactiveValue = signal.MinValue = signal.MaxValue = -1;
                    message.Signals.Add(signal);
                }
                return true;
            }
    

    4.解析注释

           /***********************************************
              * Name    :AnalysisDBCCommentsPattern
              * Author  :WangHu
              * Function:***
              * Version :V1.0.0
              * Data    :2020.4.15
            ***********************************************/
            internal static bool AnalysisDBCCommentsPattern(List<Message> messages, string data)
            {
                string pattern = "CM_[ ]+((((BU_)|(BO_)|(SG_))[ ]+(\\d+)[ ]+(\\w+)(([ ]+)|))|)\"((([^\"\\s])|([\\s\\u4e00-\\u9fa5]))*)\"(([ ]+)|);";
                foreach (Match match in Regex.Matches(data, pattern))
                {
                    bool result = false;
                    string[] array1 = match.Value.Split(new string[] {@"""" }, StringSplitOptions.None);
                    string[] array2 = array1[0].Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
                    if (array2.Length == 1)
                    {
                        string comments = array1[1];
                    }
                    else
                    {
                        
                        if (array2[1] == "SG_")
                        {
                            uint id = (uint)ConvertToInt(array2[2]);
                            string name = ConvertToName(array2[3]);
                            foreach (var message in messages)
                            {
                                if (id == message.ID)
                                {
                                    foreach (var signal in message.Signals)
                                    {
                                        if (name == signal.Name)
                                        {
                                            result = true;
                                            signal.Comments = array1[1];
                                            break;
                                        }
                                    }
                                }
                            }
                            if (!result)
                            {
                                ShowMsg(@"Find line """ + match.Value + @""" message fault", ShowEnum.Fault);
                                return false;
                            }
                        }
                    }
                }
                return true;
            }
    

    5.解析自定义属性描述

           /***********************************************
              * Name    :AnalysisDBCAttributeDefinitionPattern
              * Author  :WangHu
              * Function:***
              * Version :V1.0.0
              * Data    :2020.4.15
            ***********************************************/
            internal static bool AnalysisDBCNatureDefinitionPattern(List<Nature> natures, string data)
            {
                string pattern = "BA_DEF_[ ]+((BU_)|(BO_)|(SG_)|(EV_))?(([ ]+)|)\"(\\w+)\"(([ ]+)|)(((INT)[ ]+([+|-]?\\d+)[ ]+([+|-]?\\d+))|((HEX)[ ]+([+|-]?\\d+)[ ]+([+|-]?\\d+))|((FLOAT)[ ]+([+|-]?\\d+.?\\d*)[ ]+([+|-]?\\d+.?\\d*))|(STRING)|((ENUM)(([ ]+)|)(\"((([^\"\\s])|([\\s\\u4e00-\\u9fa5]))*)\"([ ]*,(([ ]+)|)\"((([^\"\\s])|([\\s\\u4e00-\\u9fa5]))*)\")*)))[ ]*(([ ]+)|);";
                foreach (Match match in Regex.Matches(data, pattern))
                {
                    string[] array1 = match.Value.Split(new string[] { " ", @"""" }, StringSplitOptions.RemoveEmptyEntries);
                    foreach (Nature nature in natures)
                    {
                        if ((nature.Family == array1[1]) && (nature.Name == array1[2]))
                        {
                            ShowMsg(@"Find line """ + match.Value + @""" message fault", ShowEnum.Fault);
                            return false;
                        }
                    }
                    Nature nat = new Nature();
                    nat.Family = array1[1];
                    nat.Name = ConvertToName(array1[2]);
                    int StartNum = 3;
                    if ((nat.Family != "BU_") && (nat.Family != "BO_") && (nat.Family != "SG_") && (nat.Family != "EV_"))
                    {
                        StartNum = 2;
                        nat.Family = null;
                        nat.Name = ConvertToName(array1[1]);
                    }
                    nat.Type = array1[StartNum];
                    if ((nat.Type == "INT") || (nat.Type == "HEX") || (nat.Type == "FLOAT"))
                    {
                        nat.data.Add(array1[StartNum + 1]);
                        nat.data.Add(array1[StartNum + 1]);
                    }
                    else if (nat.Type == "ENUM")
                    {
                        string[] array2 = match.Value.Split(new string[] {"ENUM"}, StringSplitOptions.RemoveEmptyEntries);
                        string[] array3 = array2[1].Replace(" ", "").Split(new string[] { ",", @"""" }, StringSplitOptions.RemoveEmptyEntries);
                        for (int i = 0; i < array3.Length - 1; i++)
                        {
                            nat.data.Add(array3[i]);
                        }
                    }
                    natures.Add(nat);
                }
                return true;
            }
    

    6.解析自定义属性默认值

           /***********************************************
              * Name    :AnalysisDBCNatureDefaultPattern
              * Author  :WangHu
              * Function:***
              * Version :V1.0.0
              * Data    :2020.4.15
            ***********************************************/
            internal static bool AnalysisDBCNatureDefaultPattern(List<Message> messages, List<Nature> natures, string data)
            {
                string pattern = "BA_DEF_DEF_[ ]+\"(\\w+)\"(([ ]+)|)\"?(([+|-]?\\d*.?\\d*)|((([^\"\\s])|([\\s\\u4e00-\\u9fa5]))*))\"?(([ ]+)|);";
                foreach (Match match in Regex.Matches(data, pattern))
                {
                    bool result = false;
                    string str = match.Value.Replace(@""" ", @"""").Replace(@" """, @"""").Trim(';');
                    string[] array = str.Split(new string[] {@""""}, StringSplitOptions.RemoveEmptyEntries);
                    string name = ConvertToName(array[1]);
                    string init = 2 >= array.Length ? "" : array[2];
                    foreach (Nature nature in natures)
                    {
                        if (nature.Name == name)
                        {
                            foreach (Message message in messages)
                            {
                                switch (name)
                                {
                                    case "GenMsgCycleTime":
                                        message.CycleTime = ConvertToInt(init);
                                        break;
                                    case "GenMsgCycleTimeFast":
                                        message.CycleTimeFast = ConvertToInt(init);
                                        break;
                                    case "GenMsgNrOfRepetition":
                                        message.NrOfRepetition = ConvertToInt(init);
                                        break;
                                    case "GenMsgDelayTime":
                                        message.DelayTime = ConvertToInt(init);
                                        break;
                                    case "NmMessage":
                                        message.Type = init;
                                        break;
                                    case "GenMsgSendType":
                                        message.SendType = init;
                                        break;
                                    default:
                                        break;
                                }
                                foreach (Signal signal in message.Signals)
                                {
                                    switch (name)
                                    {
                                        case "GenSigStartValue":
                                            signal.InitValue = ConvertToInt(init);
                                            break;
                                        case "GenSigTimeoutValue":
                                            signal.InvalidValue = ConvertToInt(init);
                                            break;
                                        case "GenSigInactiveValue":
                                            signal.InactiveValue = ConvertToInt(init);
                                            break;
                                        case "GenSigSendType":
                                            signal.SendType = init;
                                            break;
                                        case "GenSigMinValue":
                                            signal.MinValue = ConvertToInt(init);
                                            break;
                                        case "GenSigMaxValue":
                                            signal.MaxValue = ConvertToInt(init);
                                            break;
                                        default:
                                            break;
                                    }
                                }
                            }
                            nature.InitValue = init;
                            result = true;
                        }
                    }
                    if (!result)
                    {
                        ShowMsg(@"Find line """ + match.Value + @""" message fault", ShowEnum.Fault);
                        return false;
                    }
                }
                return true;
            }
    

    7.解析自定义属性值

           /***********************************************
              * Name    :AnalysisDBCNatureValuePattern
              * Author  :WangHu
              * Function:***
              * Version :V1.0.0
              * Data    :2020.4.15
            ***********************************************/
            internal static bool AnalysisDBCNatureValuePattern(List<Message> messages, List<Nature> natures, string data)
            {
                string pattern = "BA_[ ]+\"(\\w+)\"(([ ]+)|)(((BU_)[ ]+(\\w+)[ ]+)|((BO_)[ ]+(\\d+)[ ]+)|((SG_)[ ]+(\\d+)[ ]+(\\w+)[ ]+)|((EV_)[ ]+(\\w+)[ ]+))?\"?(([+|-]?\\d*.?\\d*)|((([^\"\\s])|([\\s\\u4e00-\\u9fa5]))*))\"?(([ ]+)|);";
                foreach (Match match in Regex.Matches(data, pattern))
                {
                    bool result = false;
                    string str = match.Value.Trim(';');
                    string[] array = str.Split(new string[] { " ", @"""" }, StringSplitOptions.RemoveEmptyEntries);
                    string name = ConvertToName(array[1]);
                    uint id = array.Length <= 3 ? 0 : (uint)ConvertToInt(array[3]);
                    foreach (Nature nature in natures)
                    {
                        if (nature.Name == name)
                        {
                            foreach (Message message in messages)
                            {
                                if (message.ID == id)
                                {
                                    if (array[2] == "BO_")
                                    {
                                        switch (name)
                                        {
                                            case "GenMsgCycleTime":
                                                message.CycleTime = ConvertToInt(array[4]);
                                                break;
                                            case "GenMsgCycleTimeFast":
                                                message.CycleTimeFast = ConvertToInt(array[4]);
                                                break;
                                            case "GenMsgNrOfRepetition":
                                                message.NrOfRepetition = ConvertToInt(array[4]);
                                                break;
                                            case "GenMsgDelayTime":
                                                message.DelayTime = ConvertToInt(array[4]);
                                                break;
                                            case "NmMessage":
                                                message.Type = nature.data[ConvertToInt(array[4])];
                                                break;
                                            case "GenMsgSendType":
                                                message.SendType = nature.data[ConvertToInt(array[4])];
                                                break;
                                            default:
                                                break;
                                        }
                                        result = true;
                                    }
                                    else if (array[2] == "SG_")
                                    {
                                        foreach (Signal signal in message.Signals)
                                        {
                                            if (signal.Name == array[4])
                                            {
                                                switch (name)
                                                {
                                                    case "GenSigStartValue":
                                                        signal.InitValue = ConvertToInt(array[5]);
                                                        break;
                                                    case "GenSigTimeoutValue":
                                                        signal.InvalidValue = ConvertToInt(array[5]);
                                                        break;
                                                    case "GenSigInactiveValue":
                                                        signal.InactiveValue = ConvertToInt(array[5]);
                                                        break;
                                                    case "GenSigSendType":
                                                        signal.SendType = nature.data[ConvertToInt(array[5])];
                                                        break;
                                                    case "GenSigMinValue":
                                                        signal.MinValue = ConvertToInt(array[5]);
                                                        break;
                                                    case "GenSigMaxValue":
                                                        signal.MaxValue = ConvertToInt(array[5]);
                                                        break;
                                                    default:
                                                        break;
                                                }
                                                result = true;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            result = true;
                        }
                    }
                    if (!result)
                    {
                        ShowMsg(@"Find line """ + match.Value + @""" message fault", ShowEnum.Fault);
                        return false;
                    }
                }
                return true;
            }
    

    8.解析数值表

           /***********************************************
              * Name    :AnalysisDBCSignalValueDescriptionPattern
              * Author  :WangHu
              * Function:***
              * Version :V1.0.0
              * Data    :2020.4.15
            ***********************************************/
            internal static bool AnalysisDBCSignalValueDescriptionPattern(List<Message> messages, string data)
            {
                string pattern = "VAL_[ ]+(\\d+)[ ]+(\\w+)[ ]+(((\\d+.?\\d*)(([ ]+)|)\"((([^\"\\s])|([\\s\\u4e00-\\u9fa5]))*)\"[ ]*)*)+(([ ]+)|);";
                foreach (Match match in Regex.Matches(data, pattern))
                {
                    bool result = false;
                    string str = match.Value.Replace(@""" ", @"""").Replace(@" """, @"""").Trim(';');
                    string[] array1 = str.Split(new string[] { @"""" }, StringSplitOptions.RemoveEmptyEntries);
                    string[] array2 = array1[0].Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
                    uint id = (uint)ConvertToInt(array2[1]);
                    string name = ConvertToName(array2[2]);
                    foreach (var message in messages)
                    {
                        if (message.ID == id)
                        {
                            foreach (var signal in message.Signals)
                            {
                                if (signal.Name == name)
                                {
                                    result = true;
                                    signal.ValueDescrptions = "";
                                    for (int i = 0; i < (array1.Length)/2; i++)
                                    {
                                        if (signal.ValueDescrptions == "")
                                        {
                                            signal.ValueDescrptions += "0x" + ConvertToInt(array2[3]).ToString("X") + ":" + array1[1];
                                        }
                                        else
                                        {
                                            signal.ValueDescrptions += " \r\n0x" + ConvertToInt(array1[2 * i]).ToString("X") + ":" + array1[2 * i + 1];
                                        }
                                    }
                                    break;
                                }
                            }
                        }
                    }
                    if (!result)
                    {
                        ShowMsg(@"Find line """ + match.Value + @""" message fault", ShowEnum.Fault);
                        return false;
                    }
                }
                return true;
            }
    

    五、MatrixCreat工具

    这儿我只把链接放上,具体使用说明见后续章节。
    DBC转Excel;DBC转位定义;Excel转DBC;Excel转位定义:https://download.csdn.net/download/weixin_44926112/12671320

    六、其他

    本文主要是讲解DBC文件的结构和如何解析DBC文件,有些地方可能会有描述性的错误,希望看到的朋友及时指出,我会及时更正错误,其他地方有些借鉴的描述,写此文章的目的是为了交流,非商业用途,欢迎私信讨论,感谢大家阅读。

    七、参考

    【1】:https://blog.csdn.net/weixin_44536482/article/details/89030152
    【2】:https://blog.csdn.net/Jiang_Mr/article/details/103417163

    展开全文
  • 信号名称 Signal_Name是指定义在数据位信号名称,这个标识符和报文标识符是差不多的,也是唯一的,一般信号名称都是英文的,这个是为了通过这个标识符来生成信号,可用于位定义,DBC文件名称。 12.信号描述 Signal_...
  • VBA实现EXCEL转DBC

    2020-02-25 11:29:32
    利用VBA实现对EXCEL转DBC文件 EXCEL的格式如下: VBA代码: Sub exceltodbc() Dim i, j As Integer Dim row As Integer Dim filepath, GenMsgCycleTime, CM, VAL As String Dim MsgName, MsgId, ...
  • VBA实现Excel转DBC

    千次阅读 2019-05-08 15:25:34
    欢迎关注《汽车软件... 使用方法 ... 参考《Template》格式要求,输入DBC的信息,点击“Excel=>DBC”转化。 在CANdb++中检查输出结果。 注意:本工具非常简易,未对输入做详细检查,因此不建议用在商业用途。 ...
  • excel2DBC m脚本

    2020-11-06 09:42:44
    基于matlab平台可实现由EXCEL转DBC的自动化m脚本,其中内附EXCEL表格式,只需完整填表即可实现EXCELDBC的自动化转换
  • dbc转excel工具

    万次阅读 多人点赞 2018-05-24 20:43:15
    汽车can总线下的dbc解析文件,用spy或者canoe什么的看起来太麻烦,系统的人就是想要看excel,么就搞了个dbc转excel工具,用python写的。 Dbc转excel程序如下,为单个.exe程序。 打开程序,点击选择要转换的dbc...
  • dbc文件转excel

    2018-05-24 20:43:36
    汽车can总线下的dbc解析文件,用spy或者canoe什么的看起来太麻烦,系统的人就是想要看excel,么就搞了个dbc转excel工具,用python写的 具体使用方法:...
  • EXCEL2DBC1.2.zip

    2021-04-14 15:13:35
    CAN通讯协议转dbc软件,VB6编写,支持信号值生成,汽车行业应用。使用过程中遇到问题可以与我联系 953509472@qq.com
  • DBC文件转EXCEL文件

    2019-04-10 16:33:02
    用于转换dbc文件为excle文件,便于查看,用于验证导入的dbc文件是否正确。
  • 汽车控制器CAN通信DBC文件工具:EXCEL生成DBC和生成代码汽车控制器CAN通信DBC文件工具:从EXCEL生成DBC和生成代码AutoCANdbAutoCANdb限制效果图 汽车控制器CAN通信DBC文件工具:从EXCEL生成DBC和生成代码 目前汽车...
  • ubuntu 16.04 转换DBC文件到excel

    千次阅读 2017-12-15 17:14:25
    canmatrix使用通过canmatrix可以把车厂DBC文件转换成对应json和excel文件 1.安装python-pip sudo apt-get install python-pip 2.安装依赖包 sudo pip install XlsxWriter xlwt-future 3.更新pip pip install –...
  • DBCEXCEL相互转换

    千次阅读 2020-02-10 16:07:22
    一种在pycharm环境中实现dbcexcel的方法 最近发现Dbcexcel的需求比较广泛,本人之前查阅相关资料,发现了一种快速有效的方法,借此在家办公的时机整理成文档,供大家参考使用,若在使用过程中有问题也可...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,467
精华内容 586
关键字:

excel转dbc