【CanTp】車両診断通信 その37【シミュレーション㉔】

【CanTp】車両診断通信 その37【シミュレーション㉔】 車両診断通信

バックナンバーはこちら。
https://www.simulationroom999.com/blog/diagnostic-communication-backnumber/

はじめに

ISO-TPのシミュレーションをしよう。のシリーズ。
CanTpのコンフィグレーションの構造体定義について。

登場人物

博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

AUTOSAR-CanTpのコンフィグレーション構造体

太郎くん
太郎くん

もう、わけわからないからとっととコードを提示して!

フクさん
フクさん

(コード見れば分かるとおもってるか?ま、いいか)

フクさん
フクさん

こんな感じになるよ。

CH_RX_CB ch_rx_cb[2] = {0};
CH_TX_CB ch_tx_cb[2] = {0};

CH_INIB ch_inib_table[1] = {
	{
		CANTP_MODE_HALF_DUPLEX,	/* チャネル通信方式 */
		&ch_rx_cb[0],				/* チャネル受信管理ブロック */
		&ch_tx_cb[0],				/* チャネル送信管理ブロック */
	},
};

TX_NSDU_INIB tx_nsdu_inib = {
	0,	/* CanIf_TransmitでSF,FF,CF送信時に指定するCanIfのPduId */
	0,	/* CanTp_TxConfirmationでSF,FF,CF送信完了時に指定されるCanTpのPduId */
	1,	/* CanTp_RxIndicationでFC受信時に指定されるCanTpのPduId */
	0,	/* PduR_CanTpTxConfirmationに指定するPduId */
};

RX_NSDU_CB rx_nsdu_cb = {
	0,	/*STmin*/
	0,	/*BS*/
};

RX_NSDU_INIB rx_nsdu_inib = {
	5,	/* FC(WAIT)の最大送信数 */
	0,	/* STmin値 */
	0,	/* BS値 */
	2,	/* CanIf_TransmitでFC送信時に指定するCanIfのPduId */
	2,	/* CanTp_RxIndicationでSF,FF,CF受信時に指定されるCanTpのPduId */
	3,	/* CanTp_TxConfirmationでFC送信完了時に指定されるCanTpのPduId */
	2,	/* PduR_CanTpRxIndication時に指定するPduId */
	&rx_nsdu_cb,	/* 受信NSDU管理ブロック */	
};

const NSDU_INIB nsdu_inib_table[4] = {
	{
		0,				/* 所属するチャネル番号 */
		CANTP_SEND,		/* NSDU送受信方向 */
		1000,			/* N_Ar/N_Asタイムアウト値 */
		1000,			/* N_Br/N_Bsタイムアウト値 */
		1000,			/* N_Cr/N_Csタイムアウト値 */
		CANTP_ON,		/* 通信中止の許可/禁止 */
		CANTP_NORMALFIXED,	/* アドレスフォーマット */
		CANTP_ON,		/* Paddingの使用有無 */
		CANTP_PHYSICAL,	/* N-SDUの通信タイプ */
		0,				/* N_AE */
		0x10,			/* N_SA */
		0xF1,			/* N_TA */
		7,				/* 最大SDUデータ長(シングルフレーム) */
		4095,			/* 最大SDUデータ長(マルチフレーム) */
		7,				/* SF最大データ長 */
		6,				/* FF最大データ長 */
		7,				/* CF最大データ長 */
		&tx_nsdu_inib,		/* 送受信別NSDU初期化ブロック */
	},
	{
		0,				/* 所属するチャネル番号 */
		CANTP_RECEIVE,		/* NSDU送受信方向 */
		1000,			/* N_Ar/N_Asタイムアウト値 */
		1000,			/* N_Br/N_Bsタイムアウト値 */
		1000,			/* N_Cr/N_Csタイムアウト値 */
		CANTP_ON,		/* 通信中止の許可/禁止 */
		CANTP_NORMALFIXED,	/* アドレスフォーマット */
		CANTP_ON,		/* Paddingの使用有無 */
		CANTP_PHYSICAL,	/* N-SDUの通信タイプ */
		0,				/* N_AE */
		0xF1,			/* N_SA */
		0x10,			/* N_TA */
		7,				/* 最大SDUデータ長(シングルフレーム) */
		4095,			/* 最大SDUデータ長(マルチフレーム) */
		7,				/* SF最大データ長 */
		6,				/* FF最大データ長 */
		7,				/* CF最大データ長 */
		&rx_nsdu_inib,		/* 送受信別NSDU初期化ブロック */
	},
};

PduIdType	pduid_to_nsduid_table[2] = {0,1};

CanTp_ConfigType cantp_config[1] = {
	1,				/* チャネル数 */
	ch_inib_table,	/* CH初期化ブロック配列 */
	2,				/* NSDU数 */
	nsdu_inib_table,	/* NSDU初期化ブロック配列 */
	2,				/* PDU数 */
	pduid_to_nsduid_table,	/* PduID引き当てテーブル */
	1,				/* 周期 */
};
太郎くん
太郎くん

・・・。

フクさん
フクさん

・・・。

太郎くん
太郎くん

わからーん!!

フクさん
フクさん

一応頑張ってコメント入れたんだよ!

CanIfのPduIdについて

太郎くん
太郎くん

まずところどころのPduIdがわからん。

フクさん
フクさん

あー、CanIf向けにPudIdだねー。
簡単に言うと、CanIfが内部でPudIdと紐づいたCANIDを持ってるんだよ。
今回の場合はPudIdは以下の意味を持っている。
0:0x18DAF110 の送信
1:0x18DA10F1 の受信
2:0x18DA10F1 の送信
3:0x18DAF110 の受信

太郎くん
太郎くん

んー、とするとちょっと分かってきた気がするなー。

CH_RX_CBこと受信管理ブロックとCH_TX_CBこと送信管理ブロックについて

太郎くん
太郎くん

先頭の方の
CH_RX_CB ch_rx_cb[2] = {0};
CH_TX_CB ch_tx_cb[2] = {0};
って、何に使うの?
0で埋めるだけで何かを定義している感じはないんだけど。

フクさん
フクさん

あー、
CH_RX_CBこと受信管理ブロックとCH_TX_CBこと送信管理ブロックのことだね。
実際の通信をする際のワーク用に使用される。
構造体としては以下になってるよ。

typedef struct rx_control_block {
	PduIdType		id;								/* 現在受信中ID */
	uint8			rx_status;						/* 受信状態 */
	uint8			rx_time;						/* 受信タイムアウトカウント状態(停止/N_Ar/N_Br/N_Cr) */
	uint32			rx_time_cnt;					/* タイムアウトカウンタ */
	PduLengthType	sdu_len;						/* SDUのデータ長 */
	PduLengthType	data_len;						/* 残りの受信データ長 */
	uint8			cf_sn;							/* CFで次に受信するシーケンスナンバー */
	uint8			fc_fs;							/* FCで送信したFS */
	uint8			fc_bs;							/* FCで送信したBS */
	uint8			fc_stmin;						/* FCで送信したSTmin */
	uint8			bs_cnt;							/* 受信CFカウンタ */
	uint8			wft_cnt;						/* 送信FC(WAIT)カウンタ */
} CH_RX_CB;
フクさん
フクさん

これらは、通信する際に使用されるんで、初期化時は0で埋めとく感じだね。

太郎くん
太郎くん

あー、これのおかげでマルチチャンネルってのが実現している感じかな?

フクさん
フクさん

そーだね。
メモリの制約がなければ、いくらでもチャンネルが定義できるってことにはなるかな。
実際はチャンネル数を定義する型が16bit長だから65535個が最大ではあるんだけどね。

太郎くん
太郎くん

んーでも、現実的にはいくらでもと言って良い数値だねー。

フクさん
フクさん

じゃー、定義とかも出来たんで次回は実際の動作にチャンレンジ!

太郎くん
太郎くん

おー!

まとめ

フクさん
フクさん

まとめだよ。

  • AUTOSAR-CanTpの具体的なコンフィグレーション構造体を定義した。
  • CanIfとやり取りする際にPduIdという番号を使用する。
    • 今回の場合は以下。
      • 0:0x18DAF110 の送信。
      • 1:0x18DA10F1 の受信。
      • 2:0x18DA10F1 の送信。
      • 3:0x18DAF110 の受信。
  • CH_RX_CBこと受信管理ブロックとCH_TX_CBこと送信管理ブロックはワーク用。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました