通信矩陣自動生成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    -大崔 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM