如何看一份DBC文件

什么是DBC文件

DBC是Database Can的缩写,其代表的是CAN的数据库文件,在这个文件中把CAN通讯的信息定义的非常完整清楚,而CAN网络的通讯就是依据这个文件的描述进行的,所以DBC文件的作用非常强大,正是因为有了它才可以使得整个CAN网路的节点控制器无差错的协同同步开发。

DBC文件一般我们在写应用代码时,会参考DBC文件的一些参数,编写他的代码。


一、DBC文件内容

当我们打开一份DBC文件时,主要看 Network nodes下里的网络节点,网络节点分为多个类,如下图,分为SDE、sensor2、sensor3三个类节点。
如何看一份DBC文件_第1张图片

当点开节点时,会看到类节点下的 TX 与 RX 下的多个messages。
如何看一份DBC文件_第2张图片

每个message 又包含了多个signals。
如何看一份DBC文件_第3张图片

二、DBC文件中的重点内容

1. 信号的起始位,bit长度、factory因数、offset偏移量,最大最小值、多路复用

从图中可以看出,factory 是因数,offset 是偏移量,最大最小值、Multiplexing 是多路复用。
如何看一份DBC文件_第4张图片

1.2 多路复用

如何看一份DBC文件_第5张图片

如何看一份DBC文件_第6张图片

如图所示,有5种message,每个message由很多信号组成。

1.2 信号中Length[bit]、factory、offset、minimum、maximum的用法实现以及运算

如何看一份DBC文件_第7张图片

基于AUTOSAR 实现的部分代码:

void XXXX()
{
    (void)ProcessDataOfSingleTarget(IPduData,  0,&TargetData.as_Target[0], MsgId);
    (void)ProcessDataOfSingleTarget(IPduData,188,&TargetData.as_Target[1], MsgId);
}
static boolean ProcessDataOfSingleTarget(const uint8 *IPduData, uint16 offset, TS_RDA_5G3_00_DFPV_Target *target,uint32 MsgId)
{
    ReadSignalDataFromPdu(IPduData,  36u + offset, 15, SignalEndianness_Little, SignalType_uint16, &SignleTargetData.YPos);
    ReadSignalDataFromPdu(IPduData, 180u + offset,  8, SignalEndianness_Little, SignalType_uint8,  &SignleTargetData.YPosStd);
    ReadSignalDataFromPdu(IPduData,  65u + offset, 14, SignalEndianness_Little, SignalType_uint16, &SignleTargetData.YVelocity);
    ReadSignalDataFromPdu(IPduData, 188u + offset,  8, SignalEndianness_Little, SignalType_uint8,  &SignleTargetData.YVelocityStd);

    target->YPos = ConvertToPhysicalValue((float32)SignleTargetData.YPos,(float32) 0.01,(float32)-163.84,(float32)-163.84,(float32) 163.83);
    target->YPosStd = ConvertToPhysicalValue((float32)SignleTargetData.YPosStd, (float32) 0.1, (float32)0.0,(float32)0.0,(float32) 25);
    target->YVelocity = ConvertToPhysicalValue((float32)SignleTargetData.YVelocity, (float32) 0.01,(float32)-81.92, (float32)-81.92, (float32) 81.91);
    target->YVelocityStd = ConvertToPhysicalValue((float32)SignleTargetData.YVelocityStd,(float32) 0.1, (float32)0.0,(float32)0.0,(float32) 15);
}

static float32 GetMin(float32 x, float32 y)
{
  /* GetMin from x y*/
  return (x < y) ? x : y;
}

static float32 GetMax(float32 x, float32 y)
{
   /* GetMax from x y*/
   return (x > y) ? x : y;
}

 float32 ConvertToPhysicalValue(float32 value, float32 factor, float32 offset, float32 minValue, float32 maxValue)
{
	// 运算
  float32 result = (value * factor) + offset;

  // As in a DBC file, when both the upper and lower bound are equal to 0, we do not take them into account.
  if ((minValue != (float32)0) || (maxValue != (float32)0))
  {
    // Take into account the upper and lower bounds.
    result = GetMin(result, maxValue);
    result = GetMax(minValue, result);
  }

  return result;
}

tips

factor(系数) 与 offset(偏移量) 定义了物理值(physical,物理量,如vehicle speed,engine speed,water temperature)与原始值(raw,总线上传输的值)的线性转换规则.

转换公式:

physical_value = raw_value * factor + offset

raw_value = ( pysical_value - offset ) / factor

你可能感兴趣的:(BSW&ADAS,网络协议)