プログラミングコース05 ー車載ネットワーク(CAN)を使った計測データ転送

プログラム課題

背景

あなたはプログラマです。一緒にプロジェクトに参加している先輩エンジニアから、以下に示す「車載ネットワーク(CAN)通信プログラム」を製作するよう頼まれました。プログラミングの前段階で用意できているものは、システム構成、要求機能のリスト、プログラム画面の3つです。

システム構成

要求機能

  1. CAN Interfaceを使用して、スピードメータ、タコメータ、外気温度、車内温度、ビームのCANデータを一定周期で送受信するプログラムを製作する
  2. スピードメータ、タコメータ、外気温度、車内温度、ビームのシミュレータを画面に配置して、送信データが編集できること
  3. スピードメータ、タコメータ、外気温度、車内温度、ビームをCAN Interfaceで送信すること
  4. 送受信周期が設定できること
  5. CAN Interfaceで受信したデータを物理的に変換して、グラフと一覧表に表示すること
  6. 一覧表のデータがcsv形式(カンマ区切り)でファイル保存できること
  7. 保存したファイルを読み込んでグラフと一覧表に表示できること
  8. キューメッセージハンドラを使用すること

プログラム画面

プログラミング解説

プログラミング講座05 サンプルVIをダウンロード

用語

CAN(Controller Area Network)

自動車に搭載された電子制御ユニット(ECU)間の通信のために開発された、シリアル通信プロトコル。1994年に標準規格(ISO11898/ISO11519)となり、現在ではほぼすべての自動車のほか、工場や医療現場でも使用されている。

従来型の通信方式と比較して物理的な配線が少なく済む、ノイズの影響を受け難いといった特長がある。

通信方法の基本は、データを必要としているノードからリモートフレームを送信し、それに対して該当するノードからデータフレームを返すという形になる。フレームフォーマットには「標準フレームフォーマット」「拡張フレームフォーマット」といった種類がある。以下に標準フレームフォーマットで定義される項目の説明を示す。

2進数データの“0”のことを「ドミナント(優性)」、“1”のことを「リセッシブ(劣性)」と呼ぶ。

フィールド名ビット数目的
フレーム開始
(SOF)
1Start Of Frameビット。メッセージの始めを
ドミナント(0)で示す。
識別子11メッセージを一意に識別するIDと、
メッセージ優先度も示すビット列
リモート送信要求
(RTR)
1RemoteTransmissionRequestビット。
データフレームの場合はドミナント(0)、
リモートフレームの場合はリセッシブ(1)で区別する。
識別子拡張ビット
(IDE)
111ビットの識別子を持つ標準フレームフォーマット
ではドミナント(0)
予約ビット
(r0)
1予約ビット。ドミナント(0)である必要があるが、
ドミナント・リセッシブのどちらであっても許容する。
データ長コード
(DLC)
4データのバイト数(0-8バイト)
データフィールド0-64送信されるデータ(DLCフィールドによってバイト単位で指定された長さ)
CRC15CyclicRedundancyCheckシーケンス。
送信されたデータを正常に受信でき高野チェックに使用される。
CRCデリミタ1リセッシブ(1)を送信する。
ACKスロット1送信機はリセッシブ(1)を送信する。
ACKデリミタ1リセッシブ(1)でなければならない。
フレーム終了
(EOF)
7EndOfFrameビット。全てリセッシブ(1)でなければならない。
CANデータベースファイル

CANフレームおよびデータフィールドにおける信号を定義する情報が含まれたテキストファイル。CANデータベースでは、各信号について工学単位へ変換する規則を定義しており、以下のデータが保存される。

  • ID番号とデータフィールドのバイト数
  • データフィールドで定義される信号名
  • データフィールドで定義される信号名の位置(開始ビット)とサイズ(ビット数)
  • データタイプ(符号付き、符号なし、IEEE浮動小数)とバイト順序
  • スケール係数とスケールオフセット
  • 最大値、最小値、デフォルト値、単位
  • コメント

これらの情報を使用して、未処理のフレーム情報を実世界の値に変換できる。

上図の例では、「スケール係数:1」「スケールオフセット:0」と定義しており、以下の式で受信データを物理値に変換できる。

Speed_1(物理値)=1×受信データ+0

NI-XNET

CANをはじめとした各種車載通信のフレームと信号を読み書きするための計測器ドライバ。LIN、FlexRay、車載Ethernetにも対応している。

製作の流れ

STEP1:CANデータベースファイルを作成する

  1. X-NETデータベースエディタを起動する
  2. CANクラスタを作成する
  3. CANフレームを作成する
  4. 信号を5種類作成する
  5. 各信号のプロパティを設定する

(参考):vectorデータベースファイル形式(.dbc)で保存する場合は、CANクラスタ(2)を右クリック>[DBCにエクスポート…]を選択する

動画:CANデータベースファイルを作成する

STEP2:NI MAXのバスモニタで通信速度の設定を確認する

  1. NI MAXを起動し、CAN Interface“CAN1”を選択する
  2. CAN Interface“CAN1”のバスモニタを起動する
  3. バスモニタの設定画面を開く
  4. [ボーレート]を[500kBaud] (通常の車両で使用する通信速度)に設定する
動画:NI MAXのバスモニタで通信速度の設定を確認する

STEP3:CSVファイル保存VIを作成する

フロントパネル
ブロックダイアグラム

ファイルパス、計測結果(表形式)、およびcycle timeを入力パラメータとして、yyyymmdd_hhmmss.csvの名称でファイル保存を行うVIを作成する。

動画:CSVファイル保存VIを作成する

STEP4:CSVファイル読込VIを作成する

フロントパネル
ブロックダイアグラム

ファイルパスを入力パラメータとして、計測結果とグラフ表示データを読み込むVIを作成する。

動画:CSVファイル読込VIを作成する

STEP5:生産者/消費者デザインパターンでメインVIを作成する

ブロックダイアグラム ※完成形

LabVIEWのテンプレートから、「生産者/消費者デザインパターン(イベント)」を呼び出し、メインVIを作成する。消費者ループは送信側と受信側の2つを作成する。

動画:生産者/消費者デザインパターンでメインVIを作成する

STEP6:キューで送信するデータを列挙体で作成する

消費者ループの処理を以下のケースに分割し、タイプ定義に指定した列挙体でケースを選択できるようにしておく。

  • initialize1:初期化処理①
  • initialize2:初期化処理②
  • wait:wait loop
  • csv_save:計測データ保存処理
  • csv_read:計測データ読込処理
  • system start:計測開始処理
  • output&input:計測処理
  • stop:計測停止処理
  • exit:プログラム終了処理

STEP7:生産者ループのイベント処理を作成する

生産者ループに以下のイベントケースを作成し、それぞれのケースでキューに【STEP6】で作成した項目を要素として追加する。

  • Tacho_value:値変更
  • Tacho:値変更
  • csv保存ボタン:値変更
  • csv読込ボタン:値変更
  • 計測開始ボタン:値変更
  • 停止ボタン:値変更
  • Exitボタン:値変更

STEP8:消費者ループ(送信側):initialize1を作成する

プログラム終了時、ファイルに保存した画面設定データを読み込んで再現する処理を作成する。

動画:消費者ループ(送信側):initialize1を作成する

STEP9:消費者ループ(送信側):initialize2を作成する

計測結果一覧表、表示位置、波形チャート、計測ランプ、beamランプ、設定数値(全てゼロ)、波形チャートXスケール(乗数設定)を初期化する。

STEP10:消費者ループ(送信側):csv_saveを作成する

CSVファイル保存VIをサブVIとして配置する。

STEP11:消費者ループ(送信側):csv_readを作成する

①CSVファイル読込VIをサブVIとして配置する。
スタックシーケンスのフレーム0では、計測結果の表示位置、波形チャートを初期化する。

②スタックシーケンスのフレーム1では、計測結果および波形チャートにデータを表示する。

STEP12:消費者ループ(送信側):system startを作成する

計測ランプ(ON)とExitボタン(Grayed Out)を実行し、XNET(CAN送信)の初期化と開始を実行する。

動画:消費者ループ(送信側):system startを作成する

STEP13:消費者ループ(送信側):output&inputを作成する

XNET Write関数を配置して(CAN送信)を実行する。Cycletimeの待ち時間はwaitの処理で行う。

STEP14:消費者ループ(送信側):stopを作成する

XNET Stop関数とClear関数を配置して(CAN送信)を停止する。キューの排出も実行する。

STEP15:消費者ループ(送信側):exitを作成する

受信処理のループへexitの実行を通知し、消費者ループを終了させる。

STEP16:消費者ループ(受信側):system startを作成する

X-NET(CAN受信)の初期化と開始を実行する。Result表を初期化するために空白の配列をシフトレジスタへ接続する。

動画:消費者ループ(受信側):system startを作成する

STEP17:消費者ループ(受信側):output&inputを作成する

XNET Read関数を配置して(CAN受信)を実行する。CAN受信データをグラフとResult表に表示する。Cycle timeの待ち時間はwaitの処理で行う。

STEP18:消費者ループ(受信側):stopを作成する

XNET Stop関数とClear関数を配置して(CAN受信)を停止する。キューの排出も実行する。

STEP19:消費者ループ(受信側):exitを作成する

消費者ループを終了(While Loopの条件にTrueを接続)させる。

STEP20:一覧表をスクロールさせるサブVIを作成する

フロントパネル
ブロックダイアグラム

現在行、設定行、盛漁期refnumを入力パラメータとして、現在行が設定行を超えた場合に、一覧表を垂直方向にスクロールさせるサブVI。

ポイントのまとめ

  • CANデータベースファイルは、NI-XNETデータベースエディタで作成できる
  • NI-XNETデータベースエディタは、FIBEX(.xml)、Vector(.dbc)、NI CAN(.ncd)を認識できる
  • XNET関数は、CANデータベースファイルの信号名で物理値変換できる
  • キューメッセージハンドラ(生産者/消費者デザインパターン)を使用し、キューで送信するメッセージはタイプ定義された列挙定数を使用する
  • CSVファイルは、文字列の2次元配列に変換することで簡単にWrite/Readできる
  • CAN通信のモニタとロギングは、NI MAXから起動するバスモニタを使用すれば簡単に実現できる。

LabVIEW講座データの販売について

本講座で使用した動画・テキスト・プログラム一式は、プログラムデータとしての販売やDVDメディアでの販売を行っております。
自習や復習、社内研修などにご活用いただけます。

LabVIEWに関する開発支援・技術サポートのご案内

ペリテックでは、LabVIEWに関する有償技術サポートおよび受託開発サービスを提供しております。本講座で得た知識を実務に活かしたい方や、実際の業務に即した開発支援をお求めの方は、ぜひお気軽にご相談ください。
専門のエンジニアが、お客様の課題解決をサポートいたします。