CANバス上で同じIDを持つさまざまなメッセージの送信


12

CAN仲裁はIDを使用して行われ、バス上のノードは任意のIDを使用して送信できます(できませんが、厄介なノードは送信できます)。

同じCANバスに接続された2つの異なるノードが、同じIDで異な​​るデータバイトのメッセージを送信するとどうなりますか?

私の考え:それはバス上にゴミを生成します。支配的なビットを持っている人だけが送信されます。


1
なぜ彼らがこのようにしたのか分かりません。調停がメッセージ全体に適用される方が理にかなっていると思います。
Rocketmagnet

回答:


12

CAN仕様のセクション6.1 :

ビットエラー:バスでビットを送信しているユニットもバスを監視します。監視されているビット値が送信されたビット値と異なる場合、そのビット時間にビットエラーを検出する必要があります。例外は、ARBITRATION FIELDのスタッフィングビットストリーム中またはACK SLOT中の「リセッシブ」ビットの送信です。

したがって、他のノードが「0」を送信しているときに「1」を最初に送信するノードは、正式に説明されているように、エラーフラグ(セクション3.1.3を参照)を送信することにより、ビットエラーを記録し、通常どおりエラーを通知しますセクション6.2で。

非公式に、そのノードがエラーアクティブである場合(通常の場合)、他のすべてのノードも(スタッフエラーとして)検出する6支配ビットのエラーフラグを送信します。これには、そのメッセージを完全に破棄する効果があります。

  • 誰も受け取らない
  • どの送信機も、何も送信しなかったとは思いません。

その後、各送信機は再送信を試みます-再送信の正確なタイミングに応じて、一方がバスのゲイン制御を他方よりも十分に早く開始する場合があります。そうしないと、同じシーケンスが再び発生する可能性があります。(または、別のより優先度の高いメッセージにより、両方がしばらく先送りになる場合があります!)


以下の@clabbacchioの回答に触発された拡張回答。

あなたは「厄介なノード」に言及し、clabbacchioは、2つのノードが異なる時間に送信する場合、各受信者がその複数の受信をどうするかを決定する必要があるという有効なポイントを作ります。

これは昨年ハックによって実証されました。このペーパーでは、「PSCMの詳細」セクションで、攻撃者がバス上の通常のメッセージと同期し、「良い」ECUが送信しようとしているメッセージの直前に悪意のあるメッセージを再生する方法について説明します。受信ECUは、以前のメッセージを受け入れ、メッセージカウンターを更新し、メッセージカウンターが増加していないため、「良い」メッセージをエラーとして破棄します。


1

あなたの質問では、この仮説を立てます:

支配的なビットを持っている人だけが送信されます。

これは、2つのメッセージがまったく同時に送信されることを前提としています。これは、より一般的な問題の特定のケースです。Martinの有効な答えはこの特定の問題をカバーしていますが、2つのノードが異なる時間に送信する(より一般的な)ケースを無視します。

その場合、同じIDを持つ2つのメッセージが存在しますが、ペイロードはバス上を循環します。2つのメッセージを区別し、受信する必要があるコンテンツであるかどうかを判断するのは受信者のロジック次第です。2つのメッセージを区別できない場合、データを誤って解釈し、単なるエラーフレームよりも深刻な問題を引き起こす可能性があります。

たとえば、1つのメッセージには温度センサーの読み取り値が含まれ、もう1つのメッセージには同じバイト上のアクチュエーターの目標位置が含まれている(実際には絶対に発生しないでください)と言います。


はい、2つのメッセージを区別するロジックを実装する必要があります。しかし、私の質問は、仲裁がIDに基づいて行われる場合、メッセージIDが同じでデータが異なる場合に何が起こるかということでした。
スワナンド

@Swanandは、同時送信の仮説についてのみですか?それはコーナーケースですが、逆は可能性が高いことだけ通知
clabacchio

0

メッセージデータフィールドが異なる場合、CRCが間違っているため、バス上にエラーフレームが表示されます(できれば!)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.