ドナドナされるプログラマのメモ

Windows用アプリのプログラミングメモ

CAN dbcファイルのフォーマット (2/2)

CAN dbcファイルの書式 2/2。各項目の詳細を書きます。

目次

 

各項目の詳細

VERSION

バージョン情報を定義する。オプション。

書式

'VERSION' version

変数

version = char_string;

バージョン情報。

備考

CANdbエディタで使用するバージョン情報を含む。空でもよい。

使用例

VERSION ""

_NS

new symbolsを定義する。詳細情報は見つからず。オプション。

書式

'_NS' ':'  {symbols}

変数

symbols = ['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_'];

使用するシンボルを列挙する。 

備考

使用例

NS_ :
 NS_DESC_
 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_

BS_

ビットタイミングを定義する。廃止された項目だがdbcファイル内に必須な項目。

書式

'BS_:' [baudrate ':' BTR1 ',' BTR2]

変数

baudrate = unsigned_integer;

ボーレートを設定する。

BTR1 = unsigned_integer;

BTRレジスタのビットタイミング1を設定する。

BTR2 = unsigned_integer;

BTRレジスタのビットタイミング2を設定する。

備考

使用例

BS_:

BU_

dbc内に登場する全てのノードを定義する。必須。

書式

'BU_:' {node_name}

変数

node_name = C_identifier;

ノード名。

備考

使用例

BU_: DUT HCM

VAL_TABLE_

値と文字列を関連付けるグローバルな変換テーブルを定義する。オプション。

書式

'VAL_TABLE_' value_table_name {value_description} ';'

変数

value_table_name = C_identifier;

テーブル名を定義する。

value_description = double char_string;

数値と文字列を関連付ける。

備考

単体ではあまり使われないが、SGTYPE_(通常使われない)で使用する。

使用例

BO_

メッセージを定義する。また、これに続くSG_でシグナルを定義する。必須。

書式

'BO_' message_id message_name ':' message_size transmitter {signal}

変数

message_id = unsigned_integer;

CAN ID。CAN IDのMSBが1の場合、拡張CANとみなされる。dbcファイル内で固有のIDである必要がある。

message_name = C_identifier;

メッセージ名。dbcファイル内で固有の名前である必要がある。

message_size = unsigned_integer;

メッセージのサイズ。単位はバイト。

transmitter = node_name | 'Vector__XXX';

メッセージを送信するノードの名前。node_nameはBU_で定義したものに含まれる必要がある。node_nameの型はC_identifier。送信するノードがない場合は'Vector__XXX'を設定する。

signal = (次節のSG_を参照)

備考

使用例

BO_ 910 DUTData1: 8 DUT
 SG_ SensorVoltage3 : 55|16@0+ (1,0) [0|5000] "mV" HCM
 SG_ SensorVoltage2 : 39|16@0+ (1,0) [0|5000] "mV" HCM
 SG_ SensorVoltage1 : 23|16@0+ (1,0) [0|5000] "mV" HCM
 SG_ SensorVoltage0 : 7|16@0+ (1,0) [0|5000] "mV" HCM

SG_

シグナルを定義する。オプション。

書式

'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);

あるIDの特定のデータ領域を複数のシグナルで共有するマルチプレクサ機能を使用する場合に必要な定義。共有パターンごとにunsigned_integerであるmultiplexer_switch_valueを割り当て、データ領域を共有するシグナルごとにm1, m2等を指定する。どれに切り替えるかは別途データ領域で指定する。このデータ領域を表すシグナルには'M'を指定する。

start_bit = unsigned integer;

シグナルが格納されているデータ領域のスタートビットを指定する。ビット位置は信号のエンディアンにより定義が異なる。下記図を参照。

f:id:donadonasan:20200813160813p:plain

CANデータのビット位置定義 (Racelogic社日本代理店VBOX JAPAN様のRLVBCAN02操作マニュアルより追記転載)

バイト境界をまたぐ場合、シグナルは以下のように成る。

f:id:donadonasan:20200813163224p:plain

バイト境界をまたぐシグナルの取り扱い(https://github.com/eerimoq/cantools/blob/master/cantools/database/can/signal.pyより)

signal_size = unsigned_integer;

シグナルの大きさ。単位はビット。

byte_order = '0' | '1'; (* 0: Big endian, 1: Little endian *) (2021/02/25修正)

シグナルのエンディアンを定義する。0はbig endian(Motorola), 1はlittle endian(Intel)。

value_type = '+' | '-'; (* +: 符号なし, -: 符号あり*)

シグナルの符号あり・符号なしを定義する。

factor = double;

シグナルに適用すべき倍率(ゲイン)を設定する。

offset = double;

シグナルに適用すべきオフセットを設定する。

物理値 = factor × シグナルの値 + offset

minimum = double;

シグナル物理値の最小値。

maximum = double;

シグナル物理値の最大値。

unit = char_string;

シグナルの単位を示す文字列。

receiver = node_name | 'Vector__XXX';

シグナルを受け取るノード名。node_nameはBU_で定義したものに含まれる必要がある。node_nameの型はC_identifier。受信するノードがない場合は'Vector__XXX'を設定する。

備考

シグナルの型はSIG_VALTYPE_で指定可能。特にfloatおよびdoubleはここで指定する必要がある。なお、小数点や符号のある物理値をCANで送る場合はfactorおよびoffsetを用いてシグナルを符号なし整数とし、データサイズを圧縮することが多い。

使用例

BO_を参照。

SIG_VALTYPE_

シグナルの型を定義する。オプション。

書式

'SIG_VALTYPE_' message_id signal_name signal_extended_value_type ';'

変数

message_id = unsigned_integer;

CAN ID。

signal_name = C_identifier;

シグナル名。

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

0: 符号なしまたは符号あり整数

1: 32-bit IEEE 浮動小数点 (float)

2: 64-bit IEEE 浮動小数点 (double)

3: 不明

備考

SIG_VALTYPE_が未定義の場合、シグナルの型は符号なしまたは符号あり整数とみなされる。

使用例

BO_TX_BU_

メッセージの送信ノードが複数ある場合に定義する。上位プロトコルが本情報を使用する可能性がある。オプション。

書式

'BO_TX_BU_' message_id ':' {transmitter} ';'

変数

message_id = unsigned_integer;

CAN ID。 

transmitter = node_name | 'Vector__XXX';

メッセージを送信するノードの名前。node_nameはBU_で定義したものに含まれる必要がある。node_nameの型はC_identifier。

備考

定義上はtransmitterに'Vector__XXX'を設定できるが、本当に設定できるのか不明。

使用例

VAL_

シグナルまたは環境変数の値から文字列への変換テーブルを定義する。オプション。

書式

シグナル用:

'VAL_' message_id signal_name {value_description} ';'

環境変数用:

'VAL_' env_var_name {value_description} ';'

変数

message_id = unsigned_integer;

CAN ID。

signal_name = C_identifier;

シグナル名。

value_description = double char_string;

値と文字列の関係。

env_var_name = C_identifier;

環境変数名。

備考

シグナルの変換テーブルはシグナルの定義(SG_)後、環境変数の変換テーブルは環境変数の定義(EV_)後にしたほうが良さそうである。

使用例

シグナル用:

VAL_ 300 WARNING_flag 0 "N/A" 1 "WARNING" ;

環境変数用:

VAL_ Move_Stop 1 "On" 0 "Off" ;

EV_

環境変数を定義する。オプション。

書式

'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 *)

環境変数の型。doubleは指定不能環境変数には"Data"型も保存できる。備考を参照。

minimum = double;

値の最小値。

maximum = double;

値の最大値。

unit = char_string;

値の単位。

initial_value = double;

値の初期値。

ev_id = unsigned_integer; (* 廃止 *)

廃止されているが何らかの値を設定する必要がある。

access_type = 'DUMMY_NODE_VECTOR0' | 'DUMMY_NODE_VECTOR1' | 'DUMMY_NODE_VECTOR2' | 'DUMMY_NODE_VECTOR3'; (* 0: 無制限, 1: read, 2: write, 3: readWrite *) 

access_nodeに許可するアクセス権限。

access_node = node_name | 'VECTOR__XXX';

環境変数へのアクセスを許可するノード。node_nameはBU_で定義したものに含まれる必要がある。node_nameの型はC_identifier。アクセスするノードがない場合は'Vector__XXX'を設定する。

備考

"Data"型を保存したい場合はENVVAR_DATA_にて対象変数名およびデータサイズを指定する。

使用例

EV_ Back_ECU_status: 0 [0|0] "" 0 1 DUMMY_NODE_VECTOR0 Vector__XXX;

ENVVAR_DATA_

環境変数のデータサイズを指定する。オプション。

書式

'ENVVAR_DATA_' env_var_name ':' data_size ';'

変数

env_var_name = C_identifier;

環境変数名。

data_size = unsigned_integer;

データサイズ。単位はバイト。

備考

ENVVAR_DATA_にてデータサイズを指定された環境変数は独自の型"Data"となる。これにより指定された環境変数は任意のデータ長とできる。

使用例

 SGTYPE_

複数のシグナルに共通するプロパティを設定する。通常使われない。オプション。

書式

共通プロパティの定義

'SGTYPE_' signal_type_name ':' signal_size '@' byte_order value_type '(' factor ',' offset ')' '[' minimum '|' maximum ']' unit default_value ',' value_table ';'

シグナルと共通プロパティの関連付け

'SGTYPE_' message_id signal_name ':' signal_type_name ';'

変数

signal_type_name = C_identifier;

シグナルタイプ名。

signal_size = unsigned_integer;

シグナルの大きさ。単位はビット。

byte_order = '0' | '1'; (* 0: little endian, 1: big endian *)

シグナルのエンディアンを定義する。0はlittle endian(Intel), 1はbig endian(Motorola)。

value_type = '+' | '-'; (* +: 符号なし, -: 符号あり*)

シグナルの符号あり・符号なしを定義する。

factor = double;

シグナルに適用すべき倍率(ゲイン)を設定する。

offset = double;

シグナルに適用すべきオフセットを設定する。

物理値 = factor × シグナルの値 + offset

minimum = double;

シグナル物理値の最小値。

maximum = double;

シグナル物理値の最大値。

unit = char_string;

シグナルの単位を示す文字列。

default_value = double;

値のデフォルト値。

value_table = value_table_name;

VAL_TABLE_にて作成した値と文字列の関係テーブルであるvalue_tableの名前を指定する。型はC_identifier。

message_id = unsigned_integer;

CAN ID。

signal_name = C_identifier;

シグナル名。

 備考

value_tableは省略できない。そのため、関係テーブルを使わない場合でもダミーのテーブルが必要と思われる。

使用例

SIG_GROUP_

メッセージ内のシグナルのグループを定義する。オプション。

書式

'SIG_GROUP_'  message_id signal_group_name repetitions ':' {signal_name} ';'

変数

message_id = unsigned_integer;

CAN ID。

 signal_group_name = C_identifier;

グループ名。

repetitions = unsigned_integer;

繰り返し回数。

signal_name = C_identifier;

シグナル名。

 備考

使用例

CM_

コメント(説明)を設定する。

書式

'CM_' (comment |
  'BU_' node_name comment |
  'BO_' message_id comment |
  'SG_' message_id signal_name comment |
  'EV_' env_var_name comment)

  ';'

変数

comment = char_string;

コメント。説明。

node_name = C_identifier;

ノード名。

message_id = unsigned_integer;

CAN ID。

signal_name = C_identifier;

シグナル名。 

env_var_name = C_identifier;

環境変数名。

備考

一番最初のcommentのみの書式が、何のためにあるのかは不明。

使用例

CM_ BO_ 1920 "This is a auto-generated message for not used signals.";

BA_DEF_

ユーザー定義属性を定義する。ここで定義した属性の値はBA_DEF_DEF_を用いてデフォルト値を設定する必要がある。個別の属性の値はBA_にて指定できる。オプション。

書式

'BA_DEF_' object_type attribute_name attribute_value_type ';'

変数

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

ユーザー定義属性を付与するオブジェクトのタイプを指定する。

attribute_name = '"' C_identifier '"';

ユーザー定義属性の名前。

attribute_value_type = ('INT' minimum_integer maximum_integer) |
  ('HEX' minimum_integer maximum_integer) |
  ('FLOAT' minimum maximum) |
  ('STRING') |
  ('ENUM' [enum_name { ',' enum_name}];

ユーザー定義属性の型を設定する。minimum_integer = signed_integer; maximum_integer = signed_integer; minimum = double; maximum = double; でそれぞれ値の最小値と最大値を定める。enum_name = char_string; でENUMの文字列を定める。ユーザー定義属性は通信等に現れないため、各文字列がどの数値に割り当てられるかはユーザーから隠蔽されている模様。

備考

使用例

BA_DEF_ BU_ "DiagNode" ENUM "No","Yes";

BA_DEF_DEF_ "DiagNode" "Yes";

BA_ "DiagNode" BU_ Tester "No";

BA_DEF_DEF_

ユーザー定義属性のデフォルト値を設定する。オプション。

書式

'BA_DEF_DEF_' attribute_name attribute_value ';'

変数

attribute_name = '"' C_identifier '"';

ユーザー定義属性の名前。

 attribute_value = unsigned_integer | signed_integer | double | char_string;

デフォルト値。unsigned_integerをわざわざ含めている理由は不明。

備考

使用例

BA_DEF_を参照。

BA_

ユーザー定義属性の値を個別に設定する。オプション。

書式

'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)
  ';'

変数

attribute_name = '"' C_identifier '"';

ユーザー定義属性の名前。

 attribute_value = unsigned_integer | signed_integer | double | char_string;

デフォルト値。unsigned_integerをわざわざ含めている理由は不明。

node_name = C_identifier;

ノード名。

message_id = unsigned_integer;

CAN ID。

signal_name = C_identifier;

シグナル名。 

env_var_name = C_identifier;

環境変数名。

 備考

使用例

BA_DEF_を参照。