栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

如何看一份DBC文件(一)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何看一份DBC文件(一)

什么是DBC文件

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

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


一、DBC文件内容

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

当点开节点时,会看到类节点下的 TX 与 RX 下的多个messages。

每个message 又包含了多个signals。

二、DBC文件中的重点内容 1. 信号的起始位,bit长度、factory因数、offset偏移量,最大最小值、多路复用

从图中可以看出,factory 是因数,offset 是偏移量,最大最小值、Multiplexing 是多路复用。

1.2 多路复用

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

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

基于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)
{
  
  return (x < y) ? x : y;
}

static float32 GetMax(float32 x, float32 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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/934210.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号