« WindowsのGamebarでダイアログやポップアップも含めて録画する方法 | トップページ | ZYNQで作るロックインアンプ、0.1uVへの挑戦 »

2022.03.22

SCPIを使ってKeysightのファンクションジェネレータを自動操作

Keysightのファンクションジェネレータを入手したので、ZYNQ&高速ADCでロックインアンプを作る実験を再開しました。

Lockin_config1

ファンクションジェネレータから出力した振幅1mV~100mVくらいの正弦波をアッテネータで1000分の1にして、それをCosmo-Zの基板に入れてロックインアンプで元の振幅を推定するということをしようとしています。

Lockin_config2

Keysightの比較的新しい計測器はLANで接続することができて、遠隔操作ができるようになっています。

下の画面の右のほうに映っているPATHWAVEというツールがKeysightの計測器をLANで遠隔操作できるツールなのですが、

Keysight_remote

せっかくなら、自分で作ったプログラムから操作したいじゃないですか。

ファンクションジェネレータのパラメータを変えて、計測される値を自動的に記録していきたい。

そうすれば、家から会社の装置を操作できるので、出勤しなくても、夜中に布団の中からでも操作できる。なんて素晴らしい。

 

Keysightの計測器はSCPIという体系のコマンドで操作できるようになっています。読み方は確かスキッピーだったと思います・・

イメージとしてはGPIBの近代化といった感じです。

 

SCPIを使うには、ポート5024にアクセスすればよいようです。

TeraTermからTELNETを使ってログインしてみると、このような感じで対話型でアクセスできます。

Scpi1

コマンドはテキストでやりとりし、エラーが起きると本体からピッと音が鳴ります。遠隔操作だと音が聞こえないのが残念。

このコマンドを、TeraTermを開くのではなくて、ZYNQ上のシェルスクリプトやプログラムから出力したりできればいいんです。

 

最初はncという万能ネットワークツールでやろうとしたのですが、実は、SCPIは" > "のプロンプトが出てから次のコマンドを送らないといけなかったり、意外と「待ち」が重要なようです。

そこで、どのようなデータがやり取りされているかを調べてみたら、ただのテキストではなく、FF FB 01や、FF F9というバイナリなコードが含まれていました。

Scpi2

KeysightのマニュアルにはこのFF F9等の説明はなかったのですが、

http://www5e.biglobe.ne.jp/~aji/3min/55.html

のサイトによれば、0xffはTELNETエスケープシーケンスというもので、0xff 0xf9はGo Aheadという「送信するように受信側にうながす」という意味だそうです。つまり、" > "を待ってから送信するのではなく、0xff 0xf9を待ってから送信するようにすればよいようです。

ちなみに、先頭にある0xff 0xfb 0x01はオプションを使用することを宣言しているものであるようです。

SCPIのコマンドは、SOURce2:VOLT 0.001 のような非常に素朴なコマンドです。

こういうのを連続して送っていけばファンクションジェネレータの出力を自作プログラムから操作できるのですが、どうやら、振幅を変えたら0.5秒くらい待たないと安定しないようです。0.1秒だと計測時の誤差が大きくなります。

SCPIでEDU32212Aの振幅を操作し、Cosmo-Zで波形をキャプチャしているようすを動画にしました。

ソケットプログラミングができれば、SCPIの操作は実に簡単で、

    connect(sock, (struct sockaddr *)&server, sizeof(server));

か何かで開いておいたソケットに対して、以下のような関数を呼び出すことでコマンドを送ります。

void scpi(int sock, const char *cmd) {
unsigned char *buf = new unsigned char[4096]; // 良くないけど、バッファサイズ決め打ち!
printf("send command '%s'\n",cmd);
sprintf((char*)buf,"%s\r\n",cmd);
send(sock,buf,strlen((char*)buf),0);
get_prompt(sock, buf, 4096);
}
 
int get_prompt(int sock, unsigned char *buf, int len) {
int n;
int wp = 0;
while(1) {
n = recv(sock, &buf[wp], 256, 0);
for(int i=0;i<n-1;i++) {
if((buf[wp + i] == 0xff) && (buf[wp + i + 1] == 0xf9)) {
wp += n;
buf[wp] = '\0';
return wp;
}
}
}
}

なお、SCPIでは?を付けることで現在の設定値を知ることができるので、読み込んだ結果をprintfで表示しておくと便利です。

このような感じで、自分で作ったプログラムから計測器を遠隔操作することができ、パラメータを変えて自動計測できるようになります。

 

|

« WindowsのGamebarでダイアログやポップアップも含めて録画する方法 | トップページ | ZYNQで作るロックインアンプ、0.1uVへの挑戦 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« WindowsのGamebarでダイアログやポップアップも含めて録画する方法 | トップページ | ZYNQで作るロックインアンプ、0.1uVへの挑戦 »