NI CAN Channel API
概要
このドキュメントでは、NI-CAN ドライバソフトウェアの Channel API の基本について説明します。NI-CAN 2.0 以降のバージョンを使い始めたばかりのユーザにとって、特に役立つ内容となっています。
目次
はじめに
NI-CAN ドライバソフトウェアは、ナショナルインスツルメンツの Measurement & Automation Explorer(MAX)での構成や解析に使用できるツールの他に、2つのAPI(アプリケーションプログラミングインタフェース)を搭載しています。これらの API を使用して、各自のテスト/シミュレーションに応じたアプリケーションのカスタマイズを行うことができます。Channel API では、使いやすい上位関数を使用して、Vector データベース(.dbc)やナショナルインスツルメンツ CAN データベース(.ncd)などのファイルにより定義された CAN チャンネルにアクセスすることができます。Channel API は、CAN の初心者にお勧めの API です。Frame API は CAN バス経由で送信されたビットへの低レベルアクセスを可能にするもので、こちらは上級ユーザ向きです。このドキュメントでは、Channel API を中心に説明します。Frame API の詳細については、NI-CAN ハードウェア/ソフトウェアマニュアル(英語)を参照してください。
NI-CAN Channel API は、あらかじめ定義された CAN チャンネルを利用して、NI-DAQ プログラミングに似た方法で CAN プログラミングを行うものです。Channel API の基本プログラミングモデルを図1に示します。
図1. LabVIEW を使った基本的な NI-CAN Channel API プログラミングモデル
チャンネル構成
CAN チャンネルは、定義するか、または定義されたものをインポートする必要があります。それには、Measurement & Automation Explorer(MAX)を使用します。MAX は、CAN インタフェースを含むほとんどの NI ハードウェアをインストール、テスト、構成できるプログラミング不要なユーティリティです。また、CAN データベースファイルのインポートや作成にも使用でき、CAN バスモニタや CAN チャンネルテストパネルといった追加のツールも含まれています。
図2. Measurement & Automation Explorerに表示された CAN チャンネル
データベースファイルからチャンネルをインポートする
CAN チャンネルをデータベースファイルからインポートすることが望ましい場合もよくあります。Vector データベース(.dbc)ファイルから CAN チャンネルをインポートするには、「データ設定」を展開して CAN チャンネルを表示します。CAN チャンネルを右クリックして「CANdb ファイルからインポート」を選択します。データベースファイルの多くは、CAN デバイスの設計者が作成しています。データベースを検索してファイルを見つけます。ファイルを選択したら、ファイル内の全てのメッセージをインポートするか、特定のチャンネルを選択してインポートすることができます。「インポート」ボタンをクリックし、次に「終了」をクリックします。図2に示すように、MAX の CAN チャンネルの下にメッセージやチャンネルが表示されます。それらのメッセージやチャンネルは、メッセージツリーを展開して希望のチャンネルを右クリックしプロパティを開くと、表示や編集ができます。チャンネルのプロパティを表示すると、メッセージ内でのチャンネルの位置がわかります。
Measurement & Automation Explorer でチャンネルを作成する
ときには、Vector データベースファイルがなくても MAX でチャンネルを作成しなければならないこともあるでしょう。そのような場合は、CAN チャンネルを右クリックして「メッセージの作成」を選択します。名前、アービトレーション ID、データバイト、インタフェースを指定して、「OK」を選択します。ここでメッセージを右クリックして「チャンネルを作成」を選択すると、個々のチャンネルが作成されます。チャンネル名、開始ビット、ビット数、スケーリング情報、単位を指定します。開始ビットとビット数を指定すると、メッセージ内におけるチャンネルの位置が右下のグリッドに表示されるのがわかります。
「OK」をクリックすると、MAX のメッセージの下にチャンネルが表示されます。もう1つチャンネルを作成するには、メッセージをもう一度右クリックして「チャンネルを作成」を選択します。ただし今回は、前回チャンネルを作成したときの予約済みのビットがハイライトされている点にご注意ください。同じビットで別のチャンネルを構成しようとすると、赤いエラー表示器が表示されます。その後は同じ手順でチャンネル作成し、メッセージを完成させることができます。アナログチャンネルとデジタルチャンネルを組み合わせてメッセージを構成できます。デジタルチャンネルは、各1ビットで最大64チャンネルまで使用できます。
希望のチャンネル構成ができたら、保存して他のコンピュータで使用することもできます。 CAN チャンネルを右クリックして、「チャンネル構成を保存」を選択します。 するとこの構成がナショナルインスツルメンツ CAN データベース(.ncd)ファイルとして保存されますので、MAX にインポートしたり NI-CAN 2.0 以降のドライバソフトウェアを使ってアプリケーションから直接呼び出したりすることができます。 Vector データベース(.dbc)ファイルで説明したように、ナショナルインスツルメンツデータベース(.ncd)ファイルを保存した構成から MAX にインポートすることもできます。 それを行うには、CAN チャンネルを右クリックして「チャンネル構成をロード」を選択し、.ncd ファイルを見つけて希望のメッセージを選択します。 「ロード」を選択して「終了」をクリックします。MAX にチャンネルが再度表示されます。
Channel API 関数
基本の NI-CAN プログラムは、初期化、読み取り/書き込み、クリアの3つの部分からなっています(図1を参照)。関数間のリンクをタスクといいます。CAN タスクとは、タイミングと通信方向(読み取り/書き込み)が同じ CAN チャンネルの集まりです。タスクは複数のメッセージを含むことができますが、全て同じインタフェース(ポート)上になければなりません。このプログラミングモデルは、LabVIEW、LabWindows/CVI、C/C++、Visual Basic 6.0 のいずれの言語を使用していても同じです。LabVIEW のチュートリアルは、こちらのページ(ni.com/tutorials)からご利用いただけます。
CAN Init Start
CAN Init Start VI:CAN Init Start 関数は、チャンネルリストをシングルタスクとして初期化し、そのタスクの通信を開始します。この関数では、以下の入力パラメータを使用します。

channel list ― そのタスクのチャンネルリストを指定します。
interface ― そのタスクに使用する CAN インタフェース(CAN0、CAN1・・・)を指定します。
mode ― そのタスクに使用する I/O モード(データ転送の方向)を指定します。
sample rate ― データ転送のサンプリングレート(サンプル数/秒)を指定します。
CAN Read
読み取りモードが複数あることで、アプリケーションのカスタマイズが容易になっています。NI-CAN では3つの読み取りモードがあります。その1つ1つについて以下のセクションで説明します。
- シングルポイント
- 連続
- タイムスタンプ
Init Start のモードが入力の場合、アプリケーションは Read 関数を呼び出してサンプルを取得する必要があります。アプリケーションは通常、終了するまで Read をループで呼び出します。Read 関数は、LabVIEW では CAN Read、他の言語では nctRead です。Read の動作は初期化されたサンプルレートによって決まります。

シングルポイント読み取り(モード=入力、サンプルレート=0)
この読み取りでは、ネットワークより受信した最新メッセージから1サンプルずつ返されます。Init Start リストの各チャンネルにつき、1サンプルが返されます。最新の CAN メッセージにすばやくアクセスしたい場合に特に便利です。
図3は、サンプルレート=0の Read の例を示しています。A、B、C は初期化されたチャンネルのメッセージを表します。アプリケーションの開始以降メッセージを何も受信していない場合は、MAX のデフォルト値(def)が警告とともに返されます。
連続読み取り(モード=入力、サンプルレート> 0)
連続モードは、DAQ デバイスからのアナログ/デジタルデータとともにデータを記録する際に便利です。この読み取りにより、Init Start リストの各チャンネルにつき、サンプルが配列で返されます。指定の時間が経過するたびに、最新メッセージからのサンプルが配列に挿入されます。つまり、新しいメッセージが受信されるまで、同じサンプルの取得が指定のレートで繰り返されるということです。連続モードは、DAQ デバイスからのアナログ/デジタルデータとともにデータを記録する際に便利です。NI-DAQ アナログ入力チャンネルで同じサンプルレートを使用することで、CAN と DAQ のサンプルを同じ時間軸で比較することが可能となります。
図4は、サンプルレート> 0の Read の例を示しています。A、B、C は初期化されたチャンネルのメッセージを表します。Δt は、サンプルレートで指定したサンプル間の時間を表します。def は、MAX のデフォルト値です。
タイムスタンプ読み取り(モード=タイムスタンプ入力)
タイムスタンプモードは、CAN/DAQ の同期は必要だが CAN データをさらに処理する必要がないようなテストアプリケーションに適しています。Init Start のモードがタイムスタンプ入力の場合、アプリケーションは Read Timestanped 関数を呼び出して値を取得する必要があります。アプリケーションは通常、終了するまで Read Timestamped をループで呼び出します。Read Timestampled 関数は、ネットワークから受信したメッセージに対応するサンプルを返します。各メッセージに対し、メッセージを受信した時間を指定するタイムスタンプが付いたサンプルが返されます。Init Start リストの各チャンネルについては、タイムスタンプ付きのサンプルの配列が返されます。Read Timestamped 関数は、LabVIEW では CAN Read、他の言語では nctReadTimestamped です。
図5に Read Timestamped の例を示します。A、B、C は初期化されたチャンネルのメッセージを表します。At、Bt、Ct は、各メッセージを受信した時間を表します。
CAN Write
書き込みモードが複数あることで、アプリケーションのカスタマイズが容易になっています。NI-CAN では3つの書き込みモードがあります。その1つ1つについて以下のセクションで説明します。
- シングルポイント
- 連続
- タイムスタンプ
Init Start のモードが出力(またはリーセント出力モード)の場合、アプリケーションは Write 関数を呼び出して値を出力する必要があります。アプリケーションは通常、終了するまで Write をループで呼び出します。Write 関数は LabVIEW では CAN Write、他の言語では nctWrite です。Write の動作は初期化されたサンプルレートによって決まります。

非周期シングルポイント書き込み(モード=出力、サンプルレート=0)
書き込みによりメッセージが直ちにネットワーク上に送信されます。書き込まれたサンプルによって、メッセージのデータバイトが形成されます。Init Start リストの各チャンネルにつき、1サンプルを指定する必要があります。Init Start のモードは、この動作についてはリーセント出力モードではなく出力モードになっている必要があります。図6は、サンプルレート=0の Write の例を示しています。A、B、C、D は初期化されたチャンネルのメッセージを表します。各 Write に対し、関連するメッセージが最短時間内に送信されます。
図7は、サンプルレート> 0 で出力モードの場合の Write の例を示しています。A、B、C、D は初期化されたチャンネルのメッセージを表します。Δt は、サンプルレートで指定した各メッセージの送信間の時間を表します。
シングルポイント書き込み(モード=リーセント出力モード、サンプルレート> 0)
Init Start リストの各チャンネルにつき、ユーザが1サンプルを提供します。クロックの1チックごとに、ユーザが提供した最新サンプルを使って次のメッセージが送信されます。リーセント出力モードは、複数のタスクが異なるレートで実行している場合、全てのタスクのサプルを1つのループで書き込めるため便利です。図8は、サンプルレート> 0 で最新の出力モードの場合の Write の例を示しています。
図8. サンプルレート> 0 で最新の出力モードの場合の Write の例
CAN Clear
CAN Clear VI:Clear 関数は、タスクの通信を停止して構成をクリアします。初期化する全てのタスクについて、アプリケーションを終了する前に Clear を呼び出す必要があります。Clear 関数は LabVIEW では CAN Clear、他の言語では nctClear です。

その他の Channel API 関数
以降のセクションでは、基本のプログラミングモデルを拡張するのに役立つ情報を掲載しています。
Get Names
開発しているアプリケーションを他の人も使用するのであれば、そのアプリケーションでは固定のチャンネルリストを指定しない方がよいでしょう。できれば、ユーザインタフェース上の制御器から、リストボックスのようなもので、エンドユーザが希望のチャンネルを選択できるようになっているのが最適です。Get Names 関数は、MAX または CAN データベースにクエリして、そのデータベースにある全てのチャンネルまたはメッセージのリストを返します。そのリストを使って、ユーザインタフェース上の制御器に項目を入れます。するとその制御器からチャンネルを選択することができますので、キーボードを使って各チャンネル名を入力する必要がありません。選択が終わったら、アプリケーションはそうしてできたリストを Init Start に渡すことができます。Get Names 関数は、LabVIEW では CAN Get Names、他の言語では nctGetNames です。
同期
NI-CAN Channel API では、RTSI を使って各カード間を同期します。CAN カードでは、タスクはインタフェース(ポート)で分けられます。DAQ カードの場合、アナログ入力やアナログ出力といった具体的な計測がタスクとなっています。各タスクは、RTSI 接続上で2つの信号をルーティングします。
・ タイムベース ― クロックのドリフトを防ぐため、複数のカードで共有するクロックを指定します。
・ スタートリガ ― 開始のずれが生じるのを防ぐため、1つのボードから別のボードへ送られる開始信号を指定します。
Set Property
この関数を使用すると、ボーレートやトランシーバタイプ、フィルタモードなど、ネットワークのプロパティを設定することができます。Init Start 関数は、MAX または CAN データベースファイルで指定した通りのインタフェースやチャンネル構成を使用します。タスクの実行中はほとんどのプロパティを変更することができないため、アプリケーション内でこの構成を変更する必要がある場合は Init Start は使用できません。そのような場合は、まず Init を使用し、プロパティを設定してタスクを開始します。
Get Property
この関数を使用すると、ボーレート、メッセージ ID、チャンネルのスケーリングファクタなど、チャンネルやメッセージ、ネットワークのプロパティにアクセスすることができます。
Channel API または Frame API の詳細については、弊社 Web サイト(ni.com/manuals)からNI-CAN ハードウェア/ソフトウェアマニュアルをダウンロードしてご利用ください。
関連リンク
NI コントローラエリアネットワーク(CAN)Web サイト
CAN とアナログ信号を同期してデバイスを検証
NI-CAN Frame API(??)
法律関連事項
本チュートリアル(以下「チュートリアル」という)は、National Instruments(以下「NI」という)によって作成されたものです。本チュートリアルは、NIにてサポートされていますが、本チュートリアルの内容に関するテストや検査が完全に行われていない可能性があり、チュートリアルの品質について、もしくは、関連製品およびドライバの各改訂版に対するサポート継続については、何らの保証も適用されません。本チュートリアルは、いかなる保証もなく「作成された状態のまま」で提供されており、ni.com/jpの使用条件に特別に規定されている特定の制約事項に従うものとします。 (http://ni.com/legal/termsofuse/japan/ja/)







