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側)
- コマンドの型を関数として設定
- TviClear=function(vi:ViSession):longword; stdcall;
- (ViSessionはviOpen(vi_initではない)で装置をオープンした際に得るハンドラ)
- 関数名を変数として定義(こうすることでアドレスを直接代入できる)
- var viClear: TviClear;
- 自分で使うプロシージャ名「vi_Clear」を定義
- procedure vi_Clear(vi:ViSession);
(次にimplementation側)
- 初期化ルーチンでvisa32.dllをLoadLibraryして、ハンドラを得る
- visa32lib := LoadLibrary('VISA32.DLL');
- そのハンドラをベースにviClearのアドレスを探して代入(@はポインタを
- @viClear:=GetProcAddress(visa32Lib,'viClear');
- 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コマンド受け付けろよ、キーサイト(アジレント)、ド素人めっ。