「DAQmxタスクを開始」関数/VIを使用する
- 更新日2025-12-03
- 5分で読める
タスクを明示的に開始するには、「DAQmxタスクを開始」関数/VIを使用します。他の操作によって間接的にタスクが開始される場合は、自動開始したとみなされます。たとえば、「DAQmx読み取り」関数/VIまたは「DAQmx書き込み」関数/VIを呼び出すと、まだ開始されていないタスクが間接的に開始される場合があります。タスクが実行する操作の内容に応じてこの動作を指定します。デフォルトでは、1つのサンプルに対する「DAQmx読み取り」関数/VIまたは「DAQmx書き込み」関数/VIは、自動的にタスクを開始します。
有限的な測定タスクを開始する
有限的な測定を実行するようにタスクを設定した場合は、「DAQmxタスクを開始」関数/VIを呼び出す必要はありません。また、「DAQmx読み取り」関数/VIのデフォルトの動作を変更する必要もありません。「DAQmx読み取り」関数/VIを呼び出すと、タスクが開始され、有限的な測定が実行され、最後のサンプルの読み取りが完了した時点でタスクが停止します。その後タスクは読み取り操作が呼び出される前の状態に戻ります。ただし、デフォルト動作では、下記の理由により、タスク停止後に他の読み取り操作を実行する (バッファ内の前方にあるデータを読み取る) ことができません。
- タスクが確認済みの状態に戻り、サンプルにアクセスできなくなる。
- 次回「DAQmx読み取り」関数/VIを呼び出すと、完了した操作から読み取るのではなく、新しい読み取り操作が開始される。
この場合、「DAQmxタスクを制御」関数/VIの動作パラメータを「コミット」にして、タスクを明示的にコミットします。さらに、最初の読み取り操作が完了し、次の読み取り作業が開始される前に、読み取りを自動開始属性/プロパティをFALSEに設定します。
連続的な測定タスクを開始する
連続的な測定では、「DAQmxタスクを開始」関数/VIを明示的に呼び出して必要な読み取り操作を行い、停止するためには「DAQmxタスクを停止」関数/VIを呼び出します。読み取り操作をループ内で実行する際は、1つまたは複数のサンプル読み取り、オンデマンドでの読み取り、ハードウェアタイミングによる読み取りのいずれの場合でも、「DAQmxタスクを開始」関数/VIをループの前に、また「DAQmxタスクを停止」関数/VIをループの後に呼び出します。
アナログ出力タスクを開始する
「DAQmx書き込み」関数/VIの動作は、読み取りよりも複雑です。「DAQmx書き込み」関数/VIを呼び出すと、タスクがコミット状態またはそれ以降に移行します。タスクが実行中状態に移行するかどうかは、自動開始パラメータの値によって決定されます。
1つのサンプルを書き込む操作では、そのための特別な「DAQmx書き込み」関数/VIを呼び出します。この関数/VIを呼び出すことで、明示的にタスクを開始し、1つのサンプルを書き込み、タスクを停止することができます。複数サンプルの書き込み、またはオンデマンドの書き込みの場合は、自動開始パラメータの値をデフォルトのFALSEからTRUEに変更した状態で「DAQmx書き込み」関数/VIを呼び出します。この関数/VIを呼び出すことで、明示的にタスクを開始し、複数のサンプルを書き込み、タスクを停止することができます。
複数のサンプル書き込み、またはハードウェアタイミングによる書き込みの場合は、「DAQmx書き込み」関数/VIを呼び出して生成するサンプルを書き込み、明示的に「DAQmxタスクを開始」関数/VIを呼び出し、「DAQmx完了まで待機」関数/VIを呼び出してサンプルの生成を待機し、明示的に「DAQmxタスクを停止」関数/VIを呼び出します。
「DAQmx書き込み」関数/VIの自動開始パラメータを明示的にTRUEに設定して、または1つのサンプルを書き込む関数/VIを使用してハードウェアタイミングによるサンプル生成を実行すると、書き込むサンプルが波形を生成するために十分な速度でデバイスに転送されないため、操作が失敗することがあります。したがって、ハードウェアタイミングによるサンプル生成を行う場合は、生成する波形の一部をタスク開始前に生成しておく必要があります。
「DAQmxタスクを開始」関数/VIのパフォーマンスを改善する
上記の場合以外にも、「DAQmxタスクを開始」関数/VIと「DAQmxタスクを停止」関数/VIを明示的に呼び出す必要が生じることがあります (本来は必要ない場合でも)。読み取りまたは書き込みを行う関数/VIをループ内で呼び出す場合、「DAQmxタスクを開始」関数/VIをループに入る前に、また「DAQmxタスクを停止」関数/VIをループを出た後に実行するとパフォーマンスが大幅に向上します。ループに入る前に「DAQmxタスクを開始」関数/VIを明示的に実行しないと、読み取り/書き込み操作を開始するためにタスクを現在の状態から実行状態に間接的に移行させる必要があります。また、読み取り/書き込み操作の完了後、タスクを実行状態から以前の状態に間接的に移行させる必要があります。このような場合、間接的な状態の移行がループの各反復で発生するため、非効率的です。