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    -大崔

最新文章

  1. 【原】python中文文本挖掘资料集合
  2. [C#对Oracle操作]C#操作调用Orcale存储过程有参数
  3. UILabel添加图片之富文本的简单应用
  4. cmd执行sql文件
  5. shodan:黑客搜索引擎
  6. paper 1:图像特征提取
  7. 调用wcf 得不到HttpWebResponse.ContentLength的长度
  8. Power Map 入门
  9. ARM Cortex-M instructions
  10. iOS开发——图形编程OC篇&OpenGL ES2.0编程步骤
  11. Oracle 简介 三层结构
  12. 【cheerio】nodejs的抓取页面模块
  13. ipad ------ 与iPhone的差别
  14. Android 读取txt文件并以utf-8格式转换成字符串
  15. KTV2
  16. .Net之路(十三)数据库导出到EXCEL
  17. 基于visual Studio2013解决面试题之1207堆排序
  18. Android网络开发之Volley--Volley基本用法StringRequest(一)
  19. MySQL学习分享-->查询-->查询的原理
  20. ButterKnife官方使用例子

热门文章

  1. PHP filter_has_var() 函数
  2. [CSP-S模拟测试]:金(king)(高精度+模拟)
  3. flutter环境搭建及跑起来demo(多图慎入)
  4. margin 负值问题
  5. HTML-参考手册: 元素和有效 DOCTYPES
  6. mybatis plus的条件构造器
  7. VPS性能测试:CPU内存,硬盘IO读写,带宽速度,UnixBench和压力测试
  8. ASP.NET Core项目目录结构介绍
  9. Struts1.3——Struts标签
  10. TTL 与 CMOS