DBC的制作对于一些人来时比较陌生,熟悉的人做他感觉浪费时间(像我这样的),于是自己用PYTHON写了一个脚本,还挺好用的,只需要填写表格就好了,省出来大部分的时间。

分享下思路,

来看下DBC的文本结构,不难看出还是有规矩可循的

关键字:“BU_”表示节点、“BO_”表示报文、”SG_”表示消息、“BS_”表示波特率(必须存在)、“BA_DEF_”表示属性定义、“BA_DEF_DEF_”表示属性的初始值

其中BU_为关键字,表示通信矩阵用到的网络节点,格式中的ABS EPB BCM AWD ICM ECM 表示定义的网络节点名字,由用户自己定义;但需保证节点命名的唯一性。

BO_ 570 ABS_FrP03: 8 ABS:表示定义了一条由ABS这个节点发送,数据域长度为8字节,ID为570(0x23A),名字命名为ABS_FrP03的报文。

SG_ ABS3_CS : 7|8@0+ (1,0) [0|255] ""  EPB:SG_ ABS3_CS 表示节点里的信号名称;7|8表示起始位|长度;@0表示Motorola模式,@1表示Intel模式,+表示无符号数,-表示有符号数 ;(1,0)表示(精度,偏移量);[0|255]表示[最小值|最大值];"km/h"表示信号的单位;EPB表示被哪个网络节点接收,若该信号没有指定的接收节点,则必须设置为” Vector__XXX”。

基本上大致分为八块:

  1、版本与新符号
        2、波特率定义
        3、网络节点的定义
        4、报文帧的定义
        5、信号的定义
        6、注解部分
        7、属性定义部分
        8、数值表部分

熟悉了以上的格式那么对自动生成DBC文件就清楚多了,就是写入一些固定的信息

按照如上的格式填写一份表格,在运行脚本文件就可以轻松地生成DBC文件了。

部分代码如下:(没有学过python按照C语言思路来写的)

#写入版本与号

f.writelines('VERSION ""')
f.writelines("\n")
f.write("\n\n")
f.write("NS_ :\n")
f.writelines("\tNS_DESC_\n\tCM_\n\tBA_DEF_\n\tBA_\n\tVAL_\n\tCAT_DEF_\n"
             "\tCAT_\n\tFILTER\n\tBA_DEF_DEF_\n\tEV_DATA_\n\tENVVAR_DATA_\n"
             "\tSGTYPE_\n\tSGTYPE_VAL_\n\tBA_DEF_SGTYPE_\n\tBA_SGTYPE_\n"
             "\tSIG_TYPE_REF_\n\tVAL_TABLE_\n\tSIG_GROUP_\n\tSIG_VALTYPE_\n"
             "\tSIGTYPE_VALTYPE_\n\tBO_TX_BU_\n\tBA_DEF_REL_\n\tBA_REL_\n"
             "\tBA_DEF_DEF_REL_\n\tBU_SG_REL_\n\tBU_EV_REL_\n\tBU_BO_REL_\n\tSG_MUL_VAL_\n")
f.writelines("\n")
f.writelines("BS_:\n")
f.writelines("\n")

Init_Value = [];Error = 0;Value_l = [];init_v = [];Init_Value_l = [];VA = [];
for n in range(1,len(first_column)):#列数
	if "" == sh.row_values(n)[Invalid_Value_n] and "" == str(sh.row_values(n)[Signal_Value_Description_n].strip()):#信号描述
		Error = 0
	elif "" != sh.row_values(n)[Invalid_Value_n] and "" == str(sh.row_values(n)[Signal_Value_Description_n].strip()):#信号描述
		Error = eval(str(sh.row_values(n)[Invalid_Value_n]))
	elif "" == sh.row_values(n)[Invalid_Value_n] and "" != str(sh.row_values(n)[Signal_Value_Description_n].strip()):#信号描述
		Error = (sh.row_values(n)[Invalid_Value_n])
		Init_Value_l.append(Error)
	elif "" != sh.row_values(n)[Invalid_Value_n] and "" != str(sh.row_values(n)[Signal_Value_Description_n].strip()):#信号描述
		Error = eval(str(sh.row_values(n)[Invalid_Value_n]))
	if "" != sh.row_values(n)[1]:
		p = (eval(str(sh.row_values(n)[1])))
	if "" == sh.row_values(n)[1] and "" != sh.row_values(n)[s]:
		Init_Value.append(p)
		if "" != sh.row_values(n)[Signal_Value_Description_n]:
			init_v.append(p)
			if "\n" != sh.row_values(n)[Signal_Value_Description_n]:
				VA.append(p)
	if "" != sh.row_values(n)[s] :
		Init_Value.append(str(sh.row_values(n)[s]))
		if "" != sh.row_values(n)[Signal_Value_Description_n]:
			init_v.append(str(sh.row_values(n)[s]))
			if "\n" != sh.row_values(n)[Signal_Value_Description_n]:
				VA.append(str(sh.row_values(n)[s]).strip('\n'))
		Init_Value.append(Error)
	if "" != sh.row_values(n)[Signal_Value_Description_n] and "\n" != str(sh.row_values(n)[Signal_Value_Description_n]).strip():
		init_v.append(str(sh.row_values(n)[Signal_Value_Description_n].strip()))
for n in range(1,len(Init_Value),3):
	BA_SG = ['BA_ "Init_Value" SG_ ',str(Init_Value[n-1])," ",str(Init_Value[n]).strip()," ",str(int(Init_Value[n+1])),";\n"]
	f.writelines(BA_SG)

  2019-12-25    10:26:32    -大崔

通信矩阵转DBC的更多相关文章

  1. 解析.DBC文件, 读懂CAN通信矩阵,实现车内信号仿真

    通常我们拿到某个ECU的通信矩阵数据库文件,.dbc后缀名的文件. 直接使用CANdb++ Editor打开,可以很直观的读懂信号矩阵的信息,例如下图: 现在要把上图呈现的信号从.dbc文件中解析出来 ...

  2. Intel格式与Motorola格式的区别

      Intel低字节在前 Motorola高字节在前    在进行CAN总线通信设计或者测试过程中,经常看到CAN总线信号的编码格式有两种定义:Intel格式与Motorola格式.究竟两种编码格式有 ...

  3. 【2018.05.10 智能驾驶/汽车电子】AutoSar Database-ARXML及Vector Database-DBC的对比

    最近使用python-canmatrix对can通信矩阵进行编辑转换时,发现arxml可以很容易转换为dbc,而dbc转arxml却需要费一番周折,需要额外处理添加一些信息. 注意:这里存疑,还是需要 ...

  4. 【2018.05.09 Python学习及实践】个人项目中使用的Python库备忘-持续更新

    科研中无论是使用C/C++.Python.Matlab,如果能找到合适的库可谓是事半功倍: 有时候忙活半天才发现本身就有成熟的库可用,自己实现的在功能.性能.安全性上都远远不及,虽然锻炼了能力,但存在 ...

  5. Intel与Motorola区别

    Intel低字节在前 Motorola高字节在前    在进行CAN总线通信设计或者测试过 程中,经常看到CAN总线信号的编码格式有两种定义:Intel格式与Motorola格式.究竟两种编码格式有什 ...

  6. CAN报文 Intel 格式与Motorola 格式的区别

    当一个信号的数据长度不超过 1 个字节(8 位)时,Intel 与 Motorola 两种格式的 编码结果没有什么不同,完全一样.当信号的数据长度超过 1 个字节(8 位)时,两者的编码结果出现 了明 ...

  7. 转载: 华为内部Web安全测试原则

    原链接:http://www.ha97.com/5520.html Web安全原则 1.认证模块必须采用防暴力破解机制,例如:验证码或者多次连续尝试登录失败后锁定帐号或IP. 说明:如采用多次连续尝试 ...

  8. 强大的矩阵奇异值分解(SVD)及其应用

    版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gm ...

  9. Win10 IoT C#开发 6 - 4x4矩阵键盘扫描

    Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一章我 ...

随机推荐

  1. 4python 解析库的使用

    4.1 xml库 https://cuiqingcai.com/5545.html XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言.它最初是 ...

  2. java 调用wsdl的webservice接口 两种调用方式

    关于wsdl接口对于我来说是比较头疼的 基本没搞过.一脸懵 就在网上搜 看着写的都很好到我这就不好使了,非常蓝瘦.谨以此随笔纪念我这半个月踩过的坑... 背景:短短两周除了普通开发外我就接到了两个we ...

  3. 玩玩Mybatis的逆向工程

    通过数据库 逆向生成代码 主要配置的文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...

  4. Android processDebugManifest 异常

    1.使用 gradlew processDebugManifest --stacktrace 进行排查; 2.异常: processDebugManifest (Thread[Execution wo ...

  5. MySQL数据库基本操作以及SQL语句

    连接mysql的语法 mysql -u用户名 -p密码 [-h主机名] [-P端口号] 在一个mysql服务器中, 可以有多个mysql数据库(本质是一个文件夹) 在一个mysql数据库中, 可以有多 ...

  6. c++11的构造函数继承

    https://en.cppreference.com/w/cpp/language/using_declaration 在[Inheriting constructors]这一节. 其实叫做"基类的 ...

  7. SQL注入系列:SQLi Labs

    前言 关于注释 说明:在SQL中--[空格]表示注释,但是在URL中--空格在发送请求的时候会把最后的空格去掉,所以用--+代替,因为+在被URL编码后会变成空格 MYSQL有三种常用注释: --[空 ...

  8. AcWing 243. 一个简单的整数问题2 (树状数组)打卡

    题目:https://www.acwing.com/problem/content/244/ 题意:区间加,区间查询 思路:我们把原先那个差分数组分解一下 ∑i=1x∑j=1ib[j]=∑i=1x(x ...

  9. NetHogs——Linux下按进程实时统计网络带宽利用率

    Debian/Ubuntu下安装很简单,执行:apt-get install nethogs 就可以安装. CentOS/RHEL下建议先安装上EPEL,再执行:yum install libpcap ...

  10. 用php写爬虫去爬数据

    参考文档1 参考文档2 这里是我自己写的一个小需求 <?php /** 采集http://www.959.cn/school,即时更新的最新的文章内容:每分钟采集一次.采集结束后实时入库并展示. ...