2022年
8月
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2022-08-10 owonのオシロスコープ

_ SDS7202の制御

電気的なシグナルを見るためにオシロスコープを使うことがあるが,その波形を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]
でも,これで分かってくれる人は,どの位いるのだろうか.