通信矩阵转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架构上运行. 上一章我 ...
随机推荐
- java的BigDecimal比较大小
java的BigDecimal比较大小 //前提为a.b均不能为null if(a.compareTo(b) == -1){ System.out.println("a小于b"); ...
- 浅谈CICD持续集成、持续部署的流程(转)
Jenkins是一个比较流行的持续集成工具GitLab是存储镜像的镜像仓库由客户端将代码push推送到git仓库,gitlab上配置了一个webHook的东西可以触发Jenkins的构建.进入到Jen ...
- vue.js 分页
<template> <div class="index"> <el-pagination background :hide-on-single-pa ...
- 【leetcode】640. Solve the Equation
题目如下: 解题思路:本题的思路就是解析字符串,然后是小学时候学的解方程的思想,以"2x+3x-6x+1=x+2",先把左右两边的x项和非x项进行合并,得到"-x+1=x ...
- MySQL图形化管理工具之Navicat安装以及激活
软件以及激活包下载地址 1. 安装navicat 双击navicat_trial_11.1.20.0.1449226634.exe,一路下一步安装(记住安装目录) 2. 激活 双击PatchNavic ...
- JavaScript 的 API设计原则
一.接口的流畅性 好的接口是流畅易懂的,他主要体现如下几个方面: 1.简单 操作某个元素的css属性,下面是原生的方法: document.querySelectorAll('#id').style. ...
- String、StringBuuffer、StringBuilder三者的区别
string String 字符串常量(final修饰,不可被继承,线程不安全),String是常量,当创建之后即不能更改,可以给多个引用共享,在做大量字符串拼接的时候效率低.(可以通过StringB ...
- Mysql全文索引的使用
前言 在MySQL 5.6版本以前,只有MyISAM存储引擎支持全文引擎.在5.6版本中,InnoDB加入了对全文索引的支持,但是不支持中文全文索引.在5.7.6版本,MySQL内置了ngram全文解 ...
- PHP面试 AJAX基础内容
AJAX基础内容 Ajax的基本工作原理 Ajax基础概念:通过在后台与服务器进行少量数据交换,Ajax可以使用网页实现异步更新 Ajax工作原理:XMLHttpRequest是Ajax的基础 ...
- MySQL高级学习笔记(七):MySql主从复制
文章目录 复制的基本原理 slave会从master读取binlog来进行数据同步 三步骤+原理图 复制的基本原则 复制的最大问题 一主一从常见配置 mysql版本一致且后台以服务运行(双方能够pin ...