NI-CANチャンネルAPI

概要


このドキュメントでは、NI-CANドライバソフトウェアのチャンネルAPIの基本について説明します。NI-CAN 2.0 以降のバージョンを使い始めたばかりのユーザにとって、特に役立つ内容となっています。ソフトウェアの概要については、『NI-CAN Hardware and Software User Manual』を参照してください。 


NI-CANは、LabVIEW 2018までのLabVIEWと互換性があります。それ以降のLabVIEWバージョンを使用している場合は、『NI-CANアプリケーションをNI-XNETに移行する』のガイドを参照してください。

内容

概要

NI-CAN ドライバソフトウェアは、NI Measurement & Automation Explorer (MAX) での構成や解析に使用できるツールの他に、2 つの API(アプリケーションプログラミングインタフェース)を搭載しています。これらの API を使用して、各自のテスト/シミュレーションに応じたアプリケーションのカスタマイズを行うことができます。Channel API では、使いやすい上位関数を使用して、Vector データベース(.dbc)やNI 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に示します。

LabVIEW を使った基本的な NI-CAN Channel API プログラミングモデル


図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ビットで最大64チャンネルまで使用できます。

必要なチャンネル構成を作成したら、それを他のコンピュータで使用するために保存できます。CANチャンネルを右クリックしてチャンネル構成を保存を選択します。これにより、構成がNI CANデータベース(.ncd)ファイルとして保存されます。このファイルは、MAXにインポートするか、NI-CAN 2.0以降のドライバソフトウェアを使用してアプリケーションから直接呼び出すことができます。ベクトルデータベース (.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 VICAN Init Start 関数は、チャンネルリストをシングルタスクとして初期化し、そのタスクの通信を開始します。この関数では、以下の入力パラメータを使用します。


channel list―タスクのチャンネルリストを指定します。
interface―そのタスクに使用する CAN インタフェース(CAN0、CAN1 など)を指定します。
mode―タスクに使用するI/Oモード(データ転送の方向)を指定します。
sample rate―データ転送のサンプリングレート(サンプル数/秒)を指定します。

CAN読み取り


読み取りモードが複数あることで、アプリケーションのカスタマイズが容易になっています。NI-CAN では3つの読み取りモードがあります。その1つ1つについて以下のセクションで説明します。

1.シングルポイント
2.連続
3.タイムスタンプ

Init Start のモードが入力の場合、アプリケーションは Read 関数を呼び出してサンプルを取得する必要があります。アプリケーションは通常、終了するまで Read をループで呼び出します。Read 関数は、LabVIEW では CAN ReadTime & Dbl で終了しないタイプ)、他の言語では nctRead です。Read の動作は初期化されたサンプルレートによって決まります。

CAN Read VI

LabVIEWでのCAN読み取り

シングルポイント読み取り(モード=入力、サンプルレート=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 ReadTime & Dbl で終わるタイプ)、他の言語では nctReadTimestamped です。



図5は、Read Timestampedの例を示します。A、B、C は初期化されたチャンネルのメッセージを表します。At、Bt、Ct は、各メッセージを受信した時間を表します。

CAN書き込み


書き込みモードが複数あることで、アプリケーションのカスタマイズが容易になっています。NI-CAN では3つの書き込みモードがあります。その1つ1つについて以下のセクションで説明します。

1.シングルポイント
2.連続
3.タイムスタンプ

Init Start のモードが出力(またはリーセント出力モード)の場合、アプリケーションは Write 関数を呼び出して値を出力する必要があります。アプリケーションは通常、終了するまで Write をループで呼び出します。Write 関数は LabVIEW では CAN Write、他の言語では nctWrite です。Write の動作は初期化されたサンプルレートによって決まります。

CAN Write VI

LabVIEWでのCAN書き込み

非周期シングルポイント書き込み(モード=出力、サンプルレート=0)
書き込みによりメッセージが直ちにネットワーク上に送信されます。書き込まれたサンプルによって、メッセージのデータバイトが形成されます。Init Start リストの各チャンネルにつき、1サンプルを指定する必要があります。Init Start のモードは、この動作についてはリーセント出力モードではなく出力モードになっている必要があります。図6は、サンプルレート=0の Write の例を示しています。A、B、C、D は初期化されたチャンネルのメッセージを表します。各 Write に対し、関連するメッセージが最短時間内に送信されます。


サンプリングレートが0の書き込みの例


図6.サンプリングレートが0の書き込みの例

連続書き込み (モード = 出力、サンプリングレート > 0)
Init Start リストの各チャンネルにつき、サンプルが配列で返されます。指定された時間が経過するたびに、次のメッセージが送信されます。各メッセージは、配列の次のサンプルを使用してメッセージのデータバイトを形成します。つまり、配列からのサンプルは定期的にネットワークに送信されます。NI-DAQ アナログ出力チャンネルで同じサンプリングレートを使用することで、CAN と DAQ のサンプルを同じ時間軸で出力することが可能となります。



図7は、サンプリングレート> 0で出力モードの場合の Write の例を示しています。A、B、C、D は初期化されたチャンネルのメッセージを表します。Δt は、サンプルレートで指定した各メッセージの送信間の時間を表します。


シングルポイント書き込み (モード = 出力最近、サンプリングレート > 0、「初期化開始」リストの各チャンネルに対して1つのサンプルを提供します。クロックの1チックごとに、ユーザが提供した最新サンプルを使って次のメッセージが送信されます。リーセント出力モードは、複数のタスクが異なるレートで実行している場合、全てのタスクのサンプルを1つのループで書き込めるため便利です。図8は、サンプルレート> 0 で最新の出力モードの場合の Write の例を示しています。



図8.サンプリングレート> 0 で最新の出力モードの場合の Write の例

CAN Clear


CAN Clear VIClear 関数は、タスクの通信を停止して構成をクリアします。初期化する全てのタスクについて、アプリケーションを終了する前に Clear を呼び出す必要があります。Clear 関数は LabVIEW では CAN Clear、他の言語では nctClear です。

LabVIEWでのCANクリア

その他の 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つのボードから別のボードへ送られる開始信号を指定します。

プロパティを設定
この関数を使用すると、ボーレートやトランシーバタイプ、フィルタモードなど、ネットワークのプロパティを設定することができます。Init Start 関数は、MAX または CAN データベースファイルで指定した通りのインタフェースやチャンネル構成を使用します。タスクの実行中はほとんどのプロパティを変更することができないため、アプリケーション内でこの構成を変更する必要がある場合は Init Start は使用できません。そのような場合は、まず Init を使用し、プロパティを設定してタスクを開始します。

プロパティを取得
この関数を使用すると、ボーレート、メッセージ ID、チャンネルのスケーリングファクタなど、チャンネルやメッセージ、ネットワークのプロパティにアクセスすることができます。


Channel API または Frame API の詳細については、弊社 Web サイト(ni.com/manuals)からNI-CAN ハードウェア/ソフトウェアマニュアルおよび仕様をダウンロードしてご利用ください。


関連リンク:
NI コントローラエリアネットワーク(CAN)Web サイト
CANとアナログ信号を同期してデバイスを検証

Was this information helpful?

Yes

No