通常我们拿到某个ECU的通信矩阵数据库文件,.dbc后缀名的文件。 直接使用CANdb++ Editor打开,可以很直观的读懂信号矩阵的信息,例如下图:
现在要把上图呈现的信号从.dbc文件中解析出来,供实现自动化仿真总线信号使用,比如使用python+支持can收发的硬件即可替代canoe实现信号仿真(性能上不够用,可满足功能测试所需)。
一个标准CAN帧中包含的信息有,消息ID、报文发送周期、 报文长度、信号信息等。
开始解析前,先了解一下报文帧。下表体现了摩托罗拉字节位序的报文发送时的字节序和bit序,一会儿可以帮助我们理解dbc中的定义
我使用了notepad++打开数据库文件,提取数据库文件中的关键信息。此处随意选取了其中一个ID=1015(dec)作为例子讲解。全文本搜索1015,结果如下:
Line 62: BO_ 1015 IPK_ODO_Consump: 8 Vector__XXX
Line 883: CM_ BO_ 1015 "Transmitted by IPK, including EV DTE odometer, power consumption and fuel consumption";
Line 884: CM_ SG_ 1015 IPK_EVDTEodometer "The EV DTE odometer ";
Line 885: CM_ SG_ 1015 IPK_AveragePowerConsumption "Indicate average power consumption";
Line 886: CM_ SG_ 1015 IPK_InstantPowerConsumption "Indicate instant power consumption";
Line 887: CM_ SG_ 1015 IPK_AverageFuelConsumption "Indicate average fuel consumption";
Line 1265: BA_ "GenMsgCycleTime" BO_ 1015 1000;
Line 1463: BA_ "GenSigStartValue" SG_ 1015 IPK_EVDTEodometer 4095;
Line 1464: BA_ "GenSigStartValue" SG_ 1015 IPK_AveragePowerConsumption 8191;
Line 1465: BA_ "GenSigStartValue" SG_ 1015 IPK_InstantPowerConsumption 8191;
Line 1466: BA_ "GenSigStartValue" SG_ 1015 IPK_AverageFuelConsumption 65534;
Line 1967: VAL_ 1015 IPK_EVDTEodometer 4095 "Invalid" ;
Line 1968: VAL_ 1015 IPK_AveragePowerConsumption 8191 "Invalid" 8190 "Abnormal" ;
Line 1969: VAL_ 1015 IPK_InstantPowerConsumption 8191 "Invalid" ;
Line 1970: VAL_ 1015 IPK_AverageFuelConsumption 65535 "Invalid" 65534 "Initial" 65533 "Abnormal" ;
挨个戳开每条搜索结果查看详细内容,逐句解释:
1、报文消息数据格式解读
BO_[空格符][ID][空格符][消息名]:[空格符][消息长度][空格符][消息发出节点] (dbc文件以空格符拆分数据信息,类似于csv文件以","拆分数据)
BO_ 1015 IPK_ODO_Consump: 8 Vector__XXX
BO_ 代表一条消息的起始标识
1015 消息ID的十进制形式,=0x3f7
IPK_ODO_Consump 消息名
: 分割符号
8 消息报文长度,帧字节数
Vector__XXX 发出该消息的网络节点,标识为Vector__XXX时未指明具体节点
2、信号信息数据格式解读
每条报文消息里面有多个报文信号,报文信号的信息的起始标识为"SG_", 在以"BO_"开始的报文消息之下以缩进形式呈现。
SG_ IPK_EVDTEodometer : 7|12@0+ (1,0) [0|999] "km" TBOX
SG_ 代表一个信号信息的起始标识
IPK_EVDTEodometer 信号名,分长名与短名,此处是短名
: 分割符号
7 信号起始bit
| 分割符号
12 信号总长度
@0+ @0表示是Motorola格式(Intel格式是1),+表示是无符号数据
(1,0) (精度值,偏移值)
[0|999] [最小值|最大值], 物理意义的最小与最大,现实世界的有物理意义的值,比如此处仪表续航里程最大999KM
"km" "单位"
TBOX 接收处理此信号的节点,同样可以不指明,写为Vector__XXX
1)此处说明一下@0,Motorola格式(Intel格式是1),这个决定了信号起始bit, 生成报文计算信号值时的大小端算法。
Motorola格式:
信号以高字节低位起始,此处占了12bit, 以第二字节的低bit 12位算起,计12个bit总长度,信号是连续的。比如我设置续航里程998KM, 信号值为 3E,60,00,00,00,00,00,00
Intel格式:
信号以低字节低位起始,此处占了12bit, 以第一字节的低bit 0位算起,计12个bit总长度,信号是非连续的。比如我设置续航里程998KM, 信号值为 E6,03,00,00,00,00,00,00
2)再解释下精度值与偏移量,物理值与信号值的关系公式:
信号值*精度值 + 偏移量 = 物理值
总线上报文消息中传递的是信号值,当此信号传递到ECU时,需转换为物理意义的值在输出接口显示。
举例:SG_ TCU_TransOilTemp : 7|8@0+ (1,-40) [-40|214] "°C" TBOX
若传感器显示16度,则信号值=0x38, 报文“38,00,00,00,00,00,00,00” (此处00表示未设置信号,","分割字节,以上同)
3、消息与信号的详细描述
CM_ BO_ 1015 "Transmitted by IPK, including EV DTE odometer, power consumption and fuel consumption";
CM_ SG_ 1015 IPK_EVDTEodometer "The EV DTE odometer ";
CM_ SG_ 1015 IPK_AveragePowerConsumption "Indicate average power consumption";
CM_ SG_ 1015 IPK_InstantPowerConsumption "Indicate instant power consumption";
CM_ SG_ 1015 IPK_AverageFuelConsumption "Indicate average fuel consumption";
4、消息发送周期
BA_ "GenMsgCycleTime" BO_ 1015 1000;
单位ms
5、信号默认值
BA_ "GenSigStartValue" SG_ 1015 IPK_EVDTEodometer 4095;
BA_ "GenSigStartValue" SG_ 1015 IPK_AveragePowerConsumption 8191;
BA_ "GenSigStartValue" SG_ 1015 IPK_InstantPowerConsumption 8191;
BA_ "GenSigStartValue" SG_ 1015 IPK_AverageFuelConsumption 65534;
十进制表示
6、值枚举或特殊值列举或取值范围描述
VAL_ 1015 IPK_EVDTEodometer 4095 "Invalid" ;
VAL_ 1015 IPK_AveragePowerConsumption 8191 "Invalid" 8190 "Abnormal" ;
VAL_ 1015 IPK_InstantPowerConsumption 8191 "Invalid" ;
VAL_ 1015 IPK_AverageFuelConsumption 65535 "Invalid" 65534 "Initial" 65533 "Abnormal" ;
以上是DBC解析的的完整内容,转载注明出处。下篇讲信号矩阵仿真的python实现。