From 2429d5d1dde50bdd9edddf7eaca390ab160b2e28 Mon Sep 17 00:00:00 2001 From: "Ryan@WorkStation" Date: Wed, 13 Mar 2024 20:21:21 -0400 Subject: [PATCH] can obtain waveform --- REAMME.md | 22 +++++++++ test.py | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 159 insertions(+) create mode 100644 REAMME.md create mode 100755 test.py diff --git a/REAMME.md b/REAMME.md new file mode 100644 index 0000000..1c5aa25 --- /dev/null +++ b/REAMME.md @@ -0,0 +1,22 @@ +# About + +This is a python code to connect RIGOL DS40024 Oscilliscope via Ethernet and do a FFT. The control is done by SCPI command. + +The list of command can be found in https://beyondmeasure.rigoltech.com/acton/attachment/1579/f-06f3/1/-/-/-/-/MSO%26DS4000_programming.pdf + +# Required Libraries + +- pyvisa-py +- zeroconf + +# find the device address + +```python +import pyvisa as visa + +# Initialize visa resource manager +rm = visa.ResourceManager('@py') + +# print(rm.list_resources_info() ) +print( rm.list_resources() ) +``` diff --git a/test.py b/test.py new file mode 100755 index 0000000..b6b4440 --- /dev/null +++ b/test.py @@ -0,0 +1,137 @@ +#!/usr/bin/python3 + +import pyvisa as visa +import time + +def Query(cmd : str) -> str : + haha = osc.query(cmd).rstrip('\n') + print(cmd + " : |" + haha + "|") + return haha + +def Write(cmd : str): + osc.write(cmd) + +def AskWaveParameter(): + haha = Query('WAVEFORM:Preamble?') + result = haha.split(',') + print(" Format :" + result[0]) + print(" Mode :" + result[1]) + print(" Points :" + result[2]) + print("Average :" + result[3]) + print(" X-Step :" + result[4] + " sec") + print("X-Start :" + result[5] + " sec") + print(" X-Ref :" + result[6] ) + print(" Y-Step :" + result[7] + " V" ) + print("Y-Start :" + result[8] + " V") + print(" Y-Ref :" + result[9] ) + return result + + +#========================================= + +# Initialize visa resource manager +rm = visa.ResourceManager('@py') + +osc = rm.open_resource('TCPIP::128.186.111.202::INSTR') +osc.timeout = 25000 +Query('*IDN?') +# Query(':SYST:VERSION?') + +#Write(':STOP') +#Write(':RUN') + +#================ channel setting +#Write('CHAN1:OFFSET 0.0') +#Write('CHAN1:IMPEDANCE FIFTY') #set to 50 Ohm +#Write('CHAN1:IMPEDANCE OMEG') #set to 1Mohm +#Write('CHAN1:SCALE 0.2') #set vertical scale is 0.1V/div + +#================ mesurement +# Query('MEASURE:FREQ? CHAN1') #measure freqeuncy of ch1 in Hz +#Query('MEASURE:VMAX? CHAN1') #measure VMaX of ch1 in V +#Query('MEASURE:VMIN? CHAN1') #measure VMin of ch1 in V +#Query('MEASURE:VPP? CHAN1') #measure Vpp of ch1 in V +#Query('MEASURE:VRMS? CHAN1') #measure Vrms of ch1 in V + +#================ time axis +#Query('TIMEBASE:OFFSET?') #offset in sec +#Write('TIMEBASE:OFFSET 6.0e-6') #offset in sec, pos to the right, neg to the left +#Write('TIMEBASE:SCALE 2.0e-6') # set time scale to be 2us/div + +#================ trigger +#Write('TRIG:MODE EDGE') #set trigger mode to be EDGE; EDGE|PULSe|RUNT|NEDG|SLOPe|VIDeo|PATTern|RS232|IIC|SPI|CAN|FLEXray|USB +#Query('TRIG:STATUS?') #ask if trigger is ok, return TD = triggered +#Query('TRIG:EDGE:SLOPE?') +#Write('TRIG:EDGE:SLOPE POS') #set trigger at positive slope; NEG +#Write('TRIG:EDGE:SOURCE CHAN1') #set trigger for channel 1 +#Query('TRIG:EDGE:LEVEL?') #ask trigger level + +#=============== Waveform + +#--------------- read waveform on the screen +Write('RUN') +Write('WAVEFORM:RESET') +Write('WAVEFORM:SOURCE CHAN1') +Write('WAVEFORM:FORMAT BYTE') +Write('WAVEFORM:MODE NORM') + +para = AskWaveParameter() +wfSize = int(para[2]) + +Query('WAVEFORM:SOURCE?') +Query('WAVEFORM:MODE?') +Query('WAVEFORM:FORMAT?') + +# print("----------------- get data ") + +[status, wfLen] = Query('WAVEFORM:STATUS?').split(',') +if status == "IDLE" and int(wfLen) >= 0 : + print("---- get waveform data") + osc.write('WAVEFORM:DATA?') + binary = osc.read_bytes(int(wfSize) +11 + 1) # + # print(binary) + + +#---------- read data from internal memory, 1.12 million points, take like +# Write('STOP') +# Write('WAVEFORM:RESET') +# Write('WAVEFORM:SOURCE CHAN1') +# Write('WAVEFORM:MODE RAW') #internal +# Write('WAVEFORM:FORMAT BYTE') +# Write('WAVEFORM:BEGIN') + +# para = AskWaveParameter() +# wfSize = int(para[2]) +# Write('WAVEFORM:POINTS %d' % wfSize) +# Query('WAVEFORM:POINTS?') + +# # print("----------------- get data ") +# count = 0 +# while(count<10): +# [status, wfLen] = Query('WAVEFORM:STATUS?').split(',') +# if status == "IDLE" and int(wfLen) >= wfSize : +# print("---- get waveform data") +# osc.write('WAVEFORM:DATA?') +# start_time = time.time() +# binary = osc.read_bytes(int(wfLen)+11 + 1) # +# end_time = time.time() +# print(binary) +# break + +# time.sleep(1) +# count = count + 1 + +#Write('WAVEFORM:END') + +# duration = end_time - start_time +# print("Duration:", duration, "seconds") + +#----------------- decode binary + +# Extracting the header (first 11 bytes) +header = binary[:11] +data_points = binary[11:] +# Decode the 1-byte data points +decoded_data = [byte for byte in data_points] +print("Decoded data:", decoded_data) +