102 lines
3.4 KiB
Python
102 lines
3.4 KiB
Python
|
import logging
|
||
|
import pyvisa
|
||
|
from pyvisa import constants
|
||
|
|
||
|
|
||
|
logger = logging.getLogger(__name__)
|
||
|
logger.addHandler(logging.NullHandler())
|
||
|
|
||
|
|
||
|
def get_oscilloscopes():
|
||
|
rm = pyvisa.ResourceManager('@py')
|
||
|
return rm.list_resources(query = '?*::INSTR')
|
||
|
|
||
|
|
||
|
class Oscilloscope:
|
||
|
def __init__(self, oscilloscope_id):
|
||
|
rm = pyvisa.ResourceManager('@py')
|
||
|
resources = rm.list_resources(query = '?*::INSTR')
|
||
|
self.resource = rm.open_resource(
|
||
|
resources[oscilloscope_id],
|
||
|
read_termination = '\n',
|
||
|
write_termination = '\n')
|
||
|
self.resource.timeout = 20000
|
||
|
logger.debug('timeout set to %dms', self.resource.timeout)
|
||
|
self.resource.query_delay = 0.1
|
||
|
logger.debug('query_delay set to %fs', self.resource.query_delay)
|
||
|
# self.query = self.resource.query
|
||
|
self.write('*CLS')
|
||
|
print('connected to the oscilloscope with *IDN:',
|
||
|
self.query('*IDN?'))
|
||
|
|
||
|
def __del__(self):
|
||
|
self.close()
|
||
|
|
||
|
def close(self):
|
||
|
logger.debug('closing oscilloscope...')
|
||
|
self.resource.close()
|
||
|
|
||
|
def write(self, *args):
|
||
|
logger.debug('%s', ', '.join(map(str, args)))
|
||
|
return self.resource.write(*args)
|
||
|
|
||
|
def query(self, *args):
|
||
|
logger.debug('%s...', ', '.join(map(str, args)))
|
||
|
data = self.resource.query(*args)
|
||
|
logger.debug('%s %s', args[0], data)
|
||
|
return data
|
||
|
|
||
|
def command_binary(self, query, data: bytes):
|
||
|
logger.debug('%s, len: %d', query, len(data))
|
||
|
return self.resource.write_binary_values(
|
||
|
query,
|
||
|
data,
|
||
|
datatype='B')
|
||
|
|
||
|
def query_binary(self, query):
|
||
|
logger.debug('%s...', query)
|
||
|
data = self.resource.query_binary_values(
|
||
|
query,
|
||
|
datatype='B',
|
||
|
container = bytes)
|
||
|
logger.debug('%s, len: %d', query, len(data))
|
||
|
return data
|
||
|
|
||
|
def query_check(self, command):
|
||
|
print(command, self.resource.query(command+'?'))
|
||
|
|
||
|
def command_check(self, command, value):
|
||
|
data = self.resource.write(command + ' ' + value)
|
||
|
self.query_check(command)
|
||
|
return data
|
||
|
|
||
|
def save_conf(self, filename):
|
||
|
logger.debug('to filename %s', filename)
|
||
|
data = self.query_binary(':SYSTem:SETup?')
|
||
|
out_file = open(filename, 'wb')
|
||
|
len_written = out_file.write(data)
|
||
|
out_file.close()
|
||
|
logger.debug('read %d, written %d', len(data), len_written)
|
||
|
return len(data) - len_written
|
||
|
|
||
|
def load_conf(self, filename):
|
||
|
logger.debug('from filename %s', filename)
|
||
|
in_file = open(filename, 'rb')
|
||
|
data = in_file.read()
|
||
|
len_written = self.command_binary(':SYSTem:SETup ', data)
|
||
|
in_file.close()
|
||
|
logger.debug('read %d, written %d', len(data), len_written)
|
||
|
return len(data) - len_written
|
||
|
|
||
|
def setup_measurement(self):
|
||
|
logger.debug('')
|
||
|
self.command_check(":ACQuire:TYPE", "Normal")
|
||
|
# self.command_check(":ACQuire:COUNt", "2")
|
||
|
self.command_check(":TIMebase:MODE", "MAIN")
|
||
|
self.command_check(":WAVeform:UNSigned", "1")
|
||
|
self.command_check(":WAVeform:BYTeorder", "LSBFirst")
|
||
|
self.command_check(":WAVeform:FORMat", "BYTE")
|
||
|
self.command_check(":WAVeform:SOURce", "CHANnel1")
|
||
|
self.command_check(":WAVeform:POINts:MODE", "RAW")
|
||
|
self.command_check(":ACQuire:COMPlete", "100")
|