0

Zaber の LabVIEW ドライバを使用してデバイスを制御すると、コマンドに対して奇妙な応答が返されることがあります。たとえば、Move Absolute コマンドを送信すると、予想される Move Absolute 応答ではなく、Set Target Speed 応答または Manual Move Tracking 応答が返される場合があります。何が原因で、どうすれば回避できますか?

4

1 に答える 1

2

原因

この問題の最も一般的な原因は、Write Command VI を使用してコマンドを送信したが、応答を読み取らなかったことです。その応答は、読み取るまでシリアル ポートの受信バッファに格納されます。後で Request Command VI を使用すると、新しいコマンドが書き込まれ、バッファに残っている古いコマンドからの応答が読み取られます。

応答データ値を使用して計算を実行している場合、コードが混乱する可能性がありますが、移動コマンドを要求している場合はさらに悪化する可能性があります。移動がいつ終了したかを Request Command VI が認識する方法は、デバイスが応答を返すことです。バッファーに既に応答がある場合は、移動がすぐに終了したように見えます。VI は、移動コマンドをスキップしているように見えます。

問題がどのように発生するかを示す誤った例を次に示します。Move Relative コマンドは、Move To Stored Position コマンドが送信される前に終了しません。次の 3 つの例はすべて、Web サイトからダウンロードできます。

誤って処理された応答の配線図

この種の問題を引き起こすもう 1 つの方法は、デバイス番号 0 を使用して複数のデバイスにコマンドを送信し、最初の応答のみを読み取ることです。(各デバイスは独自の応答を送信します。) VI の実行中に手動制御ノブまたはジョイスティックを使用すると、問題が発生する可能性もあります。その動きは、VI が何も送信していないときに一連の応答を生成します。

解決策 1: コマンド VI を要求する

最も簡単な解決策は、すべてのコマンドに対するすべての応答を確実に読み取ることです。各コマンドに Request Command VI を使用すると、ほとんどの状況を適切に処理できます。

これは、現在 Request Command VI を使用している前のサンプルの修正バージョンです。

正しく処理される応答の配線図

デバイス番号 0 を使用してすべてのデバイスにコマンドを送信する場合は、待機する応答の数を認識できるように、応答カウントを調整する必要があります。

2つのデバイスを同時に移動するなどのより複雑なシナリオでは、Write Command VIをBlocking Read Response VIと組み合わせて使用​​して、すべての応答を確実に受け取ることができます。詳細については、同時リクエストの例を参照してください。

VIの実行中に手動制御ノブまたはジョイスティックを使用している場合、この解決策は役に立ちません。

解決策 2: バッファをクリアする

すでに多数の書き込みがある複雑な VI があり、それらをすべてクリーンアップしたくない場合や、VI の実行中に手動制御ノブまたはジョイスティックを使用したい場合があります。何らかの理由で、応答パターンを完全には予測できない可能性があります。バッファ内に余分な応答を取得することを避けられない場合は、狂気が終わったときにそれらを一掃できます。応答を読み取るVI(ブロックするVIではなく)を使用して、応答が見つかるまで読み取りを続けます。

これは、バッファをクリアする同じ例です。10 秒間一時停止するので、手動コントロール ノブを使用して追加の応答を生成できます。

バッファからクリアされた応答の配線図

この解決策の 1 つの秘訣は、狂気がいつ終わったかを知ることです。デバイスが移動していないことが理想的であり、バッファのクリアを開始する前に少なくとも 20 ミリ秒待機する必要があります。これにより、デバイスが最後のコマンドを処理して応答を送信する時間が与えられます。デバイスがまだ動いている場合は、最終的に終了したときに追加の応答が返されます。

解決策 3: ステート マシン

VI が非常に複雑または予測不可能な場合、ステート マシン パターンは堅牢なアプローチになる可能性があります。各要求をその応答と密接に結びつける代わりに、VI はグローバルな状態を追跡し、各応答を個別に処理します。別の例については、 Zaber のWrite Commands and Read Responses VI を参照してください。

このアプローチは、コマンドを送信する並列ループがある場合にも役立ちます。シリアル ポートから同時に 2 つのループを読み取ることはできません。

于 2012-05-11T18:25:01.040 に答える