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