· 

SDS7102からpythonで波形取得(2)

OWON SDS7102からpythonで波形取得...できたらいいなーと思っている。VISAをあきらめてSocketでやる。

で、このへんを参考に、とりあえずこんな感じで、

  1. import socket
  2. HOST='192.168.125.63'
  3. PORT=3000
  4.  
  5. controller=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  6. controller.connect((HOST,PORT))
  7.  
  8. send_message='STARTBIN'
  9. controller.send(send_message.encode())
  10. msg=controller.recv(1024)
  11. print(msg)

するってーと

runfile('D:/Documents/python3/owon_sds_downloader/test1.py', wdir='D:/Documents/python3/owon_sds_downloader')

b'\x8c\x0c\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00SPBS02e\x00\x11\x80SDS71021513711\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xcdO\xc3Gs\x00e.\x00\x00\x00;CH1\xd8\xf9\xff\xff\x02\x00\x00\x00\x00\x00\x00\x00\xf8\x02\x00\x00\xf8\x02\x00\x00\xf8\x02\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x01\x00\x00\x00\xcd\xcc\xcc=\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80@\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\x00'

 

こうなるので、何となくうまくいっている。ここから設定やら波形データを取り出せばいいはず。正直どうしたもんやらですが、OWONのSDSのページからLabView用のソフトがダウンロードできるので、それを参考にする。LabVIEWなんて基本的には絶対に使いたくない(※1)のだけど、最近、LabVIEW Community Editionというのが出て、「自宅プロジェクトは仕事との関連が一切ない」なら使っていいらしい。そもそも会社でLabVIEWなんて絶対に使う気はないし、OWONのコードを見るだけなので、インストールする。

 

 

で、いろんな説明に従ってインストール(※2)し、そして、起動。そして開く。

 

※1 : LabVIEW大好きな方々を否定する気はないです。一度にたくさんの情報を見たいという理由で、.cでも.cppでも.inoでも.pyでも.mでもコメントを最小限にしている私にあの画面はとんでもなくつらいってだけ。

 

 ※2 : 基本ソフトだけ入れたいのに勝手におまけを入れておいて、おまけのライセンスが期間限定ですって言ってくるところがなんだかなーって思う。

プロジェクトツリーが開くので、それらしいやつ(acquire single wave 2.0 by LAN.vi)をダブルクリッック。

で、とりあえず実行してみる。

で、なんか波形が取れているっぽいのがわかる。では、中身はどうなっているのか?こうすれば見れる...(一見さんをよせつけないこの仕様がなんとも)

で、こうなるんだけど、これ見てパっと何しているかわかる人いるのかね...LabVIEW食わず嫌いの私にはさっぱり。

とりあえず、左側のowon的なアイコンをダブルクリックしてみる。

で、Show Block Diagram

お、STARTBINをTCPにぶっこんでいる...それっぽいゾ

最初のTCPアイコンで、右クリックでプロパティを見ると「TCP Write」ってなってる。そのあとは、「TCP Read」「TCP Write」「TCP Read」ってつながってて、「TCP Read」にぶっこんでる値は(そうっとマウスを近づけると)「bytes to read」らしい。

よし、実行させて値を見てみよう...ブレークポイントってどうやんの...?

とりあえず最初のTCPで止めよう。TCPを右クリックして、出てくるメニューで「Breakpoint」からの「Set Breakpoint」で。枠が赤くなる。で、本体に戻って実行してみる。1つ目のTCPが点滅して止まったっぽい。で、線の上にマウスを持っていくと、アイコンがPって感じになるのでつつくと、Probe Watch Windowというのが現れて値が見れる。

なんじゃもんじゃやってみると、最初にSTARTBINを送って、とりあえず12Bytes受信して、最初の2バイトをunsigned intとしてみて、STARTBINで何Bytes送られてくるのかを判断して、もう一度STARTBINを送って、残りを正しいバイト数で受信しているみたい。もうLabVIEW見たくないので、とりあえず、ここまでpythonでやってみよー。

  1. import numpy as np
  2. import socket
  3. HOST='192.168.125.63'
  4. PORT=3000
  5.  
  6. controller=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  7. controller.connect((HOST,PORT))
  8. controller.settimeout(2)
  9.  
  10. send_message='STARTBIN'
  11. controller.send(send_message.encode())
  12. rcvlen=12
  13. bufpos=0
  14. msg_array=[]
  15. while bufpos<rcvlen:
  16.     msg=controller.recv(1)
  17.     msg_array=np.append(msg_array,np.frombuffer(msg,dtype=np.uint8))
  18.     if bufpos==1:
  19.         rcvlen=msg_array[0]+msg_array[1]*256+rcvlen
  20.     bufpos=bufpos+1

参考にしたLabVIEWとかなり違った仕様で書いてしまいましたが、まぁ気分屋なのでってことで。で、

ってなるので、データをとるところまではできてるっぽい。ちなみにrcvlenを更新しているところ(19行目)で+rcvlen-1ってして、ループが終わったところでもう一回msgl=controller.recv(1024)ってすると

ってなって、msg_arrayのサイズが1減って、msglがサイズ1になるので、最初のコードでちゃんととりきっていることがわかりました。よし。

で、このブロックまではやり切っておく。

の部分は2回目の受信データの3番目から(pythonでは受信データを分割していないので15番目から)値8(='S')3を探して、そこから10個の値で文字列を作って、マゼンタの配列にある文字列のうちどれがあるかを検索している。

で、

  1. indexes_S=np.array(np.where(msg_array==83)[0])
  2. indexes_S=indexes_S[np.where(indexes_S>=(12+3))]
  3.  
  4. indexindicator_array=msg_array[indexes_S[0]:indexes_S[0]+10:]
  5. indexindicator_bytes=indexindicator_array.tobytes()
  6. indexindicator_str=indexindicator_bytes.decode(errors='ignore')
  7. if ('S07' in indexindicator_str):
  8.     timebase_index_out=0
  9. elif ('S01' in indexindicator_str):
  10.     timebase_index_out=1
  11. elif ('S08' in indexindicator_str):
  12.     timebase_index_out=2
  13. elif ('S03' in indexindicator_str):
  14.     timebase_index_out=3
  15. elif ('S04' in indexindicator_str):
  16.     timebase_index_out=4
  17. elif ('S05' in indexindicator_str):
  18.     timebase_index_out=5
  19. elif ('S06' in indexindicator_str):
  20.     timebase_index_out=6
  21. elif ('S09' in indexindicator_str):
  22.     timebase_index_out=7
  23. elif ('S02' in indexindicator_str):
  24.     timebase_index_out=8
  25. elif ('S0C' in indexindicator_str):
  26.     timebase_index_out=9
  27. elif ('S0A' in indexindicator_str):
  28.     timebase_index_out=10
  29. elif ('S0B' in indexindicator_str):
  30.     timebase_index_out=11
  31. else:
  32.     timebase_index_out=0

ちょっとまどろっこしいけど、こんなんで。

 

最後にここまでのコードをまとめるとこうなる。

  1. import numpy as np
  2. import socket
  3. HOST='192.168.125.63'
  4. PORT=3000
  5.  
  6. controller=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  7. controller.connect((HOST,PORT))
  8. controller.settimeout(2)
  9.  
  10. send_message='STARTBIN'
  11. #send_message='STARTMEMDEPTH'
  12. controller.send(send_message.encode())
  13. rcvlen=12
  14. bufpos=0
  15. msg_array=np.empty(0,dtype='uint8')
  16. while bufpos<rcvlen:
  17.     msg=controller.recv(1)
  18.     msg_array=np.append(msg_array,np.frombuffer(msg,dtype=np.uint8))
  19.     if bufpos==1:
  20.         rcvlen=msg_array[0]+msg_array[1]*256+rcvlen
  21.     bufpos=bufpos+1
  22.  
  23. indexes_S=np.array(np.where(msg_array==83)[0])
  24. indexes_S=indexes_S[np.where(indexes_S>=(12+3))]
  25.  
  26. indexindicator_array=msg_array[indexes_S[0]:indexes_S[0]+10:]
  27. indexindicator_bytes=indexindicator_array.tobytes()
  28. indexindicator_str=indexindicator_bytes.decode(errors='ignore')
  29. if ('S07' in indexindicator_str):
  30.     timebase_index_out=0
  31. elif ('S01' in indexindicator_str):
  32.     timebase_index_out=1
  33. elif ('S08' in indexindicator_str):
  34.     timebase_index_out=2
  35. elif ('S03' in indexindicator_str):
  36.     timebase_index_out=3
  37. elif ('S04' in indexindicator_str):
  38.     timebase_index_out=4
  39. elif ('S05' in indexindicator_str):
  40.     timebase_index_out=5
  41. elif ('S06' in indexindicator_str):
  42.     timebase_index_out=6
  43. elif ('S09' in indexindicator_str):
  44.     timebase_index_out=7
  45. elif ('S02' in indexindicator_str):
  46.     timebase_index_out=8
  47. elif ('S0C' in indexindicator_str):
  48.     timebase_index_out=9
  49. elif ('S0A' in indexindicator_str):
  50.     timebase_index_out=10
  51. elif ('S0B' in indexindicator_str):
  52.     timebase_index_out=11
  53. else:
  54.     timebase_index_out=0

LabVIEWとの格闘はまだまだつづくかもしれないしつづかないかもしれない。