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

posted @   北ღ冥  阅读(2434)  评论(1编辑  收藏  举报
编辑推荐:
· 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框架的用法!
点击右上角即可分享
微信分享提示