blochの日記

自虐ネタ以外のぐちは書かないようにしましょう

GPIBのSDCは、visaのviClear

キーサイトのオシロDSOX2012、digitizeコマンドでアベレージモードに入るとRUNやSTOPを受け付けない。マニュアルには「digitizeコマンドから抜けるにはDevice Clearしろ」とある。また別の箇所には「myScope.IO.clear」を実行しろ、とある。

問題はどちらもviWriteで送れるコマンド文字列ではないのだ。何か、特別なものをインプリメントする必要がある。

さらにプログラミングマニュアルを検索しまくるとGPIBではSDC(selected device clear)を送り、visaでは「viClear」を実行しろと言う文言が見つかった。何と生産効率の高いこと!
教科書や論文もこれくらい効率的に肝を掴めると良いのだが、、、、。

とりあえず、visa32.dllを読むライブラリに書き加えた。
(まずinterface側)

  1. コマンドの型を関数として設定
    • TviClear=function(vi:ViSession):longword; stdcall;
    • (ViSessionはviOpen(vi_initではない)で装置をオープンした際に得るハンドラ)
  2. 関数名を変数として定義(こうすることでアドレスを直接代入できる)
    • var viClear: TviClear;
  3. 自分で使うプロシージャ名「vi_Clear」を定義
    • procedure vi_Clear(vi:ViSession);

(次にimplementation側)

  1. 初期化ルーチンでvisa32.dllをLoadLibraryして、ハンドラを得る
    • visa32lib := LoadLibrary('VISA32.DLL');
  2. そのハンドラをベースにviClearのアドレスを探して代入(@はポインタを
    • @viClear:=GetProcAddress(visa32Lib,'viClear');
  3. viClearの実際の定義
    • procedure vi_Clear(vi:ViSession);
    • var stat:ViStatus;
    • begin stat := viClear(vi);
    • if(stat < VI_SUCCESS)then writeln('Failed in viClear to ',vi,'.') end;

無事にDCLを送れるようになった。っつうか、アベレージ中でもSTOPコマンド受け付けろよ、キーサイト(アジレント)、ド素人めっ。