車載ネットワーク(7)CAN 通信手順とエラー処理

車載ネットワークは、オフィスネットワークに比べ格段に環境条件が厳しい。CAN は平衡伝送方式で比較的ノイズに強いが、GND は不安定で電気的にも厳しい環境だ。障害発生時も、ネットワーク全体を停止させることは危険だ。一部の障害箇所を切り離したり、縮小運転することで、可能な限り動き続けることが重要だ。CAN は伝送中に発生する様々なエラーを認識する機能と、エラー発生時の対処方法を規定している。図1 は主なエラーチェックだ。エラーを検出すると、エラーフレームを送信し、他のノードに知らせる。

エラーチェック
図1 エラーチェック
ビットエラー(Bit Error)

自分自身が送信したデータとバスをモニター(受信)したデータを比較し、異なればビットエラーを検出する。ただし、ID(Arbitration Field)と ACK(Acknowledge)は、他のノードが書き換える可能性があるためチェックしない。

フォーマットエラー(Format Error)

CRC Delimiter、ACK Delimiter、EOF は通常リセッシブと決められている。ドミナントを検出するとフォーマットエラーになる。

ACK エラー(ACK Error)

ACK 領域がドミナントにならないと ACK エラーになる。受信ノードは正しくデータを受信すると、ACK 領域をドミナントにドライブする。ACK がリセッシブからドミナントに変化しない場合は、全受信ノードが正しくデータを受信できなかったか、受信相手がバスに接続されていない場合だ。

CRC エラー(CRC Error)

送信した CRC 値が、受信ノードが計算した CRC 値と一致しないとCRC エラーになる。

スタッフエラー(Stuff Error)

スタッフエラーは、6個以上の連続した「0」または「1」を検出するとスタッフエラーになる。7個の連続したリセッシブを持つ EOF は、例外としてエラーとみなさない。

CAN ネットワークでは、エラーを検出するとエラーフレームを送信し、フレームを破壊することで他のノードにエラー発生を知らせる。エラーが多発するとネットワーク全体のパフォーマンスが低下し、全体の機能低下や機能停止を招きかねない。そこで、エラーを多発するノードに与えられる送信権を抑制したり、さらに状況が悪化した場合は、ネットワークから切り離す処置が段階的にとれるようになっている。

具体的には、各ノードにTEC(Transmit Error Counter:送信エラーカウンター)REC (Receive Error Counter:受信エラーカウンタ)を持ち、エラーが発生するとカウンタを加算し、正常に通信が終了すると減算する仕組みになっている。つまり、送信カウンタと受信カウンタは、エラー発生状況により変動している。変動しているカウンタ値が、一定の閾値(127) を超えると送信を抑制し(Error Passive)、さらに悪化するとネットワークから切り離される (Bus off)。ネットワークから切り離された後も、ネットワークが正常に戻れば動作を再開することができる。エラー発生時の状態遷移は、図2 をご覧いただきたい。

図2 エラー動作シーケンス

エラーカウンタの増減ルールは、送信エラー(Bit Error/ACK Errorなど)が発生すると TEC (送信エラーカウンタ)に 8 加算し、受信エラーでは、CRC Error を検出すると REC(受信エ ラーカウンタ)に 8 加算し、副次的に発生するその他のエラーでは 1 加算する。送信・受信が正常に行われると、TEC REC ともに 1 減算する。

例えば、初期状態(TEC=0/Error Active モード)から、あるノードXが送信に失敗すると TEC に 8 加算し、Active Error フラグを送信する。その後、再送信を試みるが連続して15回再送信に失敗すると、TEC は 128 になる。TEC が 127 を超えると「Error Passive」モードに切り替わり、送信が抑制される。

Error Passive では、前のフレーム送信終了後 8 ビットの空き時間後に送信が可能になることで、送信権獲得に勝てず送信が抑制される。また、エラー発生時に Passive Error フラグを送信するように変わることで、他のトラフィックを破壊しなくなる。つまり、Error Passive になった ノードのエラーはほぼ無視されるようになる。さらに、再送信を繰り返し TEC が255を超えると、Bus Off になり、CAN バスから切り離される。

ノードXが送信エラーを多発しているときの他のノードの状況は次のようになる。ノードXが Active Error フラグを送信する度に、他のノードの REC は 1 加算される。ノードXが Bus Off になるまでに他のノードの REC は Error Passive の制限値(127)には到達しない。

TEC と REC の動作は、図3・図4 を参照いただきたい。

送信エラーカウンタ
図3 送信エラーカウンタ
受信エラーカウンタ
図4 受信エラーカウンタ

車載ネットワーク

この記事を書いた人

岩崎 有平

早稲田大学 理工学部 電子通信学科にて通信工学を専攻。
安立電気(現 アンリツ)に入社後、コンピュータ周辺機器の開発を経てネットワーク機器の開発やプロモーションに従事する。
おもにEthernetを利用したリアルタイム監視映像配信サービスの実現や、重要データの優先配信、映像ストリームの安定配信に向けた機器の開発行い、Video On Demandや金融機関のネットワークシステム安定化に注力した。
現在は、Ethernetにおけるリアルタイム機能の強化・開発と普及に向けて、Ethernet TSNの普及活動を行っている。