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