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

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

プログラミング解説
用語
CAN(Controller Area Network)
自動車に搭載された電子制御ユニット(ECU)間の通信のために開発された、シリアル通信プロトコル。1994年に標準規格(ISO11898/ISO11519)となり、現在ではほぼすべての自動車のほか、工場や医療現場でも使用されている。
従来型の通信方式と比較して物理的な配線が少なく済む、ノイズの影響を受け難いといった特長がある。
通信方法の基本は、データを必要としているノードからリモートフレームを送信し、それに対して該当するノードからデータフレームを返すという形になる。フレームフォーマットには「標準フレームフォーマット」「拡張フレームフォーマット」といった種類がある。以下に標準フレームフォーマットで定義される項目の説明を示す。
2進数データの“0”のことを「ドミナント(優性)」、“1”のことを「リセッシブ(劣性)」と呼ぶ。
| フィールド名 | ビット数 | 目的 |
|---|---|---|
| フレーム開始 (SOF) | 1 | Start Of Frameビット。メッセージの始めを ドミナント(0)で示す。 |
| 識別子 | 11 | メッセージを一意に識別するIDと、 メッセージ優先度も示すビット列 |
| リモート送信要求 (RTR) | 1 | RemoteTransmissionRequestビット。 データフレームの場合はドミナント(0)、 リモートフレームの場合はリセッシブ(1)で区別する。 |
| 識別子拡張ビット (IDE) | 1 | 11ビットの識別子を持つ標準フレームフォーマット ではドミナント(0) |
| 予約ビット (r0) | 1 | 予約ビット。ドミナント(0)である必要があるが、 ドミナント・リセッシブのどちらであっても許容する。 |
| データ長コード (DLC) | 4 | データのバイト数(0-8バイト) |
| データフィールド | 0-64 | 送信されるデータ(DLCフィールドによってバイト単位で指定された長さ) |
| CRC | 15 | CyclicRedundancyCheckシーケンス。 送信されたデータを正常に受信でき高野チェックに使用される。 |
| CRCデリミタ | 1 | リセッシブ(1)を送信する。 |
| ACKスロット | 1 | 送信機はリセッシブ(1)を送信する。 |
| ACKデリミタ | 1 | リセッシブ(1)でなければならない。 |
| フレーム終了 (EOF) | 7 | EndOfFrameビット。全てリセッシブ(1)でなければならない。 |
CANデータベースファイル
CANフレームおよびデータフィールドにおける信号を定義する情報が含まれたテキストファイル。CANデータベースでは、各信号について工学単位へ変換する規則を定義しており、以下のデータが保存される。
- ID番号とデータフィールドのバイト数
- データフィールドで定義される信号名
- データフィールドで定義される信号名の位置(開始ビット)とサイズ(ビット数)
- データタイプ(符号付き、符号なし、IEEE浮動小数)とバイト順序
- スケール係数とスケールオフセット
- 最大値、最小値、デフォルト値、単位
- コメント
これらの情報を使用して、未処理のフレーム情報を実世界の値に変換できる。

上図の例では、「スケール係数:1」「スケールオフセット:0」と定義しており、以下の式で受信データを物理値に変換できる。
Speed_1(物理値)=1×受信データ+0
NI-XNET
CANをはじめとした各種車載通信のフレームと信号を読み書きするための計測器ドライバ。LIN、FlexRay、車載Ethernetにも対応している。
製作の流れ

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


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

(参考):vectorデータベースファイル形式(.dbc)で保存する場合は、CANクラスタ(2)を右クリック>[DBCにエクスポート…]を選択する
STEP2:NI MAXのバスモニタで通信速度の設定を確認する

- NI MAXを起動し、CAN Interface“CAN1”を選択する
- CAN Interface“CAN1”のバスモニタを起動する
- バスモニタの設定画面を開く
- [ボーレート]を[500kBaud] (通常の車両で使用する通信速度)に設定する
STEP3:CSVファイル保存VIを作成する
フロントパネル

ブロックダイアグラム

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

ブロックダイアグラム

ファイルパスを入力パラメータとして、計測結果とグラフ表示データを読み込むVIを作成する。
STEP5:生産者/消費者デザインパターンでメインVIを作成する
ブロックダイアグラム ※完成形

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

プログラム終了時、ファイルに保存した画面設定データを読み込んで再現する処理を作成する。
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送信)の初期化と開始を実行する。
STEP13:消費者ループ(送信側):output&inputを作成する

XNET Write関数を配置して(CAN送信)を実行する。Cycletimeの待ち時間はwaitの処理で行う。
STEP14:消費者ループ(送信側):stopを作成する

XNET Stop関数とClear関数を配置して(CAN送信)を停止する。キューの排出も実行する。
STEP15:消費者ループ(送信側):exitを作成する

受信処理のループへexitの実行を通知し、消費者ループを終了させる。
STEP16:消費者ループ(受信側):system startを作成する

X-NET(CAN受信)の初期化と開始を実行する。Result表を初期化するために空白の配列をシフトレジスタへ接続する。
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に関する有償技術サポートおよび受託開発サービスを提供しております。本講座で得た知識を実務に活かしたい方や、実際の業務に即した開発支援をお求めの方は、ぜひお気軽にご相談ください。
専門のエンジニアが、お客様の課題解決をサポートいたします。


