通信矩阵转DBC
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的更多相关文章
- 解析.DBC文件, 读懂CAN通信矩阵,实现车内信号仿真
通常我们拿到某个ECU的通信矩阵数据库文件,.dbc后缀名的文件. 直接使用CANdb++ Editor打开,可以很直观的读懂信号矩阵的信息,例如下图: 现在要把上图呈现的信号从.dbc文件中解析出来 ...
- Intel格式与Motorola格式的区别
Intel低字节在前 Motorola高字节在前 在进行CAN总线通信设计或者测试过程中,经常看到CAN总线信号的编码格式有两种定义:Intel格式与Motorola格式.究竟两种编码格式有 ...
- 【2018.05.10 智能驾驶/汽车电子】AutoSar Database-ARXML及Vector Database-DBC的对比
最近使用python-canmatrix对can通信矩阵进行编辑转换时,发现arxml可以很容易转换为dbc,而dbc转arxml却需要费一番周折,需要额外处理添加一些信息. 注意:这里存疑,还是需要 ...
- 【2018.05.09 Python学习及实践】个人项目中使用的Python库备忘-持续更新
科研中无论是使用C/C++.Python.Matlab,如果能找到合适的库可谓是事半功倍: 有时候忙活半天才发现本身就有成熟的库可用,自己实现的在功能.性能.安全性上都远远不及,虽然锻炼了能力,但存在 ...
- Intel与Motorola区别
Intel低字节在前 Motorola高字节在前 在进行CAN总线通信设计或者测试过 程中,经常看到CAN总线信号的编码格式有两种定义:Intel格式与Motorola格式.究竟两种编码格式有什 ...
- CAN报文 Intel 格式与Motorola 格式的区别
当一个信号的数据长度不超过 1 个字节(8 位)时,Intel 与 Motorola 两种格式的 编码结果没有什么不同,完全一样.当信号的数据长度超过 1 个字节(8 位)时,两者的编码结果出现 了明 ...
- 转载: 华为内部Web安全测试原则
原链接:http://www.ha97.com/5520.html Web安全原则 1.认证模块必须采用防暴力破解机制,例如:验证码或者多次连续尝试登录失败后锁定帐号或IP. 说明:如采用多次连续尝试 ...
- 强大的矩阵奇异值分解(SVD)及其应用
版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gm ...
- Win10 IoT C#开发 6 - 4x4矩阵键盘扫描
Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一章我 ...
随机推荐
- 4python 解析库的使用
4.1 xml库 https://cuiqingcai.com/5545.html XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言.它最初是 ...
- java 调用wsdl的webservice接口 两种调用方式
关于wsdl接口对于我来说是比较头疼的 基本没搞过.一脸懵 就在网上搜 看着写的都很好到我这就不好使了,非常蓝瘦.谨以此随笔纪念我这半个月踩过的坑... 背景:短短两周除了普通开发外我就接到了两个we ...
- 玩玩Mybatis的逆向工程
通过数据库 逆向生成代码 主要配置的文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...
- Android processDebugManifest 异常
1.使用 gradlew processDebugManifest --stacktrace 进行排查; 2.异常: processDebugManifest (Thread[Execution wo ...
- MySQL数据库基本操作以及SQL语句
连接mysql的语法 mysql -u用户名 -p密码 [-h主机名] [-P端口号] 在一个mysql服务器中, 可以有多个mysql数据库(本质是一个文件夹) 在一个mysql数据库中, 可以有多 ...
- c++11的构造函数继承
https://en.cppreference.com/w/cpp/language/using_declaration 在[Inheriting constructors]这一节. 其实叫做"基类的 ...
- SQL注入系列:SQLi Labs
前言 关于注释 说明:在SQL中--[空格]表示注释,但是在URL中--空格在发送请求的时候会把最后的空格去掉,所以用--+代替,因为+在被URL编码后会变成空格 MYSQL有三种常用注释: --[空 ...
- AcWing 243. 一个简单的整数问题2 (树状数组)打卡
题目:https://www.acwing.com/problem/content/244/ 题意:区间加,区间查询 思路:我们把原先那个差分数组分解一下 ∑i=1x∑j=1ib[j]=∑i=1x(x ...
- NetHogs——Linux下按进程实时统计网络带宽利用率
Debian/Ubuntu下安装很简单,执行:apt-get install nethogs 就可以安装. CentOS/RHEL下建议先安装上EPEL,再执行:yum install libpcap ...
- 用php写爬虫去爬数据
参考文档1 参考文档2 这里是我自己写的一个小需求 <?php /** 采集http://www.959.cn/school,即时更新的最新的文章内容:每分钟采集一次.采集结束后实时入库并展示. ...