喫茶XRAYトップページ

[スレッド全体
]

[5683] GPIB返信 削除
2012/1/28 (土) 22:52:32 たてぐや
 また困ったときのここだのみで済みません。
 友人に測定器から来るGPIBのデータを受信してExcelのセルに表示するものを
作ってくれないか、と頼まれました。セルに表示することは過去にも経験があ
りますので、安心しているのですが、肝心のデータを受け取るやり方が解りま
せん。一応GPIB→USBの変換器にサンプルプログラムが付いているのですが、こ
れだと受信ボタンを押した一瞬だけデータを受信するものの、連続してデータを
取り込むようにはなっていません。GPIBの受信の手順が解る方がいらっしゃいま
したら教えて下さい。

[5685] Re:GPIB返信 削除
2012/1/29 (日) 13:03:28 真空管
▼ たてぐやさん

 12年ほど前ですが、インピーダンス計を使って自動測定・

作図を手がけたことがあります。

測定器は横河HPのHP=4192A、GPIBはRATOC sytemsの

REX-USB220です。

GPIBのITFは付属のDLL(U2GPLIB.DLL)をそのまま使い、

DLLの呼び出しは付属のDelphi用の定義ファイルが使えました。

ツールはDelphi4。


 昔のことですっかり忘れてしまい、今はリタイアモードで

小原章介やってまして、参考にもならないと思いますが

GPIB絡みの部分を以下に抜き出して見ました。

// 少々長くてごめんなさい。


   IDS_MYGPIBADRS: TEdit;

    IDE_GPIBADRS: TEdit;

    IDS_STATUS: TEdit;

  end;


 MyGpibAdrs: Integer; // USB-GPIBのGPIBアドレス

  GpAdrsBuf: String;        // 使用するGPIB機器のGPIBアドレス


procedure TMainForm.FormCreate(Sender: TObject);

var DtLen:integer;

begin


   // USB-GPIBアドレスを初期化

    //MyGpibAdrs := 0;

    IDS_MYGPIBADRS.Text := IntToStr(MyGpibAdrs);

    // GPIB機器アドレスを初期化

    //GpAdrsBuf := '1';

    IDE_GPIBADRS.Text := GpAdrsBuf;

end;


// GPIB 初期化ボタン

procedure TMainForm.BtnGPINITClick(Sender: TObject);

var

    GpStatus: Integer;        szCommand: String;

begin

  szCommand := 'H0KM01';


 IDS_STATUS.Text := '';

  MainForm.Refresh(); // 再描画


        // GPIBコントローラ初期化

        GpStatus := gp_init(MyGpibAdrs, 0, 0);

        if GpStatus <> 0 then

        begin

                szBuf := 'gp_init() error [' + IntToStr(GpStatus) + ']';

                IDS_STATUS.Text := szBuf;

                Exit;

        end;


        // IFCラインをTRUEにする

        gp_cli();


        // RENラインをTRUEにする

        gp_ren();


        // HP3478Aで設定されているGPIB機器アドレス取得

        GpAdrsBuf := IDE_GPIBADRS.Text;


        // GPIBバスタイムアウト時間を3秒に設定

        GpStatus := gp_tmout(3);

         if GpStatus <> 0 then

        begin

                szBuf := 'gp_tmout() error [' + IntToStr(GpStatus) + ']';

                IDS_STATUS.Text := szBuf;

                Exit;

        end;


        // SDCコマンド送出

        GpStatus := gp_clr(GpAdrsBuf);

         if GpStatus <> 0 then

        begin

                szBuf := 'gp_clr() error [' + IntToStr(GpStatus) + ']';

                IDS_STATUS.Text := szBuf;

                Exit;

        end;


        // LLOコマンド送出

        GpStatus := gp_llo();

         if GpStatus <> 0 then

        begin

                szBuf := 'gp_llo() error [' + IntToStr(GpStatus) + ']';

                IDS_STATUS.Text := szBuf;

                Exit;

        end;


        // HP3478A GPIBコマンド送信

       {        GpStatus := gp_wrt(GpAdrsBuf, szCommand);

         if GpStatus <> 0 then

        begin

                 szBuf := 'gp_wrt() error [' + IntToStr(GpStatus) + ']';

                IDS_STATUS.Text := szBuf;

                Exit;

        end;     }


        IDS_STATUS.Text := '初期化正常終了';

        GPIBinz := True;

  IDB_START.Enabled := TRUE;

end;


// GPIBコマンド送信ボタン

procedure TMainForm.Button1Click(Sender: TObject);

var

    GpStatus: Integer;   txStr: string;

begin

   txStr := Edit7.Text;

   GpStatus := gp_wrt(GpAdrsBuf,txStr);

   if GpStatus <> 0 then

   begin

    szBuf := 'gp_wrt() error [' + IntToStr(GpStatus) + ']';

    IDS_STATUS.Text := szBuf;

    Exit;

   end;

   HPOK := True;

end;


// 受信ボタン

procedure TMainForm.Button2Click(Sender: TObject);

var

  Status: Integer; // 関数の戻り値を示す

  RxBuf: String; // 受信データ格納用バッファ

  RxLen: Integer; // 受信バッファサイズ

begin


 // テキストボックス初期化

  IDS_STATUS.Text := '受信中・・・';

  Application.ProcessMessages;


 // 受信用バッファの初期化

  RxLen := 1024;

  RxBuf := StringOfChar(#0, RxLen);

  Status := gp_red(GpAdrsBuf, RxBuf, RxLen);

  if Status <> 0 then

  begin

    IDS_STATUS.Text := '';

    szBuf := 'gp_red() error: ' + IntToStr(Status);

    MessageBox(Handle, PChar(szBuf),'GPIB受信', MB_OK);

  end

  else

  begin

    IDS_STATUS.Text := '受信完了';

    // 受信データ表示

    Edit8.Text := RxBuf;

  end;


 // ハンドシェイク数の取得

  Status := gp_count();

  IDT_RXCNT.Caption := IntToStr(Status);


end;


Procedure TMainForm.MeasEx;       //測定実行

var state:integer;  i: integer; rxs:string;

begin


  for i := 0 to  Fsteps - 1 do

   begin

     Edit7.Text := 'EX';   //トリガ

     Button1Click(self);   // 送信ボタン

     WaitnMs(100);

     state := gp_wsrq(5);  //5秒間SQR待ち

     Button2Click(self);   // 受信ボタン

     if (state <> 0) or Chudan then Exit;]




[5694] Re2:GPIB返信 削除
2012/2/1 (水) 22:22:17 たてぐや
▼ 真空管さん

>   for i := 0 to  Fsteps - 1 do
>
>    begin


 このFstepsはどうやって取得しているのでしょうか? 多分ハンドシェイク
数ではないかと想像しているのですが、取得方法が解りません。

[5695] Re3:GPIB返信 削除
2012/2/2 (木) 10:55:40 真空管
▼ たてぐやさん

>  このFstepsはどうやって取得しているのでしょうか? 多分ハンドシェイク
> 数ではないかと想像しているのですが、


 そうです、Fstepsはグローバル変数で「測定スタート周波数」
「ストップ周波数」「ステップ周波数」からデータ取得回数を
測定実行前に求めています。

 ずいぶん昔の事で自分でも理解しきれないまま、GPIB絡みを
適当に抜き出してしまいました、ペコリ!!。

 お気付きかと思いますが、gp_xxxx(xxx)はU2GPLIB.DLLの
関数です。REX-USB220はまだ現役のようで、マニュアルが
RATOC sytemsのサイトからダウンロードできます。

 もう一つ気になる事ですが、ここで使った測定器は古い物で
ステップ周波数を指定するステップ掃引ですが、新しいものは
連続掃引で、データ取得方法が異なります。予算の折り合いが
つかずに手付かずのままです。


[5696] Re4:GPIB返信 削除
2012/2/2 (木) 12:21:01 真空管
▼ たてぐやさん
>
> >  このFstepsはどうやって取得しているのでしょうか? 多分ハンドシェイク
> > 数ではないかと想像しているのですが、
>
>  そうです、Fstepsはグローバル変数で


 おっとっと、「ハンドシェイク数」を曖昧のまま答えてしまいました。
プログラム中の「 // ハンドシェイク数の取得  Status := gp_count();」
とは、単純に受信完了データ数をU2GPLIB.DLLで読み出したもので、
それをラベルに表示してデバッグ・メンテ用に使っただけです。


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82