NI-DAQmxにおける10種類関数習得および多くデータ集録アプリケーション対処できる処理について

内容

NI-DAQmx:開発時間短縮パフォーマンス向上

NI-DAQmxのリリース以来、NIデータ収集(DAQ)ハードウェアのユーザは、開発時間の短縮とデータ収集アプリケーションのパフォーマンス向上の両方を達成するよう設計された多くの機能をフルに活用しています。

開発時間を大幅に短縮する機能の1つに、NI-DAQmxアプリケーションプログラミングインタフェース(API)がありますが、これはデバイスの機能とデバイスファミリのすべてにわたって同じです。つまり、マルチファンクションデバイスのすべての機能が同じ関数セット(アナログ入力、アナログ出力、デジタルI/O、カウンタ)を使用してプログラムされているということです。さらに、デジタルI/Oデバイスとアナログ出力デバイスの両方が同じ関数セットを使用しでプログラムされています。これを可能にしているのがLabVIEWの多態性です。多態性VIは、1つ以上の入力端子や出力端子に複数のデータタイプを受け入れます。また、NI-DAQmx APIは適用可能なすべてのプログラミング環境で一貫しています。単一の関数セットの使用方法を習得するだけで、複数のプログラミング環境でほとんどのNIデータ収集ハードウェアをプログラミングできるようになります。

開発経験を向上させるNI-DAQmxのもう一つの機能がDAQアシスタントです。このツールでは、単純なデータ収集タスクと複雑なデータ収集タスク両方の構成に対応したグラフィカルインタフェースを介して、プログラミングなしでアプリケーションを作成できます。さらに、トリガ信号やクロック信号を手動で経路設定しなければならないため、通常は実装が難しい同期プロセスも、単一のデバイスの異なる機能領域間および複数のデバイス間で信号の経路設定を自動的に実行するNI-DAQmxを使用すれば簡単に実行できます。

NI-DAQmxを使用してビルドしたデータ収集アプリケーションは、パフォーマンスを最大化するよう設計されたアーキテクチャの利点を享受できます。その最初の利点が、不要な再構成を排除した効率的な状態モデルです。このオーバーヘッドを取り除いたことで、構成と収集の両方が最適化されます。さらに、50kS/sを上回るシングルポイントI/Oレートを実現できます。このレベルのパフォーマンスを可能にしているのが、メモリマップドレジスタです。

NI-DAQmxアーキテクチャのもう一つの重要な機能に、測定のマルチスレッド処理があります。NI-DAQmxはマルチスレッドなので、複数のデータ収集操作を同時に実行できます。そのため、複数の操作を含むアプリケーションのパフォーマンスを大幅に向上させることができます。また、このようなアプリケーションのプログラミングを大幅に簡素化できます。

いくつかの関数を習得するだけで、これらの利点を活用できるようになるのです。実際、10個のNI-DAQmx関数で、データ収集アプリケーションの80%を解決する機能を提供できます。このドキュメントでは、これらの関数について、その機能と用途の両方を理解できるよう詳しく解説します。


メモ:  このドキュメント全体で参照されている例は、ドキュメント 「LabVIEWおよびWindowsテキストベースのNI-DAQmxサンプルの場所」で示されている場所にあります。

DAQアシスタント

Tools→Create/Edit DAQmx Tasks [CVI]
Project»Add New Item»DAQmx Task [.NET]






 

DAQアシスタントは、NI-DAQmx仮想チャンネルとタスクをインタラクティブに作成、編集、実行するためのグラフィカルインタフェースです。NI-DAQmx仮想チャンネルは、DAQデバイスの物理チャンネルと、入力レンジやカスタムスケールといったこの物理チャンネルの構成情報からなります。NI-DAQmxタスクとは、仮想チャンネル、タイミング/トリガ情報、収集と生成に関わるその他のプロパティの集まりです。以下の図では、DAQアシスタントは有限歪み測定を行うように構成されています。

 


以下のドキュメントでは、LabVIEW、LabWindows/CVI、.NETでのDAQアシスタントの使用方法について説明しています。

NI-DAQmx Express VIチュートリアル
LabWindows/CVIでDAQアシスタントを使用する
Measurement StudioでDAQアシスタントを使用する

DAQアシスタントでは、指定された収集または生成の構成や実行用のコードを生成することもできます。LabVIEWでのこの手順については、DAQアシスタントのヘルプと「DAQアシスタントで自動的にLabVIEWコードを生成する」というドキュメントで説明しています。以下の図はDAQアシスタントのインスタンスと、その結果として自動生成された設定とLabVIEWコードの例を示しています。


特定のデータ収集アプリケーションでは、DAQアシスタントで提供されるよりも高い柔軟性とパフォーマンスが求められます。これらのアプリケーションには、以下に説明するシンプルかつパワフルなNI-DAQmx関数が必要です。

NI-DAQmx仮想チャンネル作成



Library»NI-DAQmx»Channel Creation/Configuration [CVI]

Task.Channel.CreateChannel Property [.NET]








「NI-DAQmx仮想チャンネルを作成」関数は、仮想チャンネルを作成してタスクに追加します。複数の仮想チャンネルを作成して、すべてを1つのタスクに追加する場合にも使用できます。タスクが指定されていない場合は、タスクが作成されます。「NI-DAQmx仮想チャンネルを作成」関数には多数のインスタンスがあります。これらのインスタンスは、仮想チャンネルが実行する特定のタイプの測定または生成に対応しています。

LabVIEWでチャンネルを作成する

以下の図は、「NI-DAQmx仮想チャンネルを作成」VIの異なるインスタンスの4つの例を示しています。


「NI-DAQmx仮想チャンネルを作成」関数への入力は、関数のインスタンスごとに異なります。ただし、すべてではありませんが、関数のほとんどのインスタンスで共通する入力があります。たとえば、仮想チャンネルが使用する物理チャンネル(アナログ入力とアナログ出力)、ライン(デジタル)、またはカウンタを指定するには入力が必要です。また、アナログ入力、アナログ出力、およびカウンタ操作では、最小値最大値の入力を使用して、信号の最小期待値と最大期待値に基づいて測定および生成を構成し、最適化します。さらに、多くのタイプの仮想チャネルにはカスタムスケールを適用できます。以下のLabVIEWブロックダイアグラムでは、「NI-DAQmx仮想チャンネルを作成」VIを使用して熱電対仮想チャネルを作成しています。

 

.NETでチャンネルを作成する

NI-DAQmx .NETライブラリのほとんどのクラスは、直接インスタンス化できません。これらのクラスは、クラスのサブオブジェクトとして使用されます。

これらのクラスには、特定タイプのチャンネルに固有のプロパティが含まれています。たとえば、カウントのようなプロパティはカウンタにのみ適用され、CIChannelクラスとCOChannelクラスでのみ使用できます。以下のタイプのチャンネルは、NI-DAQmx .NETクラスライブラリの以下のクラスに関連付けることができます。

アナログ入力チャンネル―AIChannelクラス

アナログ出力チャンネル―​AOChannelクラス

デジタル入力チャンネル―DIChannelクラス

デジタル出力チャンネル―DOChannelクラス

カウンタ入力チャンネル―​CIChannelクラス

カウンタ出力チャンネル―​COChannelクラス

Taskクラスには、​6​種類​の​各​タイプ​の​チャンネル​(AIChannels、​AOChannels、​DIChannels、​DOChannels、​CIChannels、​COChannels)​に​対応​する​チャンネル​の​集合​の​プロパティ​が​あり​ます。チャンネルを作成するには、チャンネルの集合にある多数のチャンネル作成メソッドの1つを使用できます。

新しいTaskオブジェクトのインスタンス化後、Channelクラスの適切なメンバー関数を呼び出して、AIChannelオブジェクトの作成と割り当てが行われます。次のスニペットは、単純なアナログ入力電圧チャンネルを作成します。

analogInTask = new Task();

AIChannel myChannel;

myChannel = analogInTask.AIChannels.CreateVoltageChannel(

    "dev1/ai1", //チャンネルの物理名

    "myChannel", //このチャンネルと関連付ける名前

    AITerminalConfiguration.Differential, //差動配線

    -10, //最小値-10v

    10, //最大値10v

    AIVoltageUnits.Volts //ボルトを使用
);

 

C/C++でタスクを作成する

タスクを作成するには「DAQmxCreateTask()」関数を、アナログ入力電圧チャンネルを作成するには「DAQmxCreateAIVoltageChan()」関数を使用します。異なる測定タイプのチャンネルの作成については、「NI-DAQmx C Reference Help」を参照してください。以下のスニペットでは、2つの関数の使い方を示します。

TaskHandle  taskHandle=0;
char        chan[256] = "Dev1/ai0";
float64     min = -10, max = 10;

DAQmxCreateTask("",&taskHandle);

DAQmxCreateAIVoltageChan(taskHandle ,chan ,"", DAQmx_Val_Cfg_Default, min, max, DAQmx_Val_Volts, NULL);

 

参考となるサンプル:

LabVIEWデジタル―Finite Output.vi
熱電対―Continuous Input.vi
CVIWrite Dig Port
Cont Thrmcpl Samples-Int Clk
.NETWriteDigPort
ContAcqThermocoupleSamples_IntClk

 

NI-DAQmxトリガ


Library»NI-DAQmx»Triggering [CVI]

Task.Triggers Property [.NET]

 

「NI-DAQmxトリガ」関数は、特定の動作を実行するトリガを構成します。最も一般的に使用される動作は開始トリガ基準トリガです。開始トリガは収集や生成を開始します。基準トリガは一連の収集サンプルでの位置を確立します。ここで、プレトリガのデータが終わり、ポストトリガのデータが開始します。これらのトリガはどちらも、デジタルエッジまたはアナログエッジ上、またはアナログ信号がウィンドウで入出力されたときに発生するように構成できます。

LabVIEWでトリガを作成する

以下のLabVIEWブロックダイアグラムでは、「NI-DAQmxトリガ」VIを使用して、開始トリガと基準トリガの両方がアナログ入力操作のデジタルエッジで発生するように構成されています。


多くのデータ収集アプリケーションでは、単一デバイスの異なる機能領域(アナログ出力やカウンタなど)の同期が必要です。複数のデバイスの同期が必要なものもあります。この同期を達成するには、単一デバイスの異なる機能領域間および複数のデバイス間でトリガ信号を経路設定する必要があります。NI-DAQmxは自動的にこの経路設定を実行します。「NI-DAQmxトリガ」関数を使用する場合、有効なすべてのトリガ信号を関数へのソース入力として使用できます。たとえば、次の「NI-DAQmxトリガ」VIでは、明示的な経路設定を実行しなくても、デバイス2の開始トリガ信号をデバイス1の開始トリガのソースとして使用できます。

 

.NETでトリガを作成する

TaskオブジェクトとChannelオブジェクトの作成後、Task.Triggersコレクション内のメソッドを呼び出すことで、タスクにトリガを追加できます。以下のコードスニペットは、デジタルエッジ開始トリガを作成します。

analogInTask = new Task();

DigitalEdgeStartTriggerEdge triggerEdge = DigitalEdgeStartTriggerEdge.Rising;

analogInTask.AIChannels.CreateVoltageChannel( ... );

analogInTask.Triggers.StartTrigger.ConfigureDigitalEdgeTrigger("PFI0", triggerEdge);

デバイスは、「ConfigureDigitalEdgeTrigger」関数に送られたパラメータに基づいて、データの収集を開始する前に、内部または外部ラインで立ち上がりまたは立ち下がりデジタルエッジを探します。上のスニペットは、PFI 0で立ち上がりデジタルエッジトリガを探すようにデバイスを設定します。

 

C/C++でトリガを作成する

「DAQmxCfgDigEdgeStartTrig()」関数を使用して、デジタルエッジ開始トリガを作成します。異なるトリガの作成については、「NI-DAQmx C Reference Help」を参照してください。以下は、PFI0で受信され、そのラインで立ち上がりエッジを探すデジタル開始トリガを作成する関数の使用方法を示すスニペットです。

char        startTrigger[256] = "Dev1/PFI0";
int         startEdge = 0; //立ち上がりエッジ

DAQmxCreateTask("",&taskHandle));

DAQmxCreateAIVoltageChan(taskHandle, chan, "", DAQmx_Val_Cfg_Default, min, max, DAQmx_Val_Volts, NULL);

DAQmxCfgDigEdgeStartTrig(taskHandle, startTrigger, startEdge);
 

 

NI-DAQmxのタイミングと同期の特性」ドキュメントには、NI-DAQmxで同期を実行する「NI-DAQmxトリガ」関数の使用に関する追加情報が記載されています。

参考となるサンプル:

LabVIEW電圧―Finite Input.vi
電圧―Continuous Input.vi
CVIAcq-Int Clk-Dig Start&Ref
Cont Acq-Int Clk-Anlg Start
.NETAcqVoltageSamples_IntClkDigStartAndRef
ContAcqVoltageSamples_IntClkAnalogStart

NI-DAQmxタイミング


Library»NI-DAQmx»Timing [CVI]

Task.Timing Property [.NET]







「NI-DAQmxタイミング」関数は、ハードウェアタイミングのデータ収集操作のタイミングを構成します。これには、連続操作または有限操作の指定、有限操作で収集または生成するサンプル数の選択、必要に応じたバッファ作成が含まれます。

サンプルタイミングを必要とする操作(アナログ入力、アナログ出力、カウンタ)の場合、「NI-DAQmxタイミング」関数のサンプルクロックインスタンスが、サンプルクロックのソース(内部または外部ソース)とレートの両方を設定します。サンプルクロックは、サンプルの収集レートまたは生成レートを制御します。各クロックパルスは、タスクに含まれる仮想チャンネルごとに1つのサンプルの収集または生成を開始します。

 

LabVIEWでタスクタイミングを構成する


以下のLabVIEWブロックダイアグラムは、「NI-DAQmxタイミング」VIのサンプルクロックインスタンスを使用して、外部サンプルクロックによる連続アナログ出力生成を構成する方法を示しています。


データ収集アプリケーションで同期を実現するには、トリガ信号を単一デバイスの異なる機能領域間および複数デバイス間で経路設定する必要がありますが、タイミング信号も同じように経路設定する必要があります。NI-DAQmxはこの経路設定も自動的に行います。「NI-DAQmxタイミング」関数のソース入力として、すべての有効なタイミング信号を使用できます。たとえば、以下の「DAQmxタイミング」VIでは、明示的な経路設定を行わずに、デバイスのアナログ出力サンプルクロック信号をアナログ入力チャンネルのサンプルクロックのソースとして利用できます。


NI-DAQmxのタイミングと同期の特性」ドキュメントには、NI-DAQmxで同期を実行する「NI-DAQmxタイミング」関数の使用に関する追加情報が記載されています。

ほとんどのカウンタ操作では、測定される信号がタイミングを提供するため、サンプルタイミングは必要ありません。これらのアプリケーションでは、「NI-DAQmxタイミング」関数の指定なしインスタンスを使用する必要があります。以下のLabVIEWブロックダイアグラムでは、「NI-DAQmxタイミング」VIの指定なしインスタンスを使用して、指定されたサンプル数で有限となるようにバッファされたパルス幅収集を設定しています。


.NETでタスクタイミングを構成する

サンプルクロックのソース、サンプルクロックのレート、収集または生成するサンプル数を設定するには、「Channel.Timinging.ConfigureSampleClock()」関数を使用します。以下のコードスニペットは、デバイスのPFI 0に接続された外部サンプルクロックに基づく連続収集を作成します。

analogInTask = new Task();

analogInTask.AIChannels.CreateVoltageChannel( ... );

analogInTask.Timing.ConfigureSampleClock(

"/Dev1/PFI0", //外部クロックソースラインまたは内部クロックに""を使用

10000, //外部クロックの予測レートまたは内部クロックの実際のレート

SampleClockActiveEdge.Rising, //ティックの立ち上がりまたは立ち下がりエッジで収集

SampleQuantityMode.ContinuousSamples, //連続または有限ンサンプル

1000 //収集する、または連続の場合はバッファサイズに使用する有限サンプル数

);

 

C / C ++でタスクタイミングを構成する

CまたはC ++でタスクのタイミングを構成するには、「DAQmxCfgSampClkTiming」関数を使用します。以下のコードスニペットは、10000 hzで動作する内部クロックへの使用方法を示しています。

char        clockSource[256] = "";
float64     rate = 10000;

DAQmxCfgSampClkTiming(taskHandle, clockSource, rate, DAQmx_Val_Rising, DAQmx_Val_ContSamps, 1000);

 

特定のデータ収集デバイスは、デジタルI/O操作のタイミングとしてハンドシェイクを採用しています。ハンドシェイクは、外部機器との間で要求タイミング信号と肯定応答タイミング信号の交換を使用して、各サンプルを転送します。「NI-DAQmxタイミング」関数のハンドシェイクインスタンスは、デジタルI/O操作のハンドシェイクのタイミングを設定します。

参考となるサンプル:

LabVIEW電圧―Continuous Output.vi
カウンタ―Read Pulse Width and Frequency (Finite).vi
CVICont Gen Volt Wfm-Ext Clk
Buff Semi-Period-Finite
.NETContGenVoltageWfm_ExtClk
MeasBuffered_SemiPeriodFinite

 

DAQmxタスク開始


Library»NI-DAQmx»Task Configuration/Control»Start Task [CVI]

Task.Start Method [.NET]


概要で述べたように、NI-DAQmxが採用している状態モデルは、不要な再構成を排除し、高い効率性とパフォーマンスの最大化を実現しています。この状態モデルは、タスクが存在できる5つの状態で構成されています。これらの各状態の詳細については、NI-DAQmxヘルプの「 NI-DAQmxの概念」→「NI-DAQmxのチャンネルとタスク」→「NI-DAQmxのタスク」→「タスクの状態モデル 」を参照してください。

「NI-DAQmxタスクを開始」関数は明示的にタスクを実行状態に遷移します。実行状態で、タスクは指定された収集または生成を実行します。「NI-DAQmx読み取り」関数の実行時に「NI-DAQmxタスクを開始」関数が使用されていない場合、タスクは暗示的に実行状態に遷移され、自動的に開始します。また、「NI-DAQmxタスクを開始」関数を使用せずに、自動開始入力を指定して「NI-DAQmx書き込み」関数を実行する場合も、この暗示的な遷移が発生します。

「NI-DAQmxタスクを開始」関数は必須ではありませんが、この関数を使用して、ハードウェアタイミングによる収集や生成を含むタスクを明示的に開始することが推奨されます。また、「NI-DAQmx読み取り」関数や「NI-DAQmx書き込み」関数をループなどで複数回実行する場合も、「NI-DAQmxタスクを開始」関数を使用する必要があります。使用しないと、開始と停止が繰り返されるため、タスクのパフォーマンスが低下します。「NI-DAQmxタスクを開始」関数を使用するタイミングについては、「LabVIEWでDAQmxタスクを開始VIとDAQmxタスクを停止VIを使用する」を参照してください。

 

LabVIEWでタスクを開始する

以下のLabVIEWブロックダイアグラムは、アナログ出力生成が単一のソフトウェアタイミングサンプルのみで構成されているため、「NI-DAQmx開始」関数を使用する必要がない状況を示しています。


逆に、以下のLabVIEWブロックダイアグラムは、カウンタからの読み取りのために「NI-DAQmx読み取り」関数を複数回実行しているため、「NI-DAQmx開始」関数を使用する必要がある状況を示しています。

 

.NETでタスクを開始する

タスクを開始するには、Taskオブジェクトで「Start()」関数を使います。以下のコードスニペットは、「Start()」関数の使用方法を示しています。

analogInTask = new Task();

analogInTask.AIChannels.CreateVoltageChannel( ... );

analogInTask.Timing.ConfigureSampleClock( ... );

analogInTask.Start();

 

C/C++でタスクを開始する

タスクを開始するには、「DAQmxStartTask()」関数を使用します。その使用方法のコードスニペットを下に示します。

DAQmxStartTask(taskHandle);

 

参考となるサンプル:

LabVIEWカウンタ―Continuous Output.vi
電流―Continuous Input.vi
CVIDig Pulse Train-Cont
Cont 0-20mA Samps-Int Clk
.NETGenDigPulseTrain_Continuous
ContAcq0_20mACurrentSamples_IntClk

NI-DAQmx読み取り


Library»NI-DAQmx»Read Functions [CVI]

ChannelReader Class [.NET]



「NI-DAQmx読み取り」関数は、指定された収集タスクからサンプルを読み取ります。関数のさまざまなインスタンスを使用して、収集のタイプ(アナログ、デジタル、カウンタ)、仮想チャンネル数、サンプル数、データタイプを選択できます。「NI-DAQmx読み取り」関数は、DAQボード上のFIFOからRAM上のPCバッファに指定された数のサンプルが転送された後に、PCバッファからアプリケーション開発環境(ADE)メモリにサンプルを移動します。

LabVIEWでデータを読み取る

以下の図は、「NI-DAQmx読み取り」VIの異なるインスタンスの4つの例を示しています。


複数のサンプルを読み取ることができる「NI-DAQmx読み取り」関数のインスタンスには、関数の実行時に読み取るチャンネルごとのサンプル数を指定する入力が含まれています。有限収集の場合、チャンネルあたりのサンプル数を-1に指定すると、関数は要求されたすべてのサンプルが収集されるのを待ってから、これらのサンプルを読み取ります。連続収集の場合、チャンネルあたりのサンプル数を -1 に指定すると、関数の実行時にバッファ内で現在利用可能なすべてのサンプルが読み取られます。以下のLabVIEWブロックダイアグラムでは、「NI-DAQmx読み取り」VIは、複数のアナログ入力仮想チャンネルから複数のサンプルを読み取って波形として返すように設定されています。さらに、チャンネル入力あたりのサンプル数は定数値10に配線されているため、VIが実行されるたびに各仮想チャンネルから10個のサンプルが読み取られます。

 

.NETでデータを読み取る

NI-DAQmx .NETライブラリで読み取るには、リーダオブジェクトとストリームオブジェクトを使用します。このプログラミングパターンは、ファイルおよびネットワークI/Oを対象とする.NETフレームワーク全体で使用されるパターンに似ています。

DaqStream​クラス​に​は、​CurrentReadPosition​など​の​I/​O​に​関連​する​プロパティと​未処理​​I/​O​の​ためのメソッド​が​あり​ます。特定のTaskに対応するDaqStreamクラスのインスタンスを取得するには、Streamプロパティを使用します。DaqStreamクラスのインスタンスを直接インスタンス化することはできません。

NI-DAQmxライブラリで読み取りを実行するには、reader(リーダ)のインスタンスを作成し、コンストラクタでDaqStreamクラスのインスタンスを渡します。次に、以下のスニペットに示すように、reader(リーダ)クラスでメソッドを呼び出してデータを読み取ります。

analogInTask = new Task();

analogInTask.AIChannels.CreateVoltageChannel( ... );

//reader(リーダ)を作成しストリームに接続
AnalogSingleChannelReader reader = new AnalogSingleChannelReader(analogInTask.Stream);

//読み取りを実行
double[] data = reader.ReadMultiSample(100);

 

C/C++でデータを読み取る
CまたはC++でアナログ入力タスクからアナログデータを読み取るには、「DAQmxReadAnalogF64()」関数を使用します。その他の読み取り関数については、「NI-DAQmx C Reference Help」を参照してください。1つのチャンネルから1000サンプルを読み取るためのコードスニペットを以下に示します。

int numRead = 0;

DAQmxReadAnalogF64(taskHandle, 1000, 10.0, DAQmx_Val_GroupByScanNumber, data, 1000, &numRead, NULL);

 

参考となるサンプル:

LabVIEW電圧―SW-Timed Input.vi
デジタル―Finite Input.vi
CVIOne Sample
Read Dig Chan
.NETAcqOneVoltageSample
ReadDigChan

 

NI-DAQmx書き込み


Library»NI-DAQmx»Write Functions [CVI]

ChannelWriter Class [.NET]





「NI-DAQmx書き込み」関数は、指定された生成タスクにサンプルを書き込みます。関数のさまざまなインスタンスを使用して、生成のタイプ(アナログまたはデジタル)、仮想チャンネル数、サンプル数、データタイプを選択できます。「NI-DAQmx書き込み」関数は、アプリケーション開発環境(ADE)メモリからRAM内のPCバッファにサンプルを移動します。その後、これらのサンプルは、PCバッファからDAQボードFIFOに転送されて生成されます。 

「NI-DAQmx書き込み」関数の各インスタンスには自動開始入力があり、タスクが明示的に開始されていない場合、暗示的にタスクを開始するかどうかを決定します。このドキュメントの「NI-DAQmxタスクを開始」セクションで説明したとおり、ハードウェアタイミングを使用する生成タスクを明示的に開始するには、「NI-DAQmxタスクを開始」関数を使用する必要があります。また、「NI-DAQmx書き込み」関数を複数回実行する場合も、この関数を使用してパフォーマンスを最大化する必要があります。

LabVIEWでデータを書き込む

以下の図は、「NI-DAQmx書き込み」VIの異なるインスタンスの4つの例を示しています。


以下に示す有限アナログ出力生成のLabVIEWブロックダイアグラムでは、ハードウェアタイミングで生成されるため、「NI-DAQmx書き込み」VIの自動開始入力に「False」ブール定数が配線されています。「NI-DAQmx書き込み」VIは、1チャンネル分のアナログ出力データの複数サンプルをアナログ波形としてタスクに書き込むように設定されています。


.NETでデータを書き込む

NI-DAQmx .NETライブラリで書き込むには、writer(ライタ)オブジェクトとストリームオブジェクトを使用します。このプロセスは、前述の読み取りデータと似ています。

書き込みを実行するには、writer(ライタ)のインスタンスを作成し、コンストラクタでDaqStreamクラスのインスタンスを渡します。次に、以下のスニペットに示すように、writer(ライタ)クラスでメソッドを呼び出してデータを書き込みます。

analogOutTask = new Task();

analogOutTask.AOChannels.CreateVoltageChannel( ... );

//writer(ライタ)を作成しストリームに接続
AnalogSingleChannelWriter writer = new AnalogSingleChannelWriter(analogOutTask.Stream);

//書き込みを実行
double[] data = writer.WriteMultiSample(100);

 

C/C++でデータを書き込む
アナログデータを書き込むには、「DAQmxWriteAnalogF64()」関数を使用します。他の形式のデータの書き込みについては、「NI-DAQmx C Reference Help」を参照してください。1000サンプルのアナログデータを書き込むコードスニペットを以下に示します。

int written = 0;

DAQmxWriteAnalogF64(taskHandle, 1000, 0, 10.0, DAQmx_Val_GroupByChannel, data, &written, NULL);

 

参考となるサンプル

LabVIEW電圧― Finite Output.vi
デジタル―Finite Output.vi
CVIVolt Update
Write Dig Chan
.NETGenVoltageUpdate
WriteDigChan

 

NI-DAQmx完了まで待機


Library»NI-DAQmx»Task Configuration/Control»Wait Until Task Done [CVI]

Task.WaitUntilDone Method [.NET]


「NI-DAQmx完了まで待機」関数は、データ収集操作が完了するまで待機します。この関数は、指定された収集または生成が完了していることを確認してからタスクを停止するために使用します。ほとんどの場合、「NI-DAQmx完了まで待機」関数は有限操作で使用されます。この関数の実行が終了すると、有限収集または生成が完了し、操作を妨げることなくタスクを停止することができます。さらに、タイムアウト入力で最大待機時間を指定することができます。この時間内に収集または生成が完了しない場合、関数は終了し、適切なエラーが生成されます。

LabVIEWでの完了まで待機

以下のLabVIEWブロックダイアグラムでは、「NI-DAQmx完了まで待機」VIを使用して、有限デジタル出力操作が完了していることを確認してからタスクをクリアしています。


.NETでの完了まで待機

.NETでこの関数を使用する方法の詳細については、「GenMultVoltUpdates_IntClk」の例を参照してください。

C/C++での完了まで待機

バッファ内のすべてのサンプルが生成されるまで待機するには、「DAQmxWaitUntilTaskDone()」関数を使用します。書き込み関数または開始関数の後に呼び出します。

 

参考となるサンプル

LabVIEWデジタル―Finite Output.vi
電圧― Finite Output.vi
CVIDig Pulse
Mult Volt Updates-Int Clk
.NETGenDigPulse
GenMultVoltUpdates_IntClk

 

NI-DAQmxタスククリア


Library»NI-DAQmx»Task Configuration/Control»Clear Task [CVI]

Task.Dispose Method [.NET]


 

「NI-DAQmxタスクをクリア」関数は指定したタスクをクリアします。タスクが実行中の場合、この関数は、まずタスクを停止してすべてのリソースを解放します。一度クリアされたタスクは、再作成しない限り使用できません。そのため、タスクを再使用する予定の場合は、「NI-DAQmxタスクを停止」関数を使用して、タスクをクリアせずに停止する必要があります。

連続操作の場合は、「NI-DAQmxタスクをクリア」関数を使用して、実際の収集または生成を停止させてください。

LabVIEWでタスクをクリアする

以下のLabVIEWブロックダイアグラムでは、連続パルス列をカウンタで生成しています。Whileループが終了し、「NI-DAQmxタスクをクリア」VIが実行されるまでパルス列が出力されます。


.NETでタスクをクリアする

タスクの読み取りまたは書き込みが終了したら、Task.Disposeメソッドを呼び出すだけです。

C/C++でタスクをクリアする

タスクの読み取りまたは書き込みが終了したら、「DAQmxClearTask()」関数を使用します。

参考となるサンプル

LabVIEW電圧―Continuous Output.vi
カウンタ―Count Edges (Continuous Clock).vi
CVICont Gen Volt Wfm-Int Clk
Cnt Dig Events
.NETContGenVoltageWfm_IntClk
CountDigEvents

 

NI-DAQmxプロパティ

Attribute [CVI]

Property [.NET]

NI-DAQmxプロパティを使用すると、データ収集操作に関連するすべてのプロパティにアクセスできます。これらのプロパティはNI-DAQmxプロパティに書き込むことで設定でき、プロパティの現在の値もNI-DAQmxプロパティから読み取ることができます。

前述のNI-DAQmx関数を使用して多くのプロパティを設定できます。たとえば、サンプルクロックソースプロパティとサンプルクロックアクティブエッジプロパティは、「NI-DAQmxタイミング」関数を使用して設定できます。ただし、使用頻度の低いプロパティの一部は、NI-DAQmxプロパティからのみアクセスできます。

LabVIEWでプロパティを使用する(プロパティノード)


LabVIEWでは、1つのNI-DAQmxプロパティノードを使用して、複数のプロパティへの書き込みや読み取りを行うことができます。たとえば、以下のLabVIEW NI-DAQmxタイミングプロパティノードはサンプルクロックのソースを設定します。次に、サンプルクロックのソースが読み取られます。最後に、サンプルクロックのアクティブエッジが設定されます。


以下のLabVIEWブロックダイアグラムでは、NI-DAQmxチャンネルプロパティノードを使用してハードウェアローパスフィルタを有効にし、歪みゲージ測定で使用するためのフィルタカットオフ周波数を設定しています。


 

.NETでプロパティを使用する

「タイミング」セクションで述べたように、多くのプロパティは、Taskオブジェクト内のサブクラスやコレクションから設定されます。NI-DAQmxでの一般的なプロパティの使用方法を以下のスニペットに示します。

//新規NI-DAQmxタスクを作成
Task t = new Task();

//Taskクラスのサブオブジェクトプロパティにアクセス
t.Timing.SamplesPerChannel = 1000;

 

C/C++でプロパティを使用する

タスクのプロパティを取得または設定するために、個々のプロパティごとに個別のゲッタ関数とセッタ関数があります。詳細については、「NI-DAQmx C Reference Help」の「NI-DAQmx C Properties」にあるプロパティと関数のリストを参照してください。

参考となるサンプル

LabVIEW歪み―Continuous Input.vi
熱電対(OTCD付き)―Continuous Input.vi
CVICont Strain Samples
Cont Accel Samps-Int Clk-Anlg Start
.NETAcqStrainSamples
ContAcqAccelSamp_IntClk_AnalogStart

 

まとめ

NI-DAQmxは開発時間を短縮し、データ収集アプリケーションのパフォーマンスを向上させます。NI-DAQmxは、少数の関数を使用するだけで機能の大部分を活用できるAPIを提供して開発時間の短縮を実現しています。実際、このドキュメントで説明した10の関数を習得するだけで、データ収集アプリケーションの80%を解決できます。

関連​リンク

Was this information helpful?

Yes

No