DBC是Database Can的缩写,其代表的是CAN的数据库文件,在这个文件中把CAN通讯的信息定义的非常完整清楚,而CAN网络的通讯就是依据这个文件的描述进行的,所以DBC文件的作用非常强大,正是因为有了它才可以使得整个CAN网路的节点控制器无差错的协同同步开发。
DBC文件一般我们在写应用代码时,会参考DBC文件的一些参数,编写他的代码。
当我们打开一份DBC文件时,主要看 Network nodes下里的网络节点,网络节点分为多个类,如下图,分为SDE、sensor2、sensor3三个类节点。
当点开节点时,会看到类节点下的 TX 与 RX 下的多个messages。
从图中可以看出,factory 是因数,offset 是偏移量,最大最小值、Multiplexing 是多路复用。
如图所示,有5种message,每个message由很多信号组成。
基于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;
}
factor(系数) 与 offset(偏移量) 定义了物理值(physical,物理量,如vehicle speed,engine speed,water temperature)与原始值(raw,总线上传输的值)的线性转换规则.
转换公式:
physical_value = raw_value * factor + offset
raw_value = ( pysical_value - offset ) / factor