OWON SDS7102からpythonで波形取得...できたらいいなーと思っている。引き続きLabVIEWと格闘する。
残りは中央から右上の部分。
右上のでかい四角はforらしい。で、Nがループ回数。で▼がシフトレジスタ初期値入力。その下の■は最後に波形データに足しているっぽいのでオフセットだろう。でその下の■は全データ。で、その下のiはループカウンタ。
受信データのCH1のインデックスを基準に+15と+16の値でループ回数、+31と+32の値でオフセット。でデータの取得は2byte刻みってことでしょ。ということで大して調べもせずにpython化。もういきなりまるっと。
- import numpy as np
- import socket
- import matplotlib.pyplot as plt
- HOST='192.168.125.63'
- PORT=3000
- controller=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- controller.connect((HOST,PORT))
- controller.settimeout(2)
- send_message='STARTBIN'
- #send_message='STARTMEMDEPTH'
- controller.send(send_message.encode())
- rcvlen=12
- bufpos=0
- msg_array=np.empty(0,dtype='uint8')
- while bufpos<rcvlen:
- msg=controller.recv(1)
- msg_array=np.append(msg_array,np.frombuffer(msg,dtype=np.uint8))
- if bufpos==1:
- rcvlen=msg_array[0]+msg_array[1]*256+rcvlen
- bufpos=bufpos+1
- indexes_S=np.array(np.where(msg_array==83)[0])
- indexes_S=indexes_S[np.where(indexes_S>=(12+3))]
- indexindicator_array=msg_array[indexes_S[0]:indexes_S[0]+10:]
- indexindicator_bytes=indexindicator_array.tobytes()
- indexindicator_str=indexindicator_bytes.decode(errors='ignore')
- if ('S07' in indexindicator_str):
- timebase_index_out=0
- elif ('S01' in indexindicator_str):
- timebase_index_out=1
- elif ('S08' in indexindicator_str):
- timebase_index_out=2
- elif ('S03' in indexindicator_str):
- timebase_index_out=3
- elif ('S04' in indexindicator_str):
- timebase_index_out=4
- elif ('S05' in indexindicator_str):
- timebase_index_out=5
- elif ('S06' in indexindicator_str):
- timebase_index_out=6
- elif ('S09' in indexindicator_str):
- timebase_index_out=7
- elif ('S02' in indexindicator_str):
- timebase_index_out=8
- elif ('S0C' in indexindicator_str):
- timebase_index_out=9
- elif ('S0A' in indexindicator_str):
- timebase_index_out=10
- elif ('S0B' in indexindicator_str):
- timebase_index_out=11
- else:
- timebase_index_out=0
- mantissa_base=np.array([1,2,5])
- timebase_list_base=np.append(mantissa_base*1e-9,mantissa_base*1e-8)
- for index_part in range(-7,3,1):
- timebase_list_base=np.append(timebase_list_base,mantissa_base*(10**index_part))
- timebase_start_indexes=np.array([2,2,1,0,0,0,0,1,1,1,2,1])
- timebase_start_index=timebase_start_indexes[timebase_index_out]
- timebase_list_selected=timebase_list_base[timebase_start_index::]
- vertical_list_base=np.append(mantissa_base*1e-3,mantissa_base*1e-2)
- for index_part in range(-1,3,1):
- vertical_list_base=np.append(vertical_list_base,mantissa_base*(10**index_part))
- vertical_start_indexes=np.array([1,4,7,10])
- # find 'CHx' index
- channel_selected=1
- channel_indicator_list=np.array([ord('1'),ord('1'),ord('2')])
- array_C=(msg_array==ord('C'))
- array_H=(msg_array==ord('H'))
- array_x=(msg_array==channel_indicator_list[channel_selected])
- index_CHx=((np.where(array_C[0:-2:1]*array_H[1:-1:1]*array_x[2::1]))[0])[0]
- vertical_start_index=vertical_start_indexes[msg_array[index_CHx+39]]
- vertical_list_selected=vertical_list_base[vertical_start_index::]
- vertical_selected_precision=vertical_list_selected[msg_array[index_CHx+35]]
- timebase_selected_M=timebase_list_selected[msg_array[index_CHx+27]]
- waveform_count=msg_array[index_CHx+16]*256+msg_array[index_CHx+15]
- vertical_offset_extracted=msg_array[index_CHx+32]*256+msg_array[index_CHx+31]
- vertical_offset=vertical_offset_extracted.astype('int16')
- data_start_index=index_CHx+59
- data_low=msg_array[data_start_index:data_start_index+2*waveform_count:2]
- data_high=msg_array[data_start_index+1:data_start_index+1+2*waveform_count:2]
- data_u=data_high*256+data_low
- data=data_u.astype('int16')+vertical_offset
- plt.plot(data)
- plt.ylim([-100,100])
- controller.close()
で、実行結果。
LabVIEWの場合
実際のオシロの画面
なんか、うまいこといったんじゃない?
で、わかったこと、
・受信できるデータは画面上の座標のようなものであって、実際の値ではない。表示するのが目的ではないので、受信した情報でうまいことデータを正しい値に変換する必要がある。
・SDS7102のLength設定はざっくりこんなもんってことを示している。1000の設定では760ポイントのデータしかないTT
アル中なので、そろそろやめる。明日も頑張るかもしれないし頑張らないかもしれない。
コメントをお書きください