03-24-2011 11:30 PM
はじめまして。
GPIB-USB-HSに関しての質問です。
今、Excel VBAを使って、計測機器などを自動で動かそうとしているのですが、
1つの動作と1つの動作の間の待機時間に問題があります。
通常、計測機器にやらせたい動作のコマンドを次々と命令していくのですが、
前の動作が完全に終わるまで待たないといけません。
そのため、適度な待機時間を設定しなければならないのですが、
今のところやっている対処法としては
コマンドと次コマンドの間に ”wait_timer(1)” を設けて一定の待機時間を作っています。
しかし、計測機器の型式や機種の違いによって
1つの動作が完全に終わる時間(=待機時間)が異なってくるため、
一度設定しても、また始めから設定しなおさなければいけないので、プログラムの汎用性がないです。
私の考えでは、ただ設定された時間待つのではなく
命令された計測機器がその動作を終えたときに
『終わりました』という信号(?)のようなものを発信し、
それを受け取ったGPIB-USB-HSが次の命令を行うという動作が理想的です。
そこで、質問なのですが
このような動作が可能なのでしょうか?
また、どの部分の設定を変えなければいけないのか?
他に方法があるのか?
など、何か情報をいただければ非常に助かります。
矛盾しているところがあれば、どんどん指摘してください。
文章が稚拙で申し訳ありませんが、よろしくお願いします。
解決済! 解決策の投稿を見る。
03-27-2011 08:07 PM - 編集済み 03-27-2011 08:09 PM
hachi 様
お世話になっております。
恐縮ですが、弊社では VBA 上での NI-GPIB ドライバを使用してのプログラミング、プログラムの動作に関しましては正式なサポートの対象外とさせていただいておりますので予めご了承くださいますようお願いします。
計測器依存ですが、計測器側が GPIB インタフェース内の RQS ラインを使用して PC 側にイベントを返信することができます。詳しくは下記の資料をご参照ください。
よろしくお願いいたします。
03-28-2011 07:48 PM
o.fujioka 様
回答ありがとうございました。
貼っていただいたリンクからSRQについて知り、
自分なりに調べてみました。
おかげでGPIBの深層部分まで知ることが出来ました。
しかし、その分不明な点がいくつも出てきました。
また、SRQととは別で質問の投降後に自分なりに調べていたのですが
”ハンドシェイク通信”という方法がありました。
これも私が行いたい処理に近い動作をするので興味があります。
2つの方法について私が調べたなりの見解は、
SRQはPC(GPIB)上でプログラム設定・処理を行うのに対し、
ハンドシェイク通信はPCと計測機器間でのコマンドのやりとりだと思いました。
なので処理の待機時間のほとんどが0.1秒台のGPIB通信では、
コマンドを計測機器に送るハンドシェイク通信だと
待機コマンド(*WAI,*OPC?)を送る時点で待機時間がかかってしまいあまり意味がないと思いました。
それに比べてSRQだとGPIBでの処理なので、こちらの方が有効だと思うのですが
プロセス(かかる時間 など)としては同じなのでしょうか?
GPIB初心者なのであまり知識がなく、
ハンドシェイク通信に関しては比較的 容易に理解できたのですが、
SRQについては全然わかりません;
長文になり、わかりにくくて申し訳ありませんが
質問をまとめますと
①SRQとハンドシェイク通信の比較(同じなのか?どちらが有効的なのか?)
②SRQについて(特にudとmaskの意味がわかりません;)
③SRQの設定(設定場所や設定方法)
です。質問多くてすいません;
ご回答、お願いします。
05-01-2011 03:05 AM
GPIBを使った事が無いので、的外れだったらすみません。
私が外部機器とのやり取りをする方法(シリアル通信)をザックリトですが載せておきます。
1.PCから外部機器へ動作コマンドを送信
2.PCから外部機器へ状態確認(ステータス)コマンドを送信し
応答内容を確認し、機器が実行状態(RUN,BUSY)になった事を確認(実行中フラグを立てる)
(実行状態が確認できるまでこの動作を繰り返す)
3.PCから外部機器へ状態確認(ステータス)コマンドを送信し
応答内容を確認し、機器が停止状態(動作完了、待機状態)になった事を確認(実行中フラグをクリアする)
(停止状態が確認できるまでこの動作を繰り返す)
4.PCから外部機器へ次の動作コマンドを送ります。
外部機器にステータスを確認するコマンドが用意されていると思うのでそれを使用してみてください。
05-10-2011 06:35 AM
hachi 様
ハンドシェイクまたはフロー制御とは、「これからデータを送信する」「今、データを送信している」「データの受信が終わった」などの制御信号が付随するデータ送受信全般を言います。
例えば USB 1.0 や USB 2.0 はデータ伝送線にデータ信号と共に制御信号も載せて通信します。
GPIB のコネクタは 24 ピンあります。すなわち24本の伝送線があり、その内、ハンドシェイクの制御信号だけを通信する専用の伝送線があります。
*OPC コマンドや *WAI コマンドは GP-IB 独自ではなく、オシロスコープなどの計測器のコマンドがメーカーにより異なっていたのを共通化するために、HP やナショナルインスツルメンツ、テクトロニクスなどの計測器メーカーが結成した SCPI コンソーシアムで決めた SCPI コマンドの1つです。
そのため、GPIB コネクタを持っている装置だからと言って、全ての装置で *OPC コマンドや *WAI コマンドが使えるわけではありません。
SCPI コンソーシアムに加入しているメーカーの装置であれば、*OPC コマンドや *WAI コマンドが使える可能性は高いです。
また、GPIB ではない RS-232C や USB 通信などでも使えることがあります。
*OPC コマンドや *WAI コマンド単独ではハンドシェイクとは言えません。
*OPC? コマンドを送信した後に送られてくるデータを読んで相手の状態を知った後、目的のコマンド送信やデータ受信を行うようなハンドシェイクプログラムを自分で作ることが出来ます。
一方、SRQ はハンドシェイク制御信号で通信が確立された状況で計測器の状態を知るための GPIB の機能の1つです。
まず、コントローラ(今回の場合、PC)は1個または複数の計測器の誰かが SRQ (サービスリクエスト)を発信するのを確認し続けます。
計測器は、コントローラに何かして欲しい時に SRQ を発信します。具体的には SRQ 信号線の電圧を変化させます。
そして、コントローラは誰かが SRQ を発信したことを検出した後、ポーリング(世論調査)を実行します。コントローラは誰かが SRQ を発信したことは知っているのですが、誰が発信したかわからないので、ポーリング(シリアルポールまたはパラレルポール)を実行して、誰が発信したかを確認します。
ポーリングにより SRQ を発信した計測器を特定した後、コントローラは計測器のレジスタなどを確認して状態を知り、処理を実行します。
例えば「データを集めきったので、コントローラにデータを送りたい」という状態であれば、計測器に「データを送れ」というコマンドを送信します。
なお、計測器が例えば「データを集めきった」時に SRQ を発信できるかどうかは計測器の仕様次第です。
*OPC コマンドを使う方法は理解し易いので、プログラムも作り易いです。
しかし、計測器の状態を瞬時に知るためには計測器が忙しいかどうかを確認するコマンドを何度も送り続けることになるので、PCにも計測器にも通信にも負荷がかかります。
計測器も聞かれる度に「忙しいから待って」と返答しなければならないので、計測そのものが邪魔されます。
一方、SRQ は SRQ 信号線に電気が流れ始めたかどうかをPCが確認し続けるだけなので、負荷はPCに多少かかりますが、計測器と通信に負荷はかかりません。
しかも相手(計測器)が1台ではなく、複数台でも同じ仕組みで対応できます。
その代わり、RQS だのシリアルポールだの GPIB 独特の概念を理解しなければ、まともに動作させることはできません。
SRQ 信号の発信を確認し続けるナショナルインスツルメンツが用意した関数として、ibwait があります。
ud は装置の ID 番号です。RS-232C 通信で言えば、COM0 や COM1 の 0 や 1 のことです。
mask は何を待つか設定するパラメーターです。
ibwait(0, SRQI) であれば、PCに接続した0番の(GPIB-USB-HS などの)GPIB コントローラの SRQ ビット(bit 12)がオンされるまで確認し続けます。
前述した手順のように、計測器を1台しか使っていなくても、オンされたことを確認した後、ポーリングを実行しなければなりません。
ibwait(1, RQS) であれば、1番の計測器の RQS ビット(bit 11)がオンされるまで確認し続けます。
これは、計測器が1台しか存在しないなど SRQ を発信する計測器がわかりきっている時にしか使えませんが、オンされると自動的にポーリングを実行してくれます。
mask は通常、ibwait(1, TIMO | RQS) のようにタイムアウトの TIMO も付け加えます。さもないと、エラー発生により SRQ 信号が永遠に発信されない状態になっても SRQ 信号を待ち続けるので、プログラムがフリーズします。
最後に本題の処理に要する時間ですが、計測器や(GPIB コントローラを含む)PCなどの通信処理性能、計測器の台数、通信ケーブルの品質など全てのハードウェア性能に依存するので、誰も答えられないと思います。
以上、ご参考まで。
05-18-2011 06:40 AM
xyzzさん
解決済みのようですが、質問させてください。
現在、私はGPIBによる機器制御を試みています。
xyzzさんが投稿された制御方法を作成しようとしているのですが、うまくいきません。
現状のVIの形としては、while loopの中に状態確認コマンドや機器が実行状態(RUN,BUSY)のコマンドを
作成し、常に機器の状態を表示させています。
ボタンを押したときに2~3の動作を処理したいと考えており、
シーケンスストラクチャ内で「BUSYでないときに次の処理に移行する」というプログラムを作成したのですが、
うまく動作せず、現状では待機関数を使用し、「設定時間待機後に次の処理に移行する」といった、やや強引な方法をとっています。
(実行中フラグを立てる)や(実行中フラグをクリアする)という方法を取りたいのですが、どういった形になるのかご教授願えないでしょうか?
よろしくお願いいたします。
LABVIEWバージョンは8.5を使用しております。
05-22-2011 05:02 AM
2~3のイメージです。
05-23-2011 08:17 AM
手直し、しました。
送信受信.vi 送信コマンド 受信データと比較するデータは
お手持ちの機器に合わせて作成してください。
05-26-2011 11:26 AM
xyzzさん
提示していただいた方法を参考にviを作成し、希望の動作を得ることが出来ました。
迅速かつ丁寧な回答有難うございました。