有没有人知道、外行人想了解

#新能源公交车canDBC 写一个需要多久?简单还是难啊,有老哥知道吗?

(欢迎采纳)
要花个大半年吧,毕竟东西还多:

img

你还需要了解准备一堆东西:
for example:


DBC文件描述单个CAN网络的通信。这个信息足以监测和分析网络并模拟不是物理可用的节点(剩余的总线模拟)。

DBC文件也可以用来开发电子控制单元的通信软件,该控制单元应该是CAN网络的一部分。

DBC文件不处理ECU的功能行为。



本文档中使用以下常规元素:

unsigned_integer:一个无符号整数

signed_integer:一个有符号的整数

double:双精度浮点数

char_string:除双连字符('“')以外的任何可打印字符组成的任意字符串。

C_identifier:一个有效的C_identifier。

C_identifiers必须以字母字符或下划线开始,并可能进一步包含

字母数字字符和下划线。

C_identifier=(alpha_char|'_'){alpha_num_char|'_'}

DBC文件中使用的C标识符最多可以有128个字符。为了与旧工具兼容,长度不应超过32个字符。

DBC文件中使用的其他字符串可能是任意长度。

在DBC文件中使用的关键字o标识一个对象的类型在下表中给出:

关键字

对象类型

BU_网络节点

BO_消息

SG_信号

EV_环境变量



语法使用扩展的BNF符号(Backus-Naur-Format)进行描述。

符号含义=使用右侧的语法(语法规则)

定义=的左侧的名称。

;分号终止一个定义。

|竖条表示替代方案。

[...]括号内的定义是可选的(零次或一次出现)。

{...}大括号内的定义重复(零次或多次出现)

(...)括号定义分组元素。

’...'连字符中的文本必须按照定义出现。

(*...*)评论。



艳阳高照:C# excel 2 dbc
2 赞同 · 2 评论文章
DBC文件的结构

DBC文件格式具有以下总体结构:

DBC_file=version

new_symbols

bit_timing(*过时但需要*)

nodes

value_tables

messages

message_transmitters

environment_variables

environment_variables_data

signal_types

comments

attribute_definitions

sigtype_attr_list

attribute_defaults

attribute_values

value_descriptions

category_definitions(*过时*)

categories(*过时*)

filter(*过时*)

signal_type_refs

signal_groups

signal_extended_value_type_list;描述CAN网络基本通信的DBC文件包括以下部分:

Bit_timing这部分是必需的,但通常是空的。

nodes这部分是必需的,并定义了网络节点。

messages本节定义了消息和信号。

以下部分不在正常的DBC文件中使用。它们只是为了完整而定义在这里:

signal_types

sigtype_attr_list

category_definitions

category

filter

signal_type_refs

signal_extended_value_type_list

描述CAN通信的DBC文件,不定义系统或剩余总线仿真的任何附加数据,不包括环境变量。

版本

DBC文件包含一个包含版本和新符号条目的头文件。版本或者是空的,或者是CANdb编辑器使用的字符串。

version=['VERSION''''{CANdb_version_string}'“'];

新符号规范

new_symbols=['NS_'':'['CM_']['BA_DEF_']['BA_']['VAL_']['CAT_DEF_']['CAT_']['FILTER']['BA_DEF_DEF_']['EV_DATA_']['ENVVAR_DATA_']['SGTYPE_']['SGTYPE_VAL_']['BA_DEF_SGTYPE_']['BA_SGTYPE_']['SIG_TYPE_REF_']['VAL_TABLE_']['SIG_GROUP_']['SIG_VALTYPE_']['SIGTYPE_VALTYPE_']['BO_TX_BU_']['BA_DEF_REL_']['BA_REL_']['BA_DEF_DEF_REL_']['BU_SG_REL_']['BU_EV_REL_']['BU_BO_REL_']['SG_MUL_VAL']];

位定时定义

位定时部分定义了波特率和网络的BTR寄存器的设置这部分已经过时,不再使用。关键字'BS_'必须出现在DBC文件中,省略会出错

bit_timing='BS_:'[baudrate':'BTR1','BTR2];

格式:BS_:[baudrate:BTR1,BTR2]

baudrate=unsigned_integer;

BTR1=unsigned_integer;

BTR2=unsigned_integer;




网络节点定义

节点部分定义所有参与节点的名称,本节中定义的名称在本节中必须是唯一的。

nodes='BU_:'{node_name};

格式:BU_: name1 name2 name3 …

node_name=C_identifier;

值表定义

值表部分定义了全局值表。值表中的值描述定义了信号原始值的值编码。在常用的DBC文件中,不使用全局值表,而是分别为每个信号定义值描述。

value_tables={value_table};

格式:value_table='VAL_TABLE_’value_table_name {value_description}’;';

value_table_name=C_identifier;

值描述(值编码)

值描述为单个值定义文本描述。该值可以是在总线上传输的信号原始值,也可以是剩余总线(虚拟节点)模拟中环境变量的值。

value_description=double char_string;


报文消息定义

消息部分定义了集群中所有帧的名称以及它们的属性和在这些帧上传输的信号。

messages={message};

message=BO_ message_id message_name':'message_size message_Transmitter

{signal};


message_id=unsigned_integer;该消息的CAN-ID。CAN-ID在DBC文件中必须是唯一的。如果CAN-ID的最高有效位被设置,则该ID是扩展的CANID。扩展的CANID可以通过用掩码0xCFFFFFFF屏蔽掉最高有效位来确定。

message_name=C_identifier;在这个部分定义的名字在这组消息中必须是唯一的。

message_size=unsigned_integer;message_size以字节为单位指定消息的大小。长度范围为0-8。

transmitter=node_name|'Vector__XXX'; 发送者名称指定发送消息的节点的名称。发件人名称必须在节点部分的节点名称集中定义。如果消息没有发送者,则必须在这里给出字符串Vector__XXX。



信号定义


消息的信号部分列出消息中放置的所有信号,消息数据字段中的位置及其属性。

signal='SG_’signal_name multiplexer_indicator’:’start_bit’|’signal_size’@’byte_order value_type’(‘factor’,’offset’)’'[‘minimum’|’maximum’]’unit receiver {',’receiver};

signal_name=C_identifier; 这里定义的名称对于单个消息的信号必须是唯一的。

multiplexer_indicator=‘'|'M'|m

multiplexer_switch_value;多路复用器指示器定义信号是正常信号、多路复用信号的多路开关,还是多路复用信号。

“M”(大写)字符将信号定义为多路复用器开关。多路复用器交换机中只能有一个信号内的信号。

“m”(小写)字符,后跟一个无符号整数,将信号定义为复用器开关复用的信号。如果多路复用器信号的开关值等于其multiplexer_switch_value,则多路复用信号被传送到消息中。

start_bit=unsigned_integer; start_bit值指定帧的数据字段内信号的位置。对于字节顺序为英特尔(little endian)的信号给出了最低有效位的位置。对于具有字节顺序Motorola(big endian)的信号,给出最高有效位的位置。这些位以锯齿形方式计数。起始位必须在0到(8*message_size-1)的范围内。

signal_size=unsigned_integer; signal_size以位为单位指定信号的大小,范围为1-64。

byte_order='0'|'1';(*0=小端,1=大端*)如果信号的字节顺序是Intel(小端),则byte_format是1;如果字节顺序是Motorola(大端),则byte_format是0。

value_type='+'|’-’;(*+=无符号,-=有符号*)value_type将信号定义为unsigned(+)或signed(-)类型。

factor=double;精度

offset=double;偏移量

系数和偏移定义了线性转换规则,将信号原始值转换为信号的物理值:

physical_value=raw_value*factor+offset

raw_value=(physical_value-offset)/factor

从转换规则公式中可以看出,该因子不能为0。

minimum=double;物理总线最小值。

maximum=double;物理总线最大值。

最小值和最大值定义信号有效物理值的范围。

unit=char_string;信号的单位,为字符串类型,可以省略。

receiver=node_name|'Vector__XXX';

接收者名称指定信号的接收者。接收者名称必须在节点部分的一组节点名称中定义。如果信号没有接收器,字符串'Vector__XXX'必须在这里给出。

值为“float”和“double”的信号在sig-nal_valtype_list部分有附加条目。

signal_extended_value_type_list='SIG_VALTYPE_’message_id

signal_name

signal_extended_value_type’;';

signal_extended_value_type='0'|'1'|'2'|'3';

(*0=signed or unsigned integer,1=32-bit IEEE-float,2=64-bit IEEE-double*)

消息发送器的定义


消息发送器部分使得能够定义单个节点的多个发送器节点。这用于描述更高层协议的通信数据。这不用于定义CAN二层通信。

message_transmitters={message_transmitter};

Message_transmitter='BO_TX_BU_’message_id’:’{transmitter}’;';

格式:CM_ Object Msg_ID/Signal_Name “Signal_Description;”

Object:注解的对象类型,可以是节点“BU_”、报文“BO_”、消息”SG_”。

Msg_ID:报文标识符,十进制表示。

Signal_Name:信号名称,命名规则和C语言变量相同。

Signal_Description:信号描述,为字符串类型。


例如:CM_ BO_ 1024 “网络管理报文”;代表报文ID为0x400的报文描述为网络管理报文。

CM_ SG_ 1024 BCM_WakeUp “唤醒信号”;代表报文ID为0x400的报文中信号名称为BCM_WakeUp的描述信息为唤醒信号。



信号值描述(值编码)

信号值描述定义了特定信号原始值的编码。


value_descriptions={value_descriptions_for_signal|value_descriptions_for_env_var};

value_descriptions_for_signal=VAL_ Msg_ID Signal_Name N “DefineN” …… 0 “Define0”;”

格式:VAL_ Msg_ID Signal_Name N “DefineN” …… 0 “Define0”;”

Msg_ID:报文标识符,十进制表示。

Signal_Name:信号名称,命名规则和C语言变量相同。

N “DefineN” …… 0 “Define0”:表示定义的数值表内容,即该信号的有效值分别用什么符号表示。

例如:VAL_ 1024 BCM_WakeUp 1 “off” 0 “on” ;代表报文ID为0x400中的信号名称为BCM_WakeUp的值0x01代表off,0x00代表on。



环境变量定义

在环境变量部分中定义了用于系统仿真和剩余总线仿真工具的环境变量。

environment_variables={environment_variable}

environment_variable='EV_’env_var_name’:’env_var_type’[‘minimum’|’maximum’]’unit

initial_value

ev_id

access_type

access_node

{',’access_node}’;';

env_var_name=C_identifier;

env_var_type='0'|'1'|'2';

(*0=integer,1=float,2=string*)

minimum=double;

maximum=double;

initial_value=double;

ev_id=unsigned_integer;

(*obsolete*)

access_type='DUMMY_NODE_VECTOR0'|'DUMMY_NODE_VECTOR1'|'DUMMY_NODE_VECTOR2'|'DUMMY_NODE_VECTOR3';

(*0=unrestricted,1=read,2=write,3=readWrite*)

access_node=node_name|'VECTOR_XXX';

环境变量数据部分中的条目将此处列出的环境定义为数据类型“数据”。这种类型的环境变量可以存储给定长度的任意二进制数据。长度以字节为单位给出。

environment_variables_data=environment_variable_data;

environment_variable_data='ENVVAR_DATA_’env_var_name’:’data_size’;';

data_size=unsigned_integer;



环境变量值描述

环境变量的值描述提供了变量特定值的文本表示。

value_descriptions_for_env_var='VAL_’env_var_aname

{value_description}’;';



信号类型和信号组定义

信号类型用于定义几个信号的公共属性。它们通常不用于DBC文件。

signal_types={signal_type};

signal_type='SGTYPE_’signal_type_name’:’signal_size’@’byte_order

value_type’(‘factor’,’offset’)’'[‘minimum’|’maximum’]’unit

default_value’,’value_table’;';

signal_type_name=C_identifier;

default_value=double;

value_table=value_table_name;

signal_type_refs={signal_type_ref};

signal_type_ref='SGTYPE_’message_id

signal_name’:’signal_type_name’;';

信号组被用来定义消息内的一组信号,例如,以确定一个组的信号必须共同更新。

signal_groups='SIG_GROUP_’message_id

signal_group_name

repetitions’:’{signal_name}’;';

signal_group_name=C_identifier;

repetitions=unsigned_integer;



注释定义

注释部分包含对象注释。对于每个有注释的对象,本节定义了一个带有对象类型标识的条目。

comments={comment};

comment='CM_’(char_string|'BU_’node_name

char_string|'BO_’message_id

char_string|'SG_’message_id

signal_name

char_string|'EV_’env_var_name

char_string)’;';

12用户定义的属性定义

用户定义的属性是扩展DBC文件的对象属性的一种手段。这些附加属性必须使用具有属性默认值的属性定义进行定义。对于每个具有为该属性定义的值的对象,都必须定义一个属性值条目。如果没有为对象定义属性值条目,则该对象的属性值是该属性的默认值。



属性定义

attribute_definitions={attribute_definition};

attribute_definition='BA_DEF_’object_type

attribute_name

attribute_value_type’;';

object_type=''|'BU_'|'BO_'|'SG_'|'EV_';

attribute_name='"‘C_identifier’"';

attribute_value_type='INT’signed_integer

signed_integer|'HEX’signed_integer

signed_integer|'FLOAT’double

double|'STRING'|'ENUM’[char_string

{',’char_string}]attribute_defaults={attribute_default};

attribute_default='BA_DEF_DEF_’attribute_name

attribute_value’;';

attribute_value=unsigned_integer|signed_integer|double|char_string;



属性值

attribute_values={attribute_value_for_object};

attribute_value_for_object='BA_’attribute_name

(attribute_value|'BU_’node_name

attribute_value|'BO_’message_id

attribute_value|'SG_’message_id

signal_name

attribute_value|'EV_’env_var_name

attribute_value)

还可以咨询 https://www.zhihu.com/people/luckliuning 这个人,ta是做这一块的

想学应该不难,主要你还是得了解这个dbc它有那些部分构成。我觉得:
1、你先了解一下dbc
2、在网上找个Demo,在canoe工具,走一遍。
如果你觉得没问题,那就没问题。如果觉得比较难,那就说明这个可能不太适合你。
但我觉得想学,肯定难不倒,加油!