- ベストアンサー
GP-IB制御について
現在、VB6.0を使用して Agilent社の53132Aという計測器を使用して周波数の値を取得する プログラムを作成しているのですが、計測器が表示している計測値を取得したいのですが取得する方法がわからず困っております。 どのように取得するのかご存知でしたら教えて下さい。
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
No10の訂正 なんか訂正文がセットに・・・・ ----------------------------------------------- ●MEASUREコマンドでレンジの指定方法 50MHzが測定出来るレンジで分解能が1Hz "MEASURE:SCALAR:VOLTAGE:FREQUENCY? 50 MHZ, 1 HZ, (@1)" 省略型 "MEASURE:FREQ? 50 MHZ, 1 HZ, (@1)" 20MHzが測定出来るレンジで分解能が0.1Hz ←▲訂正▲ "MEASURE:SCALAR:VOLTAGE:FREQUENCY? 20 MHZ, .1 HZ, (@1)" "MEASURE:FREQ? 20 MHZ, .1 HZ, (@1)" 20MHzが測定出来るレンジで分解能が0.01Hzz ←▲訂正▲ "MEASURE:SCALAR:VOLTAGE:FREQUENCY? 20 MHZ, .01 HZ, (@1)" "MEASURE:FREQ? 20 MHZ, .01 HZ, (@1)" ●CONFIGUERコマンドでレンジの指定方法 50MHzが測定出来るレンジで分解能が1Hz "CONFIGUER:FREQUENCY 50 MHZ, 1 HZ, (@1)" "CONF:FREQ 50 MHZ, 1 HZ, (@1)"
その他の回答 (10)
- uruz
- ベストアンサー率49% (417/840)
なんだか、だんだん深みにはまって・・・・・ また、誤らねば・・スペル間違いです CONFIGUER → CONFIGURE 前回のコードをもう一度試してください 「回答のお礼」の(4)の場合↓のようにMEASUREの後にも読み込みが必要です 【参考:"?"が付くコマンドは「問い合わせコマンド」ですから、送信後は必ず受信しなくてはなりません】 Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "MEASURE:SCALAR:VOLTAGE:FREQUENCY? (@1)") szBuff = String(256, &H0) iRet = PCIGPIBAX.gpred(GpAdrsBuf, szBuff, Len(szBuf) iRet = PCIGPIBAX.gpwrt(GpAdrsBuf, "FETCH: FREQ?") szBuff = String(256, &H0) iRet = PCIGPIBAX.gpred(GpAdrsBuf, szBuff, Len(szBuf) ----------------------------------------------- ●MEASUREコマンドでレンジの指定方法 50MHzが測定出来るレンジで分解能が1Hz "MEASURE:SCALAR:VOLTAGE:FREQUENCY? 50 MHZ, 1 HZ, (@1)" 省略型 "MEASURE:FREQ? 50 MHZ, 1 HZ, (@1)" 20MHzが測定出来るレンジで分解能が0.11Hz "MEASURE:SCALAR:VOLTAGE:FREQUENCY? 20 MHZ, .1 HZ, (@1)" "MEASURE:FREQ? 20 MHZ, .1 HZ, (@1)" 20MHzが測定出来るレンジで分解能が0.011Hz "MEASURE:SCALAR:VOLTAGE:FREQUENCY? 20 MHZ, .01 HZ, (@1)" "MEASURE:FREQ? 20 MHZ, .01 HZ, (@1)" ●CONFIGUERコマンドでレンジの指定方法 50MHzが測定出来るレンジで分解能が1Hz "CONFIGUER:FREQUENCY 50 MHZ, 1 HZ, (@1)"
- uruz
- ベストアンサー率49% (417/840)
No8 の訂正 (@1)の前のスペースが抜けてしまいました × '測定項目を指定 Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "CONFIGUER:FREQUENCY(@1)") ○ '測定項目を指定 Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "CONFIGUER:FREQUENCY (@1)")
お礼
ご連絡が大変遅くなりまして申し訳ございません。 ご回答ありがとうございます。 早速、確認してみました。 (1) Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "CONFIGUER:FREQUENCY (@1)") iRet = PCIGPIBAX.gpwrt(GpAdrsBuf, "FETCH: FREQ?") szBuff = String(256, &H0) iRet = PCIGPIBAX.gpred(GpAdrsBuf, szBuff, Len(szBuf) 結果:タイムアウトになり値を取得出来ませんでした。 (2) Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "CONFIGUER:FREQUENCY (@1)") iRet = PCIGPIBAX.gpwrt(GpAdrsBuf, "READ: FREQ?") szBuff = String(256, &H0) iRet = PCIGPIBAX.gpred(GpAdrsBuf, szBuff, Len(szBuf) 結果:タイムアウトになり値を取得出来ませんでした。 (3) Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "MEASURE:SCALAR:VOLTAGE:FREQUENCY? (@1)") '<1> iRet = PCIGPIBAX.gpwrt(GpAdrsBuf, "READ: FREQ?") szBuff = String(256, &H0) iRet = PCIGPIBAX.gpred(GpAdrsBuf, szBuff, Len(szBuf) 結果:タイムアウトになり値を取得出来ませんでした。 (4) Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "MEASURE:SCALAR:VOLTAGE:FREQUENCY? (@1)") iRet = PCIGPIBAX.gpwrt(GpAdrsBuf, "FETCH: FREQ?") szBuff = String(256, &H0) iRet = PCIGPIBAX.gpred(GpAdrsBuf, szBuff, Len(szBuf) 結果:タイムアウトになり値を取得出来ませんでした。 (5) Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "MEASURE:SCALAR:VOLTAGE:FREQUENCY? (@1)") '<1> szBuff = String(256, &H0) iRet = PCIGPIBAX.gpred(GpAdrsBuf, szBuff, Len(szBuf) 結果:値は取得出来ましたが、<1>通過時点で表示の値が先日連絡した内容に変化する。 と言った結果になりました。
- uruz
- ベストアンサー率49% (417/840)
>値は取得できるようになりました。 あ~~よかった "MEASURE" は測定コマンドですからコマンドを受けた時点で再測定され結果が戻されるのだと思います "MEASURE:SCALAR:VOLTAGE:FREQUENCY? (@1)") の代わりに "READ: FREQ?" または "FETCH: FREQ?" ←たぶんこっちかな? を試してください ただし最初の測定は "MEASURE:SCALAR:VOLTAGE:FREQUENCY? (@1)") で測定を行うか "CONFIGUER:FREQUENCY(@1)" で測定項目を指定しておく必要があると思われます MEASUREを使用する場合はダミーの読み込みが必要 CONFIGUER戻り値はありませんのでダミーの読み込みはいりません 測定数値についてですが、よく解りません たぶん測定レンジが変わってしまったのではないかと思うのですが 如何でしょうか? 測定後53131Aのパネルで確認してください もし測定レンジが変わっているなら初期化で行っている Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "*RST") を外してみてください(たぶんこれだと) デバッグポイントを設定するなどしてどの時点で変化するか調べるといいでしょう ---------------------------------------------- 説明わかりやすくするためデータ読み込みをファクション・プロシージャに分けました '//////////////////////////////////////////////////// Dim szBuf As String MyGpibAdrs = 1 GpAdrsBuf = 3 Status = 0 Status = PCIGPIBAX.gpinit(MyGpibAdrs, 0, 0) If Status <> 0 Then Error.Text = "PCIGPIBAX.gpinit()エラー :" & Status Exit Sub End If ' タイムアウト設定 Status = PCIGPIBAX.gptmout(1) If Status <> 0 Then Error.Text = "PCIGPIBAX.gptmout()エラー :" & Status Exit Sub End If 'デリミタの設定 Call PCIGPIBAX.gpdelm("b", &HA00) '▲変更▲ 送・受信ともCR+LF+EOI '--------------------------------------------------- ' IFCラインをTRUEにする Status = PCIGPIBAX.gpcli() If Status <> 0 Then Error.Text = "PCIGPIBAX.gpcli()エラー :" & Status Exit Sub End If ' RENラインをTRUEにする Status = PCIGPIBAX.gpren() If Status <> 0 Then Error.Text = "PCIGPIBAX.gpren()エラー :" & Status Exit Sub End If ' 53131Aの初期化 'Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "*RST") 'Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "*CLS") 'Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "*SRE 0") 'Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "*ESE 0") 'Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "*:STAT:PRES") '測定項目を指定 Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "CONFIGUER:FREQUENCY(@1)") '読み込み szBuf = GetOneData() ' ↓ ' ↓ szBuf = GetOneData() ' ↓ ' ↓ szBuf = GetOneData() ' ↓ ' ↓ szBuf = GetOneData() ' ↓ ' ↓ 'リモートの解除 Status = PCIGPIBAX.gplcl(GpAdrsBuf) '///////////////////////////////////////////// '///////////////////////////////////////////// '周波数を読み込む-------------------------- Private Function GetOneData() as String Dim szBuff As String Dim iRet as Integer Const MyGpibAdrs = 1 Const GpAdrsBuf = 3 Const Status = 0 '読み込み iRet = PCIGPIBAX.gpwrt(GpAdrsBuf, "FETCH: FREQ?") szBuff = String(256, &H0) iRet = PCIGPIBAX.gpred(GpAdrsBuf, szBuff, Len(szBuff)) 'イミディェイト・ウインドウに表示 Debug.Print szBuff,cSng(szBuff) GetOneData = szBuff End Function
- uruz
- ベストアンサー率49% (417/840)
あれ~ これでいけると思ったんですが・・・ ":MWASURE:SCALAR:VOLTAGE:FREQUENCY? (@1)" の先頭の":"を取り除いてみてくださ "MWASURE:SCALAR:VOLTAGE:FREQUENCY? (@1)" また省略型もためして見てください "MWAS:FREQ? (@1)" とここまで書いて気づいたコピペを繰り返してたので 「ごめん」スペルが違うWとE × "MWASURE" ○ "MEASURE" "MEAS:FREQ? (@1)" "MEASURE:SCALAR:VOLTAGE:FREQUENCY? (@1)" ------------------------------------------------- ↑↑↑これでいけると思うけど もしだめなら 53131Aのインターフェイスを初期化して見ましょう 下記の5つのコマンドを"*REN"の後"MEASURE・・・・"の前に入れてください ' 53131Aの初期化 Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "*RST") Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "*CLS") Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "*SRE 0") Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "*ESE 0") Status = PCIGPIBAX.gpwrt(GpAdrsBuf, ":STAT:PRES") そしてここまでがREX-PCI20と53131Aの初期化とまります Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "MEASURE:SCALAR:VOLTAGE:FREQUENCY? (@1)") ・ ・ ・ ・ ・
お礼
早急なご回答ありがとうございました。 スペル間違い気が付かず大変申し訳ございませんでした。 先頭の:を削除して確認した所、値は取得できるようになりました。 ありがとうございます。 ただ、 Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "MEASURE:SCALAR:VOLTAGE:FREQUENCY? (@1)") をコールした後、機器の画面に出ている値がリセットされた後、 それまで、 15.999,931,94みたな表示が16.00って表示になり 取得した値が+1.600E+007ってなります。 出来れば15.999,931,94の値で取得したいのですが出来ないのでしょうか?
- uruz
- ベストアンサー率49% (417/840)
>*IDNを送信した時、結果が『HEWLETT-PACKARD,53131A,0,4806』と返ってきました。 通信はOKですね 結果を見ると機種は 53132A ではなく 53131A のようですね ●通信の設定はIFC実行前に済ませます ●デリミタ設定で &H400 は「デリミタなし」です 「CR+LF」なら &H200 です 通常は「CR+LF+EOI」を使用します、設定値は &HA00 です 53132Aのマニュアルを再度見てみました チャンネルがCH1~CH3と3つあるようですね ":MWASURE:SCALAR:VOLTAGE:FREQUENCY?" でチャンネル指定が必要なようです CH1 の場合 ":MWAS:FREQ?" (@1)" と指定します CH2→(@2) CH3→(@3) これでど~だ! 参考------------------------------- ":MWAS:FREQ?" (@1)" で読む以外に下記でも読めそうです ● "CONF:FREQ (@1)" 'CH1の周波数を指定 ":EVENT1:LEVEL 0.05" 'トリガレベルを 50mVに設定(必要なら) "READ?" '読み込み ● "FUNC 'FREQ 1'" "READ: FREQ?" --------------------------------- '//////////////////////////////////////////////////// Dim szBuf As String MyGpibAdrs = 1 GpAdrsBuf = 3 Status = 0 Status = PCIGPIBAX.gpinit(MyGpibAdrs, 0, 0) If Status <> 0 Then Error.Text = "PCIGPIBAX.gpinit()エラー :" & Status Exit Sub End If ' タイムアウト設定 Status = PCIGPIBAX.gptmout(1) If Status <> 0 Then Error.Text = "PCIGPIBAX.gptmout()エラー :" & Status Exit Sub End If 'デリミタの設定 Call PCIGPIBAX.gpdelm("b", &H400) '送・受信ともCR+LF '--------------------------------------------------- ' IFCラインをTRUEにする Status = PCIGPIBAX.gpcli() If Status <> 0 Then Error.Text = "PCIGPIBAX.gpcli()エラー :" & Status Exit Sub End If ' RENラインをTRUEにする Status = PCIGPIBAX.gpren() If Status <> 0 Then Error.Text = "PCIGPIBAX.gpren()エラー :" & Status Exit Sub End If Status = PCIGPIBAX.gpwrt(GpAdrsBuf, ":MWASURE:SCALAR:VOLTAGE:FREQUENCY? (@1)") ' Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "*IDN?") szBuf = String(256, &H0) Status = PCIGPIBAX.gpred(GpAdrsBuf, szBuf, Len(szBuf)) 'イミディェイト・ウインドウに表示 Debug.Print szBUF 'リモートの解除 Status = PCIGPIBAX.gplcl(GpAdrsBuf) '-------------------------------------------------- 以上
お礼
早急なご回答ありがとうございます。 機種は 53132A ではなく 53131A でした。 大変申し訳ございませんでした。 早速上記のプログラムで実行してみましたが結果はタイムアウトしてしまい値は取得できませんでした。 参考の部分に記載して頂いた内容確認しましたが結果は同じでした。 何か根本的に間違えてるのでしょうか・・・。
- uruz
- ベストアンサー率49% (417/840)
No4の回答の訂正 ●REM(リモート)のスペルを訂正 × Status = PCIGPIBAX.gprem() ○ Status = PCIGPIBAX.gpren() ●"*IDN?"コマンドでのコードの追加 Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "*IDN?") szBuf = String(256, &H0) Status = PCIGPIBAX.gpred(GpAdrsBuf, szBuf, Len(szBuf)) ------------------------------------------------- ●GP-IBカード初期化に続き必要であれば設定もしてください gpinit(・・・) '←初期化 gptmout(・・・) '←タイムアウト時間の設定 gptdelm(・・・) '←デリミタとEOIの設定
お礼
ご回答ありがとうございました。 早速上記の内容でプログラムを作成してみました。 *IDNを送信した時、結果が『HEWLETT-PACKARD,53131A,0,4806』と返ってきました。 ただ、周波数の値を取得したいので、 先日教えていただいたコマンドを使用して値を取得してみたのですが、 タイムアウトで取得できませんでした。 何か方法がおかしいのでしょうか? もしご存知でしたらご教示いただけないでしょうか? お手数お掛けしますがよろしくお願い致します。 Status = PCIGPIBAX.gpwrt(GpAdrsBuf, ":MWASURE:SCALAR:VOLTAGE:FREQUENCY?") Dim szBuf As String MyGpibAdrs = 1 GpAdrsBuf = 3 Status = 0 Status = PCIGPIBAX.gpinit(MyGpibAdrs, 0, 0) If Status <> 0 Then Error.Text = "PCIGPIBAX.gpinit()エラー :" & Status Exit Sub End If ' IFCラインをTRUEにする Status = PCIGPIBAX.gpcli() If Status <> 0 Then Error.Text = "PCIGPIBAX.gpcli()エラー :" & Status Exit Sub End If ' RENラインをTRUEにする Status = PCIGPIBAX.gpren() If Status <> 0 Then Error.Text = "PCIGPIBAX.gpren()エラー :" & Status Exit Sub End If ' タイムアウト設定 Status = PCIGPIBAX.gptmout(1) If Status <> 0 Then Error.Text = "PCIGPIBAX.gptmout()エラー :" & Status Exit Sub End If Call PCIGPIBAX.gpdelm("b", &H400) '送・受信ともCR+LF Status = PCIGPIBAX.gpwrt(GpAdrsBuf, ":MWASURE:SCALAR:VOLTAGE:FREQUENCY?") ' Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "*IDN?") szBuf = String(256, &H0) Status = PCIGPIBAX.gpred(GpAdrsBuf, szBuf, Len(szBuf)) Status = PCIGPIBAX.gplcl(GpAdrsBuf)
- uruz
- ベストアンサー率49% (417/840)
REX-PCI20、53132Aは使ったことないのですが・・・ また、マニュアルを斜めにしか見ていないので間違いがあったら「ごめんなさい」 ●確認事項 ■53132A機器本体の設定はできてますか? 通信モード、機器アドレス、デリミタ、EOIなど ■GP-IBカード設定および gpinit(・・・) による初期化 この段階ではまだコマンドを送信できません 最初に IFC(インターフェイス・クリア)を実行します このIFCでPCがコントローラ(親分)である事を各機器に宣言します Status = PCIGPIBAX.gpcli() '最初に一回だけ 次に REM(リモート)を実行し各機器(53132A)をリモートモードにします Status = PCIGPIBAX.gprem() '最初に一回だけ これで53132Aにコマンドが送信できるようになります なお、REM(リモート)中は各機器(53132A)本体はロックされパネル操作は出来なくなります 試しに下記実行してみれください 53132Aの機器情報が帰って来るはずです Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "*IDN?") Status = PCIGPIBAX.gpred(GpAdrsBuf, szBuf, Len(szBuf)) なお、計測終了後はLCL(ローカル)でREM(リモート)を解除しパネル操作が出来るようにします Status = PCIGPIBAX.gplcl("") ●REX-PCI20に通信テスト用のプログラムが付属していれば試して見てください設定が悪いのかプログラムが間違ってるのか判断できます また、サンプル・プログラムが付属してるならじっくり眺めてください 手順なと参考になります
- uruz
- ベストアンサー率49% (417/840)
>『:MWASure[:SCALar][:VOLTage]:FREQuency?』って送れば... [ ]内は省略可能を表しています また小文字も省略可能です、小文字部分を省略しない場合は全て大文字で記します 以下の例のどれでも可です :MWASURE:SCALAR:VOLTAGE:FREQUENCY? :MWASURE:SCALAR:FREQUENCY? :MWASURE:VOLTAGE:FREQUENCY? :MWASURE:FREQUENCY? :MWAS:SCAL:VOLT:FREQ? :MWAS:FREQ? なお、コマンドを送っただけでは値が取得は出来ませんので GP-IBの送信後、受信動作を行います
お礼
早速のご回答ありがとうございます。 早速上記の内容を送ってみたのですが、 受信動作をしてもタイムアップしてしまい取得できない状態です。 ちなみにGPIBボードはラトックシステム株式会社のREX-PCI20という製品を使用しております。 ちなみに以下のようなプログラムで取得しようとしてますが gpredの関数で戻り値がタイムアップとなってしまいます。 Status = PCIGPIBAX.gpwrt(GpAdrsBuf, ":MWASURE:SCALAR:VOLTAGE:FREQUENCY?") wait(1000)'1秒またせる Status = PCIGPIBAX.gpred(GpAdrsBuf, szBuf, Len(szBuf))
- uruz
- ベストアンサー率49% (417/840)
マニュアル「プログラミング ガイド」の コマンド リファレンス4-63 に書かれてますけど :MWASure[:SCALar][:VOLTage]:FREQuency? なお、英語/日本語の「プログラミング ガイド」は下記より入手できます。 http://www.home.agilent.com/agilent/techSupport.jspx?cc=JP&lc=jpn&nid=-536902438.536880944&pid=1000001386%3Aepsg%3Apro&pageMode=MN
お礼
ご回答ありがとうございます。 早速、資料を確認しましたが、値を取得することが出来ませんでした・・・ GP-IBにコマンドで『:MWASure[:SCALar][:VOLTage]:FREQuency?』って送れば値が取得できるわけでは無いのでしょうか? 何も判っておらずすいません・・・。
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
独特な機器で利用方法がわからない場合は、掲示板で質問を行うより、その機器を扱う販売代理店に問い合わせる方が、良いと思いますよ。 経験上、大抵の代理店はサンプルPGを用意しております。 それ以前に、私の場合機器選定の際、サンプルも資料も用意していない機器を選びません。 製品が海外製でも日本の代理店購入であれば、通常は代理店がいろいろ答えてくれます。 一度、問い合わせることをお勧めします。
お礼
ご回答ありがとうございます。 確かに代理店に問い合わせるのがいいですよね。 早速、代理店に問い合わせをしてみます。
お礼
ご回答誠にありがとうございました。 早速、教えて頂いた内容で確認し、私が取得したい値が取得する事が 以下のプログラムで出来ました。まことにありがとうございました。 以下にプログラムの抜粋を記載します。 '測定項目を指定 Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "MEASURE:SCALAR:VOLTAGE:FREQUENCY? 20 MHZ, .1 HZ, (@1)") get_data = GetOneData '周波数を読み込む-------------------------- Private Function GetOneData() As String Dim szBuff As String Dim iRet As Integer Const MyGpibAdrs = 1 Const GpAdrsBuf = 3 Const Status = 0 Wait (1000) '1sec待ち szBuff = String(256, &H0) iRet = PCIGPIBAX.gpred(GpAdrsBuf, szBuff, Len(szBuff)) GetOneData = szBuff End Function