6. 測定同期

測定同期は、リモート制御アプリケーションを作成する際に考慮すべき最も重要なポイントの1つです。プログラムのこの側面を無視すると、予測できない動作や再現性のない結果が生じ、多くの面倒を引き起こす可能性があります。測定同期が不適切であることを示す明確な徴候の1つは、一定の長さの休止を挿入しないとアプリケーションが動作しないことです。

最初に、この章での測定同期の意味を定義しておきましょう。

今日の測定機器は複雑なデバイスであり、固有のオペレーティングシステムを搭載しています。測定アプリケーションから測定器のステータスを常時把握しておく必要はありません。測定同期は、プログラムの重要なポイント(同期ポイント)で、測定器が期待している状態にあることを確認する方法です。

次に示すのは、オシロスコープと非周期的信号を発生するDUTの場合の測定同期の例です。

CH6_MeasSyncWithScope_16x9.png

上の図では、測定器が追いつくのを待つために、プログラムにアイドルセクションが設けられています。これらのアイドル時間の長さが動的に変わることに注目してください。これらは、さまざまな条件(PCの速度、測定器のセトリング/収集時間の違いなど)に適応させる必要があります。そのためにはどうすればいいでしょうか。最善の方法は、準備ができたときに測定器に知らせてもらうことです。以下の注記の後で、さまざまな同期方法を紹介します。

追加の注記:

  • 測定機器(オシロスコープ、スペクトラム・アナライザ、パワーメータなど)は必ずシングル捕捉モードで動作させてください。これは、1つ前の収集やまだ完了していない収集の結果ではなく、完了した最新の収集による測定結果を常に取得するためです。最も重要なこととして、あらゆる同期方法は、シングル捕捉モードでのみ正しく動作します。
  • 基本設定とトリガ設定は同期させる必要はありません。重要なポイントは、最後にすべての設定が適用されたことを確認するところ(同期ポイント「設定適用済み」)だけです。
  • トリガが到着すると、オシロスコープは波形収集を開始します。プログラムは収集が完了するまで待つ必要があります(同期ポイント「収集完了」)。
  • この同期ポイントの後で波形を読み取れば、必ず最新の収集による結果が得られます。

同期メカニズムの概要

この後の4つの章では、次の各種の同期メカニズムを、簡単なものから難しいものへという順序で紹介します。

  • *OPC?問い合わせ
  • ステータスバイト(STB)ポーリング
  • サービスリクエスト(SRQ)待ち
  • サービスリクエスト(SRQ)イベント

*OPC?問い合わせ同期

これは最も簡単で最も頻繁に用いられる同期方法です。

問い合わせ*OPC?を測定器に送信すると、測定器は実行中のすべての動作が完了してから応答を返します。このため、プログラムはVISA読み取り操作でアイドル期間に入り、測定器が*OPC?問い合わせに応答するのを待ちます。この場合、重要なのは応答そのものではなく、応答が返されるまでの遅延です。

重要:*OPC?は問い合わせなので、必ずVISA Read()関数を使って測定器からの応答を読み取る必要があります。そうしないと、次の問い合わせの際に、測定器で 'Query Interrupted' エラーが発生します。これは*OPC?問い合わせだけでなく、すべての問い合わせの際に重要です。

ここで、もう1つのパラメータについて述べておく必要があります。それはVISAタイムアウトです。VISAタイムアウトは、VISA読み取り操作の最大待ち時間を定義するメカニズムを提供します。この時間を過ぎると、操作はVISAタイムアウトエラーで終了します。この値は個々のケースで異なり、現在の作業の継続時間に依存するので、VISAタイムアウトを適切に設定する必要があります。タイムアウトが小さすぎると、正常な動作の際に不要なエラーが発生する可能性があり、タイムアウトが大きすぎると、実際にエラーが起きたときにプログラムが応答しなくなる可能性があります。

利点:

  • シンプルでほとんどの場合に有効。
  • セッションの制御チャネルを使用しない(STBポーリング方法を参照)ので、RawSocketおよびシリアル接続でも使用可能。

欠点:

  • 測定器が応答するまで通信がブロックされる。これは長時間の動作の場合に重大な問題になることがあります。アプリケーションが応答しなくなるからです。

ステータスバイト(STB)ポーリング同期

この方法は、ローデ・シュワルツの測定器ドライバーで用いられています。直接SCPIコマンドを使用する場合、この章の最後にある実装例を参照してください。最初に、手順を示すフローチャートを見てみましょう。説明は後に記されています。

フローチャートを理解するには、測定器のステータスサブシステムについて知る必要があります。これはレジスタの階層構造であり、最上部にある主要なものはステータスバイトSTBと呼ばれています。これは、IEEE 488.2規格で定義されている8ビットのレジスタです。このレジスタは各ビットが異なる意味を持ち、ステータスレジスタの階層チェーンの下のほうにあるレジスタ群のサマリーフラグの役割を果たします。ステータスサブシステム構造の全体は、ローデ・シュワルツ測定器のリモート制御ユーザ・マニュアルに記載されています(「ステータスバイト」で検索してください)。次の図には、ステータスバイトレジスタと、もう1つのレジスタであるイベントステータスレジスタESR)が示されています。

  • フローチャートの最初の操作では、ESEフィルターを1に設定します(ビット0=1)。これは、関心があるのがESRビット0 - OPCだけだという意味です。このコマンドは、接続を初期化するか*RSTコマンドを送信した後で、1回だけ送信する必要があります。
  • 次の操作では、ESRレジスタの値を、*ESR?コマンドで問い合わせます。このレジスタはイベントレジスタであり、読み取ると値はクリアされます。これにより、ESRビット0 - OPCは0にリセットされます。
  • 次の操作では、同期するコマンドを送信します。この場合はSCPIコマンドSINGであり、オシロスコープをシングル収集向けにアーミングします。*OPC(疑問符なし)を文字列の最後に付けると、測定器は、文字列内のすべてのコマンドが実行され、完了した後で、ESRビット0 - OPCを1に設定します。そのために、前もってこのビットを0にリセットする必要があったのです。そうしないと、前のアクションのどれかでこのビットが1に設定されていたために、STBポーリングループが最初の反復で終了してしまう可能性があります。
  • 次の操作は、ステータスバイトのポーリングループです。ステータスバイトの問い合わせを、ビット5 - イベントステータスサマリーが1に設定されるまで繰り返します。ステータスバイトの値を取得するには2つの方法があります。1つはSCPIコマンド*STB?で、もう1つは特別なVISA関数ReadSTB()です。その違いは何でしょうか。*STB?は標準のSCPIコマンドで、VISA I/Oバッファーを使用します。関数ReadSTB()は、制御チャネルと呼ばれる別のチャネルで通信するので、標準SCPIの書き込み/読み取り通信に干渉しません。さらにこの関数は、応答時間が短くなるように最適化されています。このループ内には、順次増加するポーリング遅延を置くことを推奨します。例えば、最初の10回は遅延なし、次の100回は1 msの遅延、次の1000回は10 msの遅延というようにします。無限ループを避けるため、ローデ・シュワルツの測定器ドライバーは、OPCタイムアウトと呼ばれる遅延を使用しています。
  • ループが終了すると、ESRビット0 - OPCは再び次のSCPIコマンドによってリセットされます:*ESR?

利点:

  • 測定器との通信をブロックしない。並行してSCPIコマンドを送信し、応答を受信できます。
  • 長時間の動作に適しています。例えば、セルフアライメントやセルフテストなどです。

欠点:

  • 実装が複雑になる。
  • RawSocketおよびシリアル接続では、制御チャネル関数VISA ReadSTB()がサポートされないため、動作しない。

サービスリクエスト(SRQ)を使用した高度な方法

サービスリクエスト(SRQ)待ち同期

この方法は、前のステータスバイトポーリング同期と似ていますが、STBポーリングループの代わりに、VISA WaitOnEvent()関数を使用してサービスリクエストイベントを待ちます。このタイプの同期の例は、この章の最後に示しています。

このメカニズムを使用するには、次の操作を行う必要があります。

  • リセット後に1回だけの設定*ESE 1;*SRE 32を実行します(前の機器ステータスサブシステムレジスタの図を参照)。これにより、STBポーリングによる前の同期方法と同様に、ESEフィルターがESR OPCビットに反応するように設定されます。"*SRE 32" は、SREフィルターを、STBレジスタのイベントステータスサマリービットが1に設定された場合にサービスリクエストを発生するように設定します。
  • 同期するコマンドを送信する前に、サービスリクエストイベントをVISA EnableEvent()関数で有効にします。
  • 同期するコマンドを、最後に;*OPCを付けて送信します。
  • VISA WaitOnEvent()関数を呼び出します。これは、サービスリクエストイベントが到着するか、タイムアウトが発生するまで待ちます。
  • サービスリクエストイベントをVISA DisableEvent()関数で無効にします。

利点:

  • 前の方法に比べて、STBポーリングループの実装が不要。
  • IOトレースが短くて読みやすくなる。

欠点:

  • LabVIEWとMATLABのアプリケーションは、VISA WaitOnEvent()の実行中には中断できない。これは、実行に長時間かかるコマンドの場合に問題になることがあります。例:セルフテスト問い合わせ*TST?
  • RawSocketおよびシリアル接続ではサポートされない。

サービスリクエスト(SRQ)イベント同期

この方法では、測定器の作業を開始した後、何か別の処理を行うことができます。測定器の作業が完了すると、あらかじめ選択した関数がVISAによって実行されます。この関数はイベントハンドラーと呼ばれます。

このタイプの同期のC#とLabWindows/CVIでの例は、この章の最後に示しています。

サービスリクエストイベント同期メカニズムを使用するには、次の操作を行う必要があります。

  • リセット後に1回だけの設定*ESE 1;*SRE 32を実行します(前の機器ステータスサブシステムレジスタの図を参照)。これにより、STBポーリングによる前の同期方法と同様に、ESEフィルターがESR OPCビットに反応するように設定されます。*SRE 32は、SREフィルターを、イベントステータスサマリービットSTBレジスタ)が1に設定されたときにサービスリクエストを発生するように設定します。
  • 同期するコマンドを送信する前に、コールバック関数をVISA InstallHandler()関数で登録し、サービスリクエストメカニズムをVISA EnableEvent()関数で有効にする必要があります。
  • 同期するコマンドを、最後に;*OPCを付けて送信します。コマンド実行が終了すると、登録した関数がVISAによって呼び出されます。

利点:

  • 他の作業を並列に実行できる。
  • マルチスレッドアプリケーションに最適。

欠点:

  • 実装が複雑になる。
  • RawSocketおよびシリアル接続ではサポートされない。
  • LabVIEWおよびMATLABではサポートされない。

直接SCPIコマンドの例

前述の測定作業を、*OPC? 問い合わせ同期と次の方法の組み合わせによって実行する例:

  • STBポーリング同期
  • サービスリクエスト待ち同期
  • サービスリクエストイベント同期(Python、C#、LabWindows/CVI)

測定器ドライバーの例

前述の測定作業の例:

リクエスト情報

ご質問や詳細な情報のご要望などがございましたら、こちらのフォームよりお気軽にお問い合わせください。担当者よりご連絡させていただきます。

マーケティング・パーミッション

お問い合わせ内容が送信されました。 後ほどご連絡致します。
An error is occurred, please try it again later.