• 【AUTOSAR-CAN-1】DataBase for Can——深入理解 DBC 通信矩阵


    NS_

    版本与新符号

    BS_ 波特率

    波特率 BS_:[baudrate:BTR1,BTR2]

    BU_ 网络节点定义

    BU_表示网络节点 BU_:Nodename1 Nodename2 Nodename3 ……

    BO_ 报文帧定义

    BO:CANId MessageName: MessageSize Transmitter

    • MessageSize 表示该报文数据域字节数
    • Transmitter 发送该报文的网络节点, 如果该报文没有指定发送节点, 则该值需设置为” Vector__XXX”

    SG_ Signal 信号定义

    SG_ SignalName : StartBit|SignalSize@ByteOrder ValueType (Factor,Offset) [Min|Max] Unit Receiver

    • StartBit、 SignalSize 信号起始位、信号长度
    • ByteOrder 表示信号的字节顺序: 0代表Motorola格式, 1代表Intel格式
      • Intel\小端 编码: 信号在一个字节内, msb 在字节高位, lsb 在字节低位; 跨字节时, msb 在高字节高位,lsb 在低字节低位, 顺序的
      • Motorola\大端 编码: 信号在一个字节内, msb 在字节高位, lsb 在字节低位; 跨字节时, msb 在低字节高位,lsb 在高字节低位,逆序的
    • ValueType 表示该信号的数值类型: +表示无符号数, -表示有符号数
    • Factor 表示因子, Offset 表示偏移量; 这两个值于该信号的原始值与物理值之间的转换。转换: 物理值=原始值*因子+偏移量;
    • Min|Max 表示该信号的最小值和最大值, 即指定了该信号值的范围; 这两个值为double类型
    • Unit 表示该信号的单位, 为字符串类型
    • Receiver 表示该信号的接收节点; 若该信号没有指定的接收节点, 则必须设置为“Vector__XXX”*

    编码补充-Bit Numbering

    对于一个十进制数8,其二进制1000,

    • lsb0 编号:最低有效位 lsb 地址为 0 开始的编码,即 msb first,对于二进制数 1000,编号为 bit3 bit2 bit1 bit0
    • msb0 编号:最高有效位 msb 地址为 0 开始的编码,即 lsb first,对于二进制数 1000,编号为 bit0 bit1 bit2 bit3

    lsb0
    bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
    msb0
    bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7

    Can DBC 和 Autosar ARXML,它们都采用的是 lsb0 的 bit numbering。

    编码补充-Endianness

    大小端编码都不影响一个字节内的数据位置,改变的是跨字节时数据的前后排列关系。

    字节内始终采用 lsb0,即,信号高有效位在字节内的高位, 信号低有效位在字节内的低位。

    对于数据 0x1234,二进制为 0001 0010 0011 0100,高字节为 0x12,低字节为 0x34。msb 为 0001 的首个 0, lsb 为 0100 的最后一个 0。

    Intel\小端: 从 lsb 开始延地址增加方向顺序排列,直到排到 msb
    在这里插入图片描述

    Motorola\大端:在 msb0 视图下,从 msb 开始延地址增加方向顺序排列,直到排到 lsb
    在这里插入图片描述

    lsb0 + motorola 计算公式

    bit 从 lsb0 转换到 msb0(或 msb0 转换到 lsb0):b = b - (b % 8) + 7 - (b % 8)

    1. b - (b % 8) 相当于只取 b 的 3 位之前的数字,得到 b 的字节地址
    2. 7 - (b % 8) 相当于 b 的后 3 位和 7 做异或运算,因为 7 是3位二进制数中最大的数,设属于 [0, 7] 的任何数为 x,7 - x = y,因为 7 是全 1,所以 y 和 x 一定没有重合的 1,所以 x ^ y = 7,因为 x + y = 7,因此这步可以成为异或操作。在 8 位的情况下,每个位的编码 0 - 7,lsb0 和 msb0 标号的同一个位置,相加永远为 7。整步可以优化为 b ^ 0x7u。
    3. 相加得到结果

    msb0时,从 lsb 转换到 msb:

    b = b + 1 - length

    msb0时,从 msb 转换到 lsb:

    b = b + length - 1

    从 lsb0 的 msb 转换到 lsb0 的 lsb:

    b = b - (b % 8) + 7 - (b % 8)
    b = b + length - 1
    b = b - (b % 8) + 7 - (b % 8)

    lsb0 + intel 计算公式

    lsb -> msb:b = b + Length - 1
    msb -> lsb:b = b - (Length - 1)

    CM_ 注解、注释

    CM_ Object CANId/NodeName SignalName “Comment”

    • Object 表示注解的对象,可以是节点 BU_ 报文 BO_ 消息 SG_
    • CANId/NodeName 表示进行注解的对象, 若前面的对象类型是信号或者报文, 则这里的值应为报文的ID(10进制数表示); 若前面的对象类型为节点, 则这里的值应为节点的名字;
    • SignalName 报文ID 后跟信号名字,表示对信号的注释
    • “Comment” 注释内容

    BA_ 属性定义

    BA_DEF_ 对报文、信号、节点的属性定义

    • BA_DEF_ Object AttributeName ValueType Min Max;
    • BA_DEF_DEF_ AttributeName DefaultValue; 声明属性的默认值

    BA 感觉像是属性声明

    • BA AttributeName Object [CANId] [NodeName|SignalName|env_var_name] AttributeValue

    VAL_ 信号数值表的定义

    VAL_ CANId SignalName N “DefineN” …… 0 “Define0”
    该信号的有效值分别用什么符号表示, “DefineN” 代表数值 N

    DBC 可以覆盖的 COM 基础功能

    在这里插入图片描述

  • 相关阅读:
    Python单元测试之道:从入门到精通的全面指南
    lua 拓展math库,增加四舍五入函数 math.round
    【FreeRTOS】10 事件标志组
    解决java在idea运行正常,但是打成jar包后中文乱码问题
    一周时间深扒事务之事务类内部调用失效 超详细源码解析
    配置文件中的ini,json,以及lua实现方式的优劣比较
    多数据源配置代码
    线性代数的本质笔记
    jxTMS设计思想之流程开发(一)
    ROS Node
  • 原文地址:https://blog.csdn.net/qq_43261873/article/details/126158142