解決策
このエラーは、NI-DAQmxが物理リソースの競合を認識したときに発生します。このエラーが発生する原因はいくつかあり、以下に例を示します。
- ケース 1: ループ内でDAQmxタスクを長期間連続的に開始およびクリアした場合
- ケース 2: 2つのカウンタを必要とするカウンタタスクを実行中に、そのうちの1つのカウンタが同じデバイスの別のタスクにより使用されている場合
- ケース 3: 複数のDAQアシスタントExpress VIを使用して同じデータ収集ボードのチャンネルにアクセスしている場合
- ケース 4: 個別に実行するとエラーは発生しないが、トップレベルVIから呼び出すとエラーが発生するサブVIを複数使用した場合
- ケース 5: 複数のアナログ入力またはアナログ出力タスクを同時に実行した場合
- ケース 6: タスクを適切にクリアせずにそのリソースを解放した場合
- ケース 7: 実行中のLabVIEWプログラムで使用中にNI-MAXでタスクを使用しようとした場合
ケース 1: ループ内でDAQmxタスクを長期間連続的に開始およびクリアした場合
この問題を回避するには、ループの前でタスクの構成および開始を一度行い、その後で必要に応じてループ内で読み取りまたは書き込み関数を呼び出し、ループの後でタスクをクリアします。
この方法の例は、DAQmxおよびNI Communityページのサンプルから参照できます。サンプルを検索するには、LabVIEWを起動し、
ヘルプ>>サンプルを検索を選択します。表示オプションからタスクを選択し、
ハードウェア入力と出力>>DAQmxを選択します。
間違った例:正しい例:
ケース 2: 同じデバイス上で複数のカウンタタスクを使用している場合
2つのカウンタが必要なタスクでは、2つ目のカウンタは「チャンネルを作成」VIに配線されているカウンタに基づいて予約されます。 カウンタは隣り合うカウンタと常にペアになるため、ctr 0はctr 1と、ctr 2はctr 3とペアになります。いくつかのカウンタタスクは、
複数のカウンタが必要です。
ケース 3: 複数のDAQアシスタントExpress VIを使用して同じデータ収集ボード上のチャンネルにアクセスしている場合
各Express VIはそれぞれ独自のタスクを作成するため、複数のDAQmxタスクが同じ物理デバイスにアクセスすることはできません。このため、データ収集が完了した時点で各タスクをクリアする必要があります。 DAQアシスタントExpress VIの停止入力は、実行が完了した時点でタスクを停止してデバイスリソースを解放します。
- シングルポイント収集または有限データ収集では、停止入力のデフォルト値がTRUEであるため、この入力にTRUEブール定数を配線する必要はありません。
同じループ内にある複数のExpress VIでこのエラーを回避する:
- 1つのDAQアシスタントのエラー出力端子を2番目のDAQアシスタントのエラー入力端子に配線します。
- 同じ測定タイプの複数インスタンスを実行する場合は、複数のチャンネルに対して構成された単一のDAQアシスタントを使用するだけで済みます。
ケース 4: 個別に実行するとエラーは発生しないが、トップレベルVIから呼び出すとエラーが発生するサブVIを複数使用した場合
エラー -50103は、複数のNI-DAQmx VIが、すでに開いているタスクをクリアせずに再度呼び出した場合に発生する可能性があります。このエラーの発生を回避する方法は、以下のとおりです。
- 別のサブVIで再度開かれる前にタスクをクリアするか、サブVIから別のサブVIへDAQmxタスクを渡すことによりタスクが再度開かれないようにします。
ケース5: 複数のアナログ入力またはアナログ出力タスクを同時に実行した場合
このエラーは、プログラムが同じタイプの処理を同時に実行する複数のタスクを明示的に呼び出した場合にも発生します。上記の2つのケースと同様、この場合も、複数の個別タスクが同じリソースに同時にアクセスしようとします。 各タスクで使用されているチャンネルが異なる場合でも、これらのタスクは同じA/D変換器とサンプルクロックを必要とするため、競合状態が発生します。
- この問題を解決するには、同じタイプの処理をすべて同じタスクにまとめます。DAQmx 7.3以降では、複数のDAQmxチャンネルを作成VIを使用することで、複数のタイプのアナログ入力でもこれを実行できます。
ケース6: タスクを適切にクリアせずに、そのリソースを解放した場合
DAQmxタスクが開始する、あるいは予約またはコミット状態になると、クロック、チャンネル、トリガライン、またはバッファメモリなどのタスクに関連付けられたリソースは、そのタスクにより独占的に使用されます。
これは、以下のいずれかの方法で解決できます。
- タスクの最後にbDAQmxタスクをクリア.viを追加する
- タスクの最後にDAQmxタスクを制御.viを追加し、その動作を予約解除に設定する
ケース 7: 実行中のLabVIEWプログラムで使用中にNI-MAXでタスクを使用しようとした場合
LabVIEWプログラムがDAQmxタスクを実行してデータを集録している場合、このタスクに対応するハードウェアリソースが予約されます。つまり、NI-MAXはこのハードウェアリソースまたはデバイスに同時にアクセスすることはできません。
この競合を防ぐために、LabVIEWプログラムの実行前または実行後、あるいはDAQmxタスクを開始関数が呼び出される前またはDAQmxタスクをクリア関数が呼び出された後の状態でプログラムが停止している間に、NI-MAXのアクションを実行できます。これらの関数は、それぞれハードウェアリソースを予約および解放します。