CAN入門(1)

社命です。今日からCANを使った開発をしなさい。

などと言われる事もあるでしょう。サラリーマン的な選択肢は、ハイかYesしか無いわけで、どうにかしないといけません。

私なら、まずは次の事を調べます。

・CANとは、そもそも何なのか?
・CAN開発のための環境をどう揃えたらいいのか?

そこで、今回からのシリーズでは、これらの疑問にザックリと答えてみます。(ザックリすぎると思うので、あとからちゃんとした資料にあたってください。)

CANって?

通信規格です。ECU同士を通信させるのに、CANを使ったりします。

イメージとしては、イーサネットとか、RS232Cみたいな感じです。

CAN構成と、その振る舞い

構成

CANとは何かを理解するにあたり、3つのキーワードを頭に入れます。

CANノード ECUなどの通信ノードです
CANバス 通信線です
CANメッセージ 通信線をつたわるパケットです。8バイトくらいのデータを運べます。

「CANメッセージ」が「CANバス」を伝わり「CANノード」に届く

振る舞い

やる事はただ1つ。CANノードから、別のCANノードにデータを送信する。それだけです。

1.とあるCANノードが、CANバス上にCANメッセージを送信する
2.CANメッセージが、CANバスを通して全てのCANノードに届く
3.全てのCANノードは、CANメッセージをいったん受け取る。値を見るか無視するかは、ご自由にどうぞ。

まとめ

CANメッセージを送信したら、全てのCANノードに届く。CANってば、だいたいこんなものです。

お疲れ様でした。

質疑応答

さすがにザックリすぎると思うので、疑問に思われるであろう点を補足します。

気になったポイントのみご覧下さい。

全てのCANノードにデータが届くと、混乱しない?

回答

どんどんデータを送られても、「これって何のデータ?」かが分からないと混乱しちゃいます。

そうならないよう、全てのCANノードにはIDがついています。IDというのは、「このCANメッセージには、どんなデータが載っているのか?」をあらわすものです。

たとえば、

メッセージID=001 のCANメッセージ: エンジンの状態をあらわす
メッセージID=002のCANメッセージ: 走行距離をあらわす
・・・

といった形で、CANメッセージのメッセージIDを見れば、どんなデータが載っているのか?が分かります。

整理

CANメッセージは、

・メッセージID(11ビット)
・データ(0~8バイト)

を持ちます。

どのメッセージIDに、何バイトのデータを持たせるかは、自由に決められます。

そのデータがどんな意味を持つのか?も自由に決められます。

どのCANメッセージが、どんな意味を持つのか分からん!

回答

どのIDに、どんなデータが載っているのか?は、ユーザーが自由に決められます。

逆に言うと、全てのCANノードが、暗黙の前提として、「このCANメッセージは、こういう意味なんだなー」という共通認識をもっておく必要があります。

車両開発の場合は、OEMさんがエイヤと決めて、部品メーカーさんがそれに従う、という感じだったりします。

この対応表は、Excelだったりもしますが、CANdb形式という業界標準(だと思う)のファイルに書かれていたりもします。

全てのCANノードは、1つのCANdbを参照して作られる

これは、各CANノードにCANdbが埋め込まれているという意味ではありません。CANdbを参照するのはエンジニアであって、走行距離を受け取るにはどのCANメッセージを見たら良いだろう?という判断に使用します。

なお、CANメッセージには8バイトまでのデータを載せられます。しかし、車両情報で8バイトも必要なものは少ないです。むしろ、1ビットとか4ビットとか、そういうレベルのものが多数です。

そのため、CANdbでは、「このデータの、○ビット目~○ビット目までは、こういうデータ」という情報を持っています。

CANメッセージは、さらに細かい「シグナル」に分かれる

こういった細かいデータは、「シグナル」と呼ばれます。

整理

CANメッセージは、

・メッセージID(11ビット)
・データ(0~8バイト)

を持ちます。

データ(0~8バイト)の中には、

・シグナル(0~63ビット)2011/3/22訂正(1~64ビット)

が(通常は、多数)含まれます。

各シグナルが、符号ありかなしか?ビッグエンディアンかリトルエンディアンか?は、CANdbで定義されます。

どんなCANメッセージに、どんなシグナルが含まれるか?は、ExcelやCANdbなどに集約されます。そして、各CANノードを作成するエンジニアが、同じものを参照してプログラミングを行います。

余談

どのCANメッセージに、どんなシグナルが含まれるか?といった情報は、企業秘密です。ものすごく秘密です。

もしもコレが分かっちゃったら、ライバル会社のクルマを買ってきて、CANバスをモニターすれば、どんな制御をしているのかが丸分かりになってしまいます。

だから、とても秘密です。(キーワード:リバースエンジニアリング)

どういうタイミングで、CANメッセージを送信したらいいの?

回答

自由です。好きなタイミングでどうぞ。

ただし、メッセージIDなどと同様、「このメッセージは、○ms間隔で送信する」という取り決めがなされるのが普通です。

ほかにも色々なタイミングの取り方があるのですが、なんだか機密情報のような気がしないでもないので、書かないでおきます。

会社から渡された仕様書があれば、たぶんそこにCANメッセージの送信タイミングが書いてあると思います。

RS232Cだと、ボーレートとかあるんだけど、CANは?

回答

CANにもボーレートがあります。1つのCANバスは、1種類のボーレートを持ちます。全てのCANノードは、そのボーレートでもって通信を行います。

おそいものだと125kbpsとか、もっと遅いレベル。はやいものだと1Mbpsです。

注意点として、125kbpsまでのCANと、125k~1MbpsまでのCANとでは、CANバスのハードウェア構成が異なります。

とは言え、会社から「ほれ、これ使え」とハードウェアを渡されている場合には、特に気にする必要はないと思います。

どうにも通信が不安定で、おかしいなー?と思われた場合のみ、低速系と高速系の違いを疑ってみてください。

CCPとかXCPとか、はたまたGMLANとかあるけど、CANとの関係は?

前提

会社から渡された仕様書に、CCPだのXCPだのと書いてあった場合のみ、どうぞ。そうでなければ、ムシしちゃってOKです。

回答

CANメッセージは、どのIDにどんな意味を持たせるかは、完全に自由です。

そうであれば、「このメッセージIDが来たら、ECUのメモリ値を、CANバス上に送信しよう」と決めるのもまた自由です。

CCP、XCP、GMLANなどの規格は、CAN規格の上になりたっています。

「こういうメッセージを送ってくれたら、こういう応答をするよー!」と決められたサーバーが、ECUのメモリを読み書きしてくれたりします。

このときのやり取り方法を決めたのが、CCP、XCP、GMLANなどです。

ちなみに、GMLANだけは、ちょいとCAN規格を逸脱するような特殊モードをもっていたりもしますが、気にする必要はないと思います。(というか、GMLAN使うような人はここ読んでないと思う)

まとめ

とりとめがなくなってきたので、ここまでにしておきます。CAN規格はよく出来ていて、たとえば「複数のCANノードが、同時にCANメッセージを送信した」場合にも、うまく対処できるようになっています。

そういった情報に関しては、ネットでCAN入門書とか、車載ネットワーク入門とか、立派な記事はいくつも見つけられますし、良い書籍も存在していますので、ぜひそちらを当たってください。

次回は、CANを使った開発をする際、どういったツールをどう使うか?についてご説明します。

CANツールは何種類もありますが、たまたま仲良くさせていただいている、ICS社のVehicle Spyを使ってやってみます。