▼ たてぐやさん
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;]
|