こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

GP-IB制御について

現在、VB6.0を使用して
Agilent社の53132Aという計測器を使用して周波数の値を取得する
プログラムを作成しているのですが、計測器が表示している計測値を取得したいのですが取得する方法がわからず困っております。
どのように取得するのかご存知でしたら教えて下さい。

投稿日時 - 2010-01-27 18:49:45

QNo.5627883

すぐに回答ほしいです

質問者が選んだベストアンサー

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)"

投稿日時 - 2010-02-01 23:09:28

お礼

ご回答誠にありがとうございました。
早速、教えて頂いた内容で確認し、私が取得したい値が取得する事が
以下のプログラムで出来ました。まことにありがとうございました。
以下にプログラムの抜粋を記載します。

'測定項目を指定
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

投稿日時 - 2010-02-02 08:54:05

ANo.11

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(11)

ANo.10

なんだか、だんだん深みにはまって・・・・・

また、誤らねば・・スペル間違いです
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)"

投稿日時 - 2010-02-01 22:58:42

ANo.9

No8 の訂正

(@1)の前のスペースが抜けてしまいました

×
'測定項目を指定
Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "CONFIGUER:FREQUENCY(@1)")


'測定項目を指定
Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "CONFIGUER:FREQUENCY (@1)")

投稿日時 - 2010-01-29 18:52:27

お礼

ご連絡が大変遅くなりまして申し訳ございません。

ご回答ありがとうございます。
早速、確認してみました。

(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>通過時点で表示の値が先日連絡した内容に変化する。

と言った結果になりました。

投稿日時 - 2010-02-01 11:15:53

ANo.8

>値は取得できるようになりました。

あ~~よかった

"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

投稿日時 - 2010-01-29 18:45:26

ANo.7

あれ~ これでいけると思ったんですが・・・

":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)")
   ・
   ・
   ・
   ・
   ・

投稿日時 - 2010-01-29 14:45:56

お礼

早急なご回答ありがとうございました。
スペル間違い気が付かず大変申し訳ございませんでした。
先頭の:を削除して確認した所、値は取得できるようになりました。
ありがとうございます。

ただ、
Status = PCIGPIBAX.gpwrt(GpAdrsBuf, "MEASURE:SCALAR:VOLTAGE:FREQUENCY? (@1)")
をコールした後、機器の画面に出ている値がリセットされた後、
それまで、
15.999,931,94みたな表示が16.00って表示になり
取得した値が+1.600E+007ってなります。
出来れば15.999,931,94の値で取得したいのですが出来ないのでしょうか?

投稿日時 - 2010-01-29 16:43:24

ANo.6

>*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)

'--------------------------------------------------
以上

投稿日時 - 2010-01-29 12:36:09

お礼

早急なご回答ありがとうございます。
機種は 53132A ではなく 53131A でした。
大変申し訳ございませんでした。
早速上記のプログラムで実行してみましたが結果はタイムアウトしてしまい値は取得できませんでした。

参考の部分に記載して頂いた内容確認しましたが結果は同じでした。

何か根本的に間違えてるのでしょうか・・・。

投稿日時 - 2010-01-29 13:31:37

ANo.5

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の設定

投稿日時 - 2010-01-29 06:32:29

お礼

ご回答ありがとうございました。

早速上記の内容でプログラムを作成してみました。
*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)

投稿日時 - 2010-01-29 09:33:19

ANo.4

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に通信テスト用のプログラムが付属していれば試して見てください設定が悪いのかプログラムが間違ってるのか判断できます
また、サンプル・プログラムが付属してるならじっくり眺めてください
手順なと参考になります

投稿日時 - 2010-01-28 19:30:31

ANo.3

>『:MWASure[:SCALar][:VOLTage]:FREQuency?』って送れば...

[ ]内は省略可能を表しています
また小文字も省略可能です、小文字部分を省略しない場合は全て大文字で記します
以下の例のどれでも可です

:MWASURE:SCALAR:VOLTAGE:FREQUENCY?
:MWASURE:SCALAR:FREQUENCY?
:MWASURE:VOLTAGE:FREQUENCY?
:MWASURE:FREQUENCY?

:MWAS:SCAL:VOLT:FREQ?
:MWAS:FREQ?

なお、コマンドを送っただけでは値が取得は出来ませんので
GP-IBの送信後、受信動作を行います

投稿日時 - 2010-01-28 08:50:21

お礼

早速のご回答ありがとうございます。
早速上記の内容を送ってみたのですが、
受信動作をしてもタイムアップしてしまい取得できない状態です。
ちなみにGPIBボードはラトックシステム株式会社のREX-PCI20という製品を使用しております。
ちなみに以下のようなプログラムで取得しようとしてますが
gpredの関数で戻り値がタイムアップとなってしまいます。

Status = PCIGPIBAX.gpwrt(GpAdrsBuf, ":MWASURE:SCALAR:VOLTAGE:FREQUENCY?")
wait(1000)'1秒またせる
Status = PCIGPIBAX.gpred(GpAdrsBuf, szBuf, Len(szBuf))

投稿日時 - 2010-01-28 16:15:45

ANo.2

マニュアル「プログラミング ガイド」の
コマンド リファレンス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

投稿日時 - 2010-01-28 02:12:57

お礼

ご回答ありがとうございます。
早速、資料を確認しましたが、値を取得することが出来ませんでした・・・
GP-IBにコマンドで『:MWASure[:SCALar][:VOLTage]:FREQuency?』って送れば値が取得できるわけでは無いのでしょうか?
何も判っておらずすいません・・・。

投稿日時 - 2010-01-28 08:27:44

ANo.1

独特な機器で利用方法がわからない場合は、掲示板で質問を行うより、その機器を扱う販売代理店に問い合わせる方が、良いと思いますよ。

経験上、大抵の代理店はサンプルPGを用意しております。

それ以前に、私の場合機器選定の際、サンプルも資料も用意していない機器を選びません。

製品が海外製でも日本の代理店購入であれば、通常は代理店がいろいろ答えてくれます。

一度、問い合わせることをお勧めします。

投稿日時 - 2010-01-27 22:25:25

お礼

ご回答ありがとうございます。
確かに代理店に問い合わせるのがいいですよね。
早速、代理店に問い合わせをしてみます。

投稿日時 - 2010-01-28 13:01:53

あなたにオススメの質問