NI-VXI APIプログラムをNI-VISAに変換する
VXIデバイスを制御する多くのアプリケーションの場合、NI-VXI APIを使用したプログラムとNI-VISAを使用したプログラムの最大の相違点は、最初と最後に行われた呼び出しの違いです。2つのAPIの最大の相違点は、VXIトリガ、割り込み、信号等のイベントを送信および処理するプロブラムに影響を及ぼします。このトピックでは、まずNI-VXI APIプログラムのすべてに共通の基本的な変更について説明します。次に、レジスタベースのプログラムとイベント処理プログラムの詳細について説明します。
NI-VXI APIプログラムをNI-VISAに変換する際に役立つリソースの1つに、NI-VXIヘルプがあります。ヘルプには、VXIオペレーションの各グループについてのセクションもあり、機能別に記載されています。(たとえば、上位レジスタベースのプログラミングについての説明があるセクションなど)各概要の初めには、NI-VXI APIとNI-VISAのそのグループのオペレーションと関連した関数をリストした表があります。この表を使用して、NI-VXI APIの関数とNI-VISAの対応する関数を参照することができます。
アプリケーションを開始する
通常、NI-VXI APIプログラムはInitVXIlibrary()を呼び出してプログラムを開始します。次に、FindDevLA()を呼び出して、特定のデバイスの論理アドレスを取得して通信を開始します。NI-VISAでは、プログラムはviOpenDefaultRM()を呼び出してNI-VISAを初期化し、viFindRsrc()を呼び出してデバイスを検出し、次にviOpen()を呼び出して、それに対するハンドルを取得します。
VXI I/Oを行う
メッセージベースのVXIデバイスの場合、他のメッセージベースの通信と同様に、データブロックの読み取りおよび書き込み用の呼び出しにはNI-VXIとNI-VISA間でそれぞれ対応した関数があります(WSwrt()はviWrite()、WSrd()はviRead()など)。ワードシリアルサーバントの機能は、NI-VISAのSERVANTリソースを使用します。
同様に、NI-VXI APIの対応関数によく似たNI-VISA関数を使用して、レジスタベースのI/Oが行われます。VXIin()の代わりにviInX()、VXImove()の代わりにviMoveX()が使用されます。通常、NI-VISAの属性により、NI-VXI APIからのアクセスパラメータが制御されます。指定されたデバイスに対するVISAセッションは、オフセットと境界の自動チェックを提供します。絶対アドレスが必要な場合、VISA MEMACCリソースのセッションを使用してください。MapVXIAddress()やVXIpeek()などの下位レジスタベースI/OオペレーションはVISAにもあり、viMapAddress()やviPeekX()など、対応する関数があります。NI-VISAでは、マッピングされる領域はセッションにつき1つに限定されているため、指定したデバイスに対して複数のセッションを開き、下位アクセスのために複数の領域をマッピングしてください。
イベントのアサートおよび処理
NI-VISAには、viAssertIntrSignal()、viAssertTrigger()などのオペレーションがあります。これは、NI-VXI APIにあるAssertVXIint()、SrcTrig()などと同じ機能をサポートします。これらの関数では、VISAの属性設定によって対応するNI-VXI APIのパラメータが提供する設定を行います。
NI-VISA APIとNI-VXI APIの違いは、VXIの割り込み、信号、トリガなどのイベントを処理するためのプログラミングをする際に最も顕著になります。イベントを有効にする関数と無効にする関数は、非常によく似ています。NI-VISAには、EnableSignalInt()など、NI-VXI API関数から派生した関数Enable...()/Disable()に対応する、viEnableEvent()およびviDisableEvent()があります。
両方のAPIを使用して、ハンドラ(別名コールバック)でイベントを非同期に受け取る、またイベントを待ち行列(キュー)に入れることができます。NI-VISAでは、viEnableEvent()のためのVI_HNDLRメカニズムおよびviInstallHandler()は、コールバックの使用を行い、VI_QUEUEではイベントの待ち行列を使用します。待ち行列を使用するNI-VXI APIの例として、SetVXIintHandler()などのSet...Handler()関数や、信号をキューに引き渡すRouteSignal()関数が挙げられます。イベントをキューから取り出す作業は、NI-VXIとNI-VISAではほぼ同様です。たとえば、WaitForSignal()や関連した関数の代わりにviWaitOnEvent()が使用されます。
VI_EVENT_VXI_SIGPイベントタイプ(割り込みと信号の両方)を提供するNI-VISAとRouteVXIint()オペレーションを提供するNI-VXIを使用して、両方のAPIでVXI割り込みおよび信号を合わせて処理することもできます。
アプリケーションを閉じる
アプリケーションの最後に、CloseVXIlibrary()の代わりにviClose()でデバイスのハンドルを閉じ、もう一度viClose()でデフォルトリソースマネージャセッションを閉じることによりNI-VISAをシャットダウンします。
ほとんどのアプリケーションでは、VXIデバイスの制御に、NI-VXI APIの代わりにNI-VISAを使用するほうが適切です。NI-VXIからNI-VISAへコードを移植する作業は容易でない場合もありますが、より使いやすく強力なAPIとインタフェース間の互換性を提供するVISAの特徴を考慮すると、変更する価値があります。
メモ 48ビット拡張ワードシリアルプロトコルコマンドやSEMI-SYNCトリガなどの機能の中には、NI-VXI APIでのみ使用可能なものもあります。この機能がVISAプログラムで必要な場合は、ナショナルインスツルメンツまでご連絡ください。アプリケーションについてのご意見をお待ちしております。また、VISA志向のソリューションについてのサポートも提供しております。 |