NI-XNETシリーズのCAN/LIN/FlexRayインタフェースは、高速化されたCAN/LIN/FlexRayインタフェースにNI-XNETドライバソフトウェアを統合したものです。Series 2 PCI/PXI/PCMCIAインタフェースなどのレガシーNI-CAN製品と比較して、性能、使いやすさ、長期サポートの点で多くのメリットがあります。
NI-XNET CAN/LIN/FlexRayインタフェースの次世代の性能と操作性を実現するため、NIではNI-XNET製品向けに新しいAPIを開発しました。今も多くのアプリケーションに旧バージョンのNI-CAN APIが採用されており、それらのアプリケーションを長期的にサポートする必要性をNIは認識しています。
NI-CAN用に作成されたアプリケーションをNI-XNETに移行して、NI-XNETインタフェースの新しい機能を利用できるようにするため、NI-XNETドライバには、ドライバレベルでNI-CAN関数の呼び出しをエミュレーションするためのNI-CAN互換性レイヤがあります。この機能はドライバレベルでインストールされるため、NI-CANで作成したほとんどのアプリケーションは、わずかな変更だけでNI-XNETでもすぐに使用できます。NI-XNETインタフェースの使用を開始する前に、この2つのドライバには顕著な違いがあることを知っておく必要があります。
この記事では、NI-CAN互換性ライブラリを使用して、新しいNI-XNETハードウェアにNI-CANアプリケーションを実装する方法を紹介します。また、想定される互換性問題と、NI-CANの概念をNI-XNET APIに移行する方法についても説明します。
NI-CANチャンネルAPIの基本について詳しくは、「NI-CANチャンネルAPI」を参照してください。
NI-XNETを使って新しいアプリケーションの作成にとりかかる場合、互換性レイヤは必要ありません。必要となるのは、NI-XNETデバイスで既存のNI-CANアプリケーションを使用する場合のみです。
互換性ライブラリは、CAN/LINインタフェースのデバイスとモジュールをサポートします。トランシーバケーブルを必要とするPCIe-8510、PXIe-8510、NI 9860などの車両マルチプロトコルインタフェースのデバイスとモジュールはサポートしていません。また、NI-CANベースの同等のモジュールがないため、CシリーズLINモジュールもサポートしていません。
既存のアプリケーションが動作するためには、NI-XNETとNI-CANの両方のドライバがインストールされている必要があります。NI-XNETインストールパッケージには、互換性ライブラリが機能するために必要なコンポーネントがすべて含まれています。詳細な手順については、「Installing the NI-XNET Compatibility Library for NI-CAN」を参照してください。
通常、NI-CAN APIは、Series 2 CANインタフェースを含むレガシーCANハードウェアに関連付けられています。NI-XNETは、次世代のNI-XNET CAN/LIN/FlexRayインタフェースの主要なドライバです。NI-XNETインタフェース向けの新しいアプリケーションでは、NI-XNETドライバとAPIを使用します。
NIでは、NI-CANを使用する既存のアプリケーションをお持ちのお客様のために、NI-XNET CAN Cシリーズ/PCI/PXIインタフェースにもコードを再利用できる互換性ライブラリをご用意しています。互換性ライブラリの機能は、NI-XNETではなくNI-CAN APIに適用されます。 互換性ライブラリの機能の詳細については、『NI-CAN Hardware and Software Manual』を参照してください。
既存のアプリケーションでNI-CANを使用しており、今後はNI-XNET CAN Cシリーズ、PCI、PXIハードウェアのみを使用する予定の場合は、コードをNI-XNETに移行することをお勧めします。NI-XNETでは、以前のNI-CAN APIの多くの概念がまとめられていますが、主要機能は類似しています。以下の表は、NI-CAN用語とNI-XNETの類似の用語を相互参照したものです。
メモ: 詳細については、「Migration Options for USB-8472/73/76 CAN Interface」を参照してください。
NI-CAN用語 | NI-XNET用語 | コメント |
---|---|---|
CANdbファイル | データベース | NI-XNETでは、 NI-CANチャンネルAPI、FIBEX、.DBC、.NCDよりも多くのデータベースファイル形式をサポートしています。 |
メッセージ | フレーム | 「フレーム」とは、バス経由で転送されるビットを表す専門用語です。この用語は、CANやFlexRayなどの規格で使用されています。 |
チャンネル | 信号 | 「信号」とは、FIBEXなどの規格で使用される専門用語です。 |
チャンネルAPIタスク | セッション (信号I/O) | NI-CANと異なり、NI-XNETではチャンネル (信号) I/OとフレームI/Oの同時使用がサポートされています。 |
フレームAPI CAN オブジェクト (キューの 長さ0) | セッション (フレームI/Oシングルポイント) | 1つのオブジェクトに入力 (読み取り) と出力 (書き込み) が両方含まれるNI-CAN CANオブジェクト。制御性を高めるため、NI-XNETには各方向に異なるオブジェクトがあります。NI-CANの一方向のキューの長さが0である場合、それはNI-XNETフレームI/Oシングルポイントに相当します。 |
フレームAPI CAN オブジェクト (キューの 長さ0以外) | セッション (フレームI/Oキュー) | NI-CANの一方向のキューの長さが0以外である場合、それはNI-XNETフレームI/Oキューに相当します。 |
フレームAPI ネットワークインタフェース オブジェクト | セッション (フレームI/Oストリーム) | 1つのオブジェクトに入力 (読み取り) と出力 (書き込み) が両方含まれるNI-CANネットワークインタフェースオブジェクト。制御性を高めるため、NI-XNETには各方向に異なるオブジェクトがあります。 |
インタフェース* | インタフェース | NI-CANではインタフェース名がCAN0から始まりますが、NI-XNETではCAN1 (またはFlexRay1) から始まります。 |
周期性 | 周期的 | NI-CANでは「周期性」という用語を使用していますが、NI-XNETデータベースエディタとNI-XNETプロパティノードでは 「周期的」という用語を使用しています。 |
表1.NI-CAN用語と相当するNI-XNET用語
以下の図は、NI-XNETとNI-CANにおける番号付けの違いを示しています。上の「CAN0」は、PCI-8513ボードの最初のポートを使用するNI-CANポート名に対応します。この同じポートを、CAN1を使ってNI-XNET APIで利用することができます。NI-CANポートをNI-XNETポートと同じ名前に変えることもできます。問題は一切起こりません。
図1.NI-XNETとNI-CANの番号付けの違い
メモ: NI-CAN互換性レイヤがインストールされていると、NI-XNETインタフェースが、NI Measurement & Automation Explorer (MAX) に2回表示されます。これは正常な動作です。両方のドライバがMAXにボードの存在を通知するためです (NI-CANとNI-XNETがそれぞれ1回ずつ通知します)。
以下の図は、同様の状況ですが、リアルタイム (RT) ターゲットを使用した場合を示しています。NI-XNETデバイスは、MAXでRTターゲットの下に表示されますが、互換性レイヤを介してNI-CANが使用するNI-XNETデバイスは、NI-CAN RTハードウェア構成ツールの下にのみ表示されます。NI-XNETのCAN1はNI-CANのCAN0と同じであることがわかります。
図2. CANインタフェースの表示は、NI-XNETで使用する場合と互換性レイヤで使用する場合では異なります。
「NI-CAN RTハードウェア構成」ウィンドウを開くには、MAXを起動し、ツール→NI-CAN→RTハードウェア構成を選択して、RTターゲットのIPアドレスを入力します。
NI-CAN用NI-XNET互換性ライブラリは基本機能の維持を目的としていますが、NI-XNETプラットフォームにはハードウェア固有の機能や基本機能の違いなどがあるため、NI-CANのライブラリをNI-XNETに完全に対応させることができるとは限りません。
互換性のない主な機能とそれぞれの対処法について下記に説明します。互換性のない機能の完全な一覧については、バージョン2.7以降の『NI-CAN Hardware and Software Manual』を参照してください。
この機能はNI-XNETハードウェアに搭載されていますが、新しいアーキテクチャで互換性を維持する手段は用意されていません。この機能が必要なアプリケーションの場合は、NI-XNET APIが使えるようにコードを変更する必要があります。NI-XNET APIでリモートフレームを処理する方法の詳細については、『NI-XNET Hardware and Software Manual』を参照してください。
この機能は、一部のNI-XNETハードウェアに搭載されています。オプションで外部トランシーバを使用できるXNETハードウェアの例としては、PCI-8513モデルとPXI-8513モデルがあります。
NI-XNETインタフェースは、ユーザからのパラメータを一切受け取らずにクロック入力周波数を自動検出し、同期します。このプロセスは自動で行われるので、マスタタイムベースレートをユーザが変更するオプションはありません。NI-XNETインタフェースでは、マスタタイムベースを明示的に変更しなくても、さまざまなクロックレートでの同期 (1 MHz、10 MHz、20 MHz) をサポートしています。1 MHzと10 MHzは、エクスポートにも使用できます。
NI-XNETでは、新しい方法でバスエラーを記録します。CANフレームをバスの状態のエンコードとともに記録するのではなく、バスの状態を読み取るだけです。
図3. バスの状態を確認することでバスエラーがわかるようになりました。
この機能はNI-XNET APIのネイティブな機能であり、NI-CANとの互換性はありません。
NI-XNETでは、絶対タイムスタンプ形式のみを使用します。ただし、特定のイベントのタイムスタンプを取得する関数は用意されています。それらのタイムスタンプを使用すると、別の形式でデータを取得し直さなくても、異なる基準からの「相対」時間を計算することができます。
図4. NI-XNETでは絶対タイムスタンプを使用しますが、相対タイムスタンプを取得する方法も用意されています。
この機能が必要な場合は、NI-XNET APIを使用するようにコードを変更する必要があります。
この機能は、NI-XNET 1.0では利用できませんでしたが、NI-XNET 1.1から利用できるようになりました。この機能は、「CAN Replay」という名前になっています。
図5. CAN Replayを構成するには、フレーム出力ストリームを使用します。
NI-XNETには、タイムベースと開始トリガを同期するためのRTSI機能があります。ただし、RTSIパルスに基づいてイベントを構成 (つまりCANフレームを送信) することはできません。また、CANイベントに基づいてRTSIイベントを構成することもできません。
NI-XNET APIを使用するには、アプリケーションの変更が必要になる場合があります。それには様々な理由があります。次のセクションでは、NI-XNET APIを使用できるようにNI-CANコードを変更する方法について説明します。
以下の情報は、よくご存じのNI-CANの概念をNI-XNETの概念に置き換えて、コードの移行をサポートするためのものです。それぞれのアプリケーションについて説明するものではありません。コードの変更についてサポートが必要な場合は、NIまでお問い合わせください。
NI-CANインタフェースは、開く前に構成する必要があります。NI-XNETでは、まずインタフェース上にセッションを作成します。するとプロパティノードを使ってセッションのプロパティを自由に変更できるようになります。これは、NI-DAQmxなど他の多くのNI APIで使用されているのと同じモデルです。
図6. NI-XNETでのバスプロパティの構成はNI-CANとは異なります。
フレームの読み取りは、NI-CANでもNI-XNETでも類似しています。
図7. フレーム読み取りのコードは、どちらのAPIでも類似しています。
性能の向上と新しいNIデバイスの駆動型DMAエンジンアーキテクチャのおかげで、NI-XNETデバイスにクエリして使用可能なフレーム数を確認する必要はもうありません。NI-CANでは、性能上の理由でクエリが必要でした。この機能はNI-XNETでも使用できますが、利用可能なフレームをすべて読み取る際に必要な機能ではありません (nxRead関数に-1を入力すると、利用可能なフレームがすべて返されます)。
図8. フレーム数を確認するためのクエリは、NI-XNETの方が簡単です。
フレーム形式はNI-CANでもNI-XNETでも同様の情報を提供しますが、表示方法が若干異なります。
図9. NI-CANとNI-XNETの各クラスタには、同様のフレームデータが含まれています。
NI-XNETのnxWrite (Frame CAN).viでは、フレームの配列を入力として受け入れます。そのため、単一フレームを送信するには、1フレームの配列を作成する必要があります。
図10. NI-XNETでフレームデータを送信する際は、データの配列を入力として使用する必要があります。
NI-XNETでは、配列の長さによって書き込むフレーム数を認識します。
図11. フレーム送信用の関数呼び出しは、NI-CANでもNI-XNETでも類似しています。
NI-CANでは、フレームAPIで周期性フレームを書き込む場合、各フレームのオブジェクトを送信または受信用に構成する必要があります。NI Series 2 CANインタフェースには、オブジェクトは49個までという制限があります。
図12. NI-CANで周期的フレームを送信するには、別々の関数呼び出しでオブジェクトを構成する必要があります。
NI-XNETで個々の周期性フレームを構成する方法は、若干異なります。NI-XNETは信号/フレームデータベースとの緊密な統合が可能なため、NI-XNETで周期性フレームを活用するには、FIBEXデータベースファイルを使ってネットワークが使用するフレームを記述するのが最も簡単な方法です。FIBEXデータベースを使用する場合、NI-XNETドライバはアプリケーションからの介入なしに周期性フレームを自動的に構成し処理します。
例として、データベース内の周期性 (NI-XNETでは「周期的」) フレームをアービトレーションID、ペイロード長、および周期で構成する場合を考えてみます。構成して保存したアプリケーションは、シングルポイントセッションを使ってこのフレームの送受信を行うことができます。I/O制御によりデータベースからすべてのフレームを動的にロードするため、アプリケーションでフレームを選択しやすくなります。この機能が動作するためには、使用するデータベースをNI-XNETに伝えるエイリアスを構成する必要がありますが、これは次のセクションで説明します。
図13. 周期性フレームの送信は、NI-XNETでは劇的に簡素化できます。
NI-XNETドライバは、セッションを開く際にデータベースからすべての設定を読み取ります。するとドライバとNI-XNETファームウェアで周期的送受信が構成されます。アプリケーションでユーザが行うのは値の更新のみで、NI-XNETが次の周期中に自動で最新の値を送信します。NI-XNETには、多くの値をキューに入れるためのキューセッションが搭載されています。
信号データベースを使用する主なメリットは、コードの保守がしやすいことです。データベースを更新するとコードも自動的に更新されるので、アービトレーションID、伝送レート、ビット定義などの変更を追跡するためにコードを変更する必要はありません。パラメータを変更する場合は、データベースファイルを変更するだけで十分です。コードには変更を加える必要はありません。
NI-XNETには、データベースファイルからロードされた値をプログラムで変更する関数が用意されています。これを使用してもデータベースファイルに書き込まれた実際の値は変更されません。NI-XNETドライバによって実行時ロードされる値のみが変更されます。
図14. 低レベル関数を使用して、NI-XNETでの周期性フレームの送信を構成することができます。
データベースファイルを作成せずにすべての設定を実行時に行いたい場合は、「メモリ内」のデータベースを作成することもできます。この場合、ネットワーク構成全体をプログラムで開発し、アプリケーションで使用することができます。ハードウェア入力と出力→CAN→NI-XNET→データベース (編集および管理) で、ヘルプ→サンプルを検索にあるCAN Dynamic Database Creation.viのサンプルをご覧ください。
多くのNI-CANフレームAPIサンプルについては、類似したNI-XNETサンプルがあります。
データベースファイルの編集には、実行前に行う方法と実行中に行う方法という2つの主要な方法があります。NI-CANで実行前にデータベースファイルを編集するには、MAXのデータベースエディタが必要です。NI-XNETでは、すべてのデータベース編集機能がスタンドアロンのデータベースエディタに移行されます。データベースエディタは、スタート→すべてのプログラム→National Instruments→NI-XNETデータベースエディタから開くことができます。
図15. NI-XNETデータベースエディタは、CANデータベース編集用のスタンドアロンツールです。
NI-XNETデータベースエディタの詳細については、ホワイトペーパー「Introduction to FIBEX and the NI-XNET Database Editor」を参照してください。
NI-XNETには、FIBEXデータベースファイルをプログラムで編集する関数があります。それらの関数を使用して、カスタムデータベース操作ツールをアプリケーションに組み込むことができます。NI LabVIEWソフトウェアに付属のサンプルを見るには、ヘルプ→サンプルを検索を選択し、ハードウェア入力と出力→CAN→NI-XNET→データベース (編集および管理)に移動してください。
NI-CANでは、アプリケーションでハードドライブ上の.DBCまたは.NCLファイルを指定する必要があります。NI-XNETでは、アプリケーションを実行する前にエイリアスをデータベースファイル (.DBC、.NCL、FIBEX .xml) に追加する必要があります。これにはいくつかの方法があります。CAN Signal Input Single Point.viという名前のサンプルは、ハードウェア入力と出力→CAN→NI-XNET→セッションの紹介→信号セッションにあります。信号リストを右クリックしてBrowse for Database Fileをクリックし、ディスクにあるデータベースファイルを選択します。NI-XNETドライバは、このデータベースのエイリアスを自動的に作成するので、後でまた簡単に選択することができます。
図16. NI-XNETでデータベースを選択すると、アプリケーションでそのデータベースを参照することができます。
次にNI-XNET I/O制御器はデータベースファイルを自動的に読み取り、すべての信号名を付けます。そうすることで、アプリケーションで使用する信号を選ぶのが非常に簡単になります。
図17. データベースで利用可能な信号に応じて、制御器が自動的に更新されます。
下図は、NI-CANとNI-XNETのシングルポイントチャンネル/信号の書き込みを行うブロックダイアグラムを比較したものです。読み取りは類似しており、どちらのドライバにもサンプルが付属しています。
図18. シングルポイントデータの送信は、NI-CANでもNI-XNETでも類似しています。
波形データの読み取りと書き込みもNI-CANとNI-XNETで類似しており、どちらのドライバにも比較用のサンプルが付属しています。
図19. 波形の読み取りと書き込みはどちらのAPIでも類似しています。
1つの違いは、NI-XNETではデフォルトサンプルレートが1000であるということです。サンプルレートは、プロパティノードで簡単に変更することができます。
図20. 波形のリサンプルレートは、プロパティで構成できます。
NI-CANモード | NI-CANサンプルレート | NI-XNETモード | 注記 |
---|---|---|---|
入力 | 0 | 信号入力、シングルポイント | N/A (追加のプロパティはありません) |
入力 | >0 | 信号入力、波形 | NI-CANサンプルレートを使用して、セッション→リサンプルレートプロパティを設定します。 |
出力 | 0 | 信号出力、XY | 各フレームごとに、NI-XNET Database APIを使用して、CAN→タイミングタイプをイベントデータに設定し、CAN→送信時間を0 (デバウンスなし) に設定します。 |
出力 | >0 | 信号出力、波形 | 各フレームごとに、NI-XNET Database APIを使用して、CAN→タイミングタイプを周期的データに設定し、CAN→送信時間をNI-CAN 1/サンプルレートに設定します。 |
出力/最新 | >0 | 信号出力、シングルポイント | 各フレームごとに、NI-XNET Database APIを使用して、CAN→タイミングタイプを周期的データに設定し、CAN→送信時間をNI-CAN 1/サンプルレートに設定します。 |
Timestampedinput | N/A | 信号入力、XY | N/A (追加のプロパティはありません) |
表2. この表は、CAN通信におけるNI-CANとNI-XNETのサンプルレートの基本的な相違点を示しています。
NI-CANでは、ディスク上にあるデータベースを直接使用できます。 NI-XNETでは、アプリケーションでNI-XNET I/O制御器が使用できるように、そのファイルへのエイリアスを通常手動で作成します。ただし、アプリケーションを配布する場合やNI-CANの動作をエミュレーションしたい場合は、ディスク上のファイルのデータベースエイリアスをプログラムで作成することができます。その方法については、ハードウェア入力と出力→CAN→NI-XNET→データベース (編集および管理) にあるManaging Local Databases.viというサンプルを参照してください。
NI-XNETのNI-CAN用互換性レイヤにより、次世代のNI-XNET CAN/FlexRayインタフェースを利用するためのNI-CANコードの移行が大幅に簡素化されます。多少の違いはありますが、互換性レイヤを使用すれば、ほとんどのNI-CANアプリケーションはわずかな修正のみ (または修正なし) でNI-XNETハードウェアでも機能します。