通信矩阵自动生成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语言思路来写的)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #写入版本与号 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 -大崔
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!