· 

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

OWON SDS7102からpythonで波形取得...できたらいいなーと思っている。引き続きLabVIEWと格闘する。

残りは中央から右上の部分。

右上のでかい四角はforらしい。で、Nがループ回数。で▼がシフトレジスタ初期値入力。その下の■は最後に波形データに足しているっぽいのでオフセットだろう。でその下の■は全データ。で、その下のiはループカウンタ。

受信データのCH1のインデックスを基準に+15と+16の値でループ回数、+31と+32の値でオフセット。でデータの取得は2byte刻みってことでしょ。ということで大して調べもせずにpython化。もういきなりまるっと。

  1. import numpy as np
  2. import socket
  3. import matplotlib.pyplot as plt
  4.  
  5. HOST='192.168.125.63'
  6. PORT=3000
  7.  
  8. controller=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  9. controller.connect((HOST,PORT))
  10. controller.settimeout(2)
  11.  
  12. send_message='STARTBIN'
  13. #send_message='STARTMEMDEPTH'
  14. controller.send(send_message.encode())
  15. rcvlen=12
  16. bufpos=0
  17. msg_array=np.empty(0,dtype='uint8')
  18. while bufpos<rcvlen:
  19.     msg=controller.recv(1)
  20.     msg_array=np.append(msg_array,np.frombuffer(msg,dtype=np.uint8))
  21.     if bufpos==1:
  22.         rcvlen=msg_array[0]+msg_array[1]*256+rcvlen
  23.     bufpos=bufpos+1
  24.  
  25. indexes_S=np.array(np.where(msg_array==83)[0])
  26. indexes_S=indexes_S[np.where(indexes_S>=(12+3))]
  27.  
  28. indexindicator_array=msg_array[indexes_S[0]:indexes_S[0]+10:]
  29. indexindicator_bytes=indexindicator_array.tobytes()
  30. indexindicator_str=indexindicator_bytes.decode(errors='ignore')
  31. if ('S07' in indexindicator_str):
  32.     timebase_index_out=0
  33. elif ('S01' in indexindicator_str):
  34.     timebase_index_out=1
  35. elif ('S08' in indexindicator_str):
  36.     timebase_index_out=2
  37. elif ('S03' in indexindicator_str):
  38.     timebase_index_out=3
  39. elif ('S04' in indexindicator_str):
  40.     timebase_index_out=4
  41. elif ('S05' in indexindicator_str):
  42.     timebase_index_out=5
  43. elif ('S06' in indexindicator_str):
  44.     timebase_index_out=6
  45. elif ('S09' in indexindicator_str):
  46.     timebase_index_out=7
  47. elif ('S02' in indexindicator_str):
  48.     timebase_index_out=8
  49. elif ('S0C' in indexindicator_str):
  50.     timebase_index_out=9
  51. elif ('S0A' in indexindicator_str):
  52.     timebase_index_out=10
  53. elif ('S0B' in indexindicator_str):
  54.     timebase_index_out=11
  55. else:
  56.     timebase_index_out=0
  57.  
  58. mantissa_base=np.array([1,2,5])
  59. timebase_list_base=np.append(mantissa_base*1e-9,mantissa_base*1e-8)
  60. for index_part in range(-7,3,1):
  61.     timebase_list_base=np.append(timebase_list_base,mantissa_base*(10**index_part))
  62. timebase_start_indexes=np.array([2,2,1,0,0,0,0,1,1,1,2,1])
  63. timebase_start_index=timebase_start_indexes[timebase_index_out]
  64. timebase_list_selected=timebase_list_base[timebase_start_index::]
  65.  
  66. vertical_list_base=np.append(mantissa_base*1e-3,mantissa_base*1e-2)
  67. for index_part in range(-1,3,1):
  68.     vertical_list_base=np.append(vertical_list_base,mantissa_base*(10**index_part))
  69. vertical_start_indexes=np.array([1,4,7,10])
  70.  
  71. # find 'CHx' index
  72. channel_selected=1
  73. channel_indicator_list=np.array([ord('1'),ord('1'),ord('2')])
  74. array_C=(msg_array==ord('C'))
  75. array_H=(msg_array==ord('H'))
  76. array_x=(msg_array==channel_indicator_list[channel_selected])
  77. index_CHx=((np.where(array_C[0:-2:1]*array_H[1:-1:1]*array_x[2::1]))[0])[0]
  78.  
  79. vertical_start_index=vertical_start_indexes[msg_array[index_CHx+39]]
  80. vertical_list_selected=vertical_list_base[vertical_start_index::]
  81. vertical_selected_precision=vertical_list_selected[msg_array[index_CHx+35]]
  82.  
  83. timebase_selected_M=timebase_list_selected[msg_array[index_CHx+27]]
  84.  
  85.  
  86. waveform_count=msg_array[index_CHx+16]*256+msg_array[index_CHx+15]
  87. vertical_offset_extracted=msg_array[index_CHx+32]*256+msg_array[index_CHx+31]
  88. vertical_offset=vertical_offset_extracted.astype('int16')
  89.  
  90.  
  91. data_start_index=index_CHx+59
  92. data_low=msg_array[data_start_index:data_start_index+2*waveform_count:2]
  93. data_high=msg_array[data_start_index+1:data_start_index+1+2*waveform_count:2]
  94. data_u=data_high*256+data_low
  95. data=data_u.astype('int16')+vertical_offset
  96.  
  97. plt.plot(data)
  98. plt.ylim([-100,100])
  99.  
  100. controller.close()

で、実行結果。

 

LabVIEWの場合

 

実際のオシロの画面

 

なんか、うまいこといったんじゃない?

で、わかったこと、

・受信できるデータは画面上の座標のようなものであって、実際の値ではない。表示するのが目的ではないので、受信した情報でうまいことデータを正しい値に変換する必要がある。

・SDS7102のLength設定はざっくりこんなもんってことを示している。1000の設定では760ポイントのデータしかないTT

 

アル中なので、そろそろやめる。明日も頑張るかもしれないし頑張らないかもしれない。