|
setup diary |
電気的なシグナルを見るためにオシロスコープを使うことがあるが,その波形をPCに取り込む必要性が出てきた.しかし,手持ちのオシロの多くはPCとのinterfaceがついていない.幸いなことに,手元にあったowonのSDS7202には,USBとLANのポートがあって,通信もできそうだと思って調べてみたら,測定のパラメータはSCPIコマンドで変えられるらしいことが分かった.しかし,波形の取り込みについては,やり方がすぐには分からなかった.
専用のソフトを使うとできるようなので,原理的には可能なはずだと思っていろいろと調べてみると,参考になる情報がいくつか見つかったので,それをもとに試行錯誤して,なんとか通信できるようになったので,その概要を書いておく.その時に作ったプログラムも,いずれは公開するかも知れない.
まず,PCとの接続には,LANを用いた.固定IPを指定したら,問題無く通信をすることができた.最初に苦労したのが,SCPIコマンドで,大文字と小文字の区別をすることである.通常の装置は,その区別が無いので,そう信じて通信していた,うまく行かずに原因の究明に時間を取られてしまった. 波形のdataは,STARTMEMDEPTHを送ると,直前の測定のbinary dataが返ってくる.このformatが少し独特で,web上で見つかった情報にもいくつかの誤りがあったので苦労したが,いくつかの不明な点を除くと,だいたい理解することができた.この詳細を書くと長くなるのでrubyで書くと,以下のような感じである.ここで,dが返ってきたdataから,先頭の通信用のフラグの12byteを除いたものである.
model,unknown1,serial, trig,channel,zero1,zero2,hPos,type, remain = d.unpack("A6VA30C4s<aa*") trigger={"s"=>[1],"a"=>[1,2]}[type].map{ trgSrc,trgMod,remain=remain.unpack("Caa*") unpck = trgMod=~/[ep]/ ? "l<aa*" : "aa*" # edge or pulse remain,sep,level = remain.unpack(unpck).reverse [trgSrc,trgMod,level,sep] } ch1,ch2=[1,2].map{ ch=remain.unpack("A3l<V9e4") #ch,block,memory,from,screensize,size,movesize,tbase,voffset,vbase,attenuation,tdiv_us,freq,cycle,vdiv_mV next unless ch[1] block=3+ch[1].abs ch=remain[0,block] ch=ch.unpack("A3l<10e4a*") remain=remain[block..-1] unpck=ch[2][0]>0 ? "c*" : "s<*" ch[-1]=ch.last.unpack(unpck) [ch[11]*1e-6,ch[-1].map{|l|(l-ch[8])*ch[14]*1e-3}] } [ch1,ch2,trigger]でも,これで分かってくれる人は,どの位いるのだろうか.