""" provide basic class to operate SCPI capable instruments """ import re def response2numStr(strIn, firstSeparator=None, unit=None): # Often an instrument reply is in the form 'TDIV 2.00E-08S' (for example Siglent Scope) # i.e. " # prefix='TDIV', firstSeparator=' ', numberString='2.00E-08', unit='S' # this function parses the reply if firstSeparator is None or firstSeparator == '': return (strIn, None, None) spltStr = re.split(firstSeparator, strIn) prefix = spltStr[0] rstr = spltStr[1] if unit is not None and unit != '': spltStr = re.split(unit, rstr) numberString = spltStr[0] unit = spltStr[1] else: numberString = rstr return (prefix, numberString, unit) class SCPI_PROPERTY(property): """ Overrides property class and makes it suitable for SCPI set and query notation """ def __init__(self, scpi_prfx=None, ptype=str, doc=None): super().__init__(fget=self.get_scpi, fset=self.set_scpi) self.scpi_prfx = scpi_prfx self.ptype = ptype self.__doc__ = doc def get_scpi(self, owner): print(f'{self.scpi_prfx}?') return self.ptype( '443' ) def set_scpi(self, owner, val): print(f'{self.scpi_prfx} {val}') def __repr__(self): s = [ f'{self.__class__.__name__}(' ] sargs= [] sargs.append( f'scpi_prfx={self.scpi_prfx}') sargs.append( f'ptype={self.ptype}') sargs.append( f'doc={self.__doc__}') sargs =', '.join(sargs) s = ''.join( [ f'{self.__class__.__name__}(' , sargs, ')' ] ) return s class SCPIinstr: """ Basic class which support SCPI commands """ """ Do not instantiate directly, use rm = pyvisa.ResourceManager() SCPIinstr(rm.open_resource('TCPIP::192.168.0.2::INSTR')) """ def __init__(self, resource): self.resource = resource # convenience pyvisa functions self.write = self.resource.write self.read = self.resource.read self.query = self.resource.query self.read_bytes = self.resource.read_bytes self.read_binary_values = self.resource.read_binary_values self.query_binary_values = self.resource.query_binary_values @property def idn(self): return self.query("*IDN?") def clear_status(self): self.write("*CLS") def set_event_status_enable(self): self.write("*ESE") def query_event_status_enable(self): return self.query("*ESE?") def query_event_status_register(self): return self.query("*ESR?") def set_wait_until_finished(self): self.write("*OPC") def wait_until_finished(self): return self.query("*OPC?") def reset(self): self.write("*RST") def set_service_request_enable(self): self.write("*SRE") def query_service_request_enable(self): return self.query("*SRE?") def query_status_byte(self): return self.query("*STB?") def self_test_result(self): return self.query("*TST?") def wait(self): self.write("*WAI") if __name__ == '__main__': class DummyInstrument(): def fz(self): """ I am fz """ return 34 x = SCPI_PROPERTY(scpi_prfx='SETX', ptype=str, doc='property X') y = SCPI_PROPERTY(scpi_prfx='SETY', ptype=int, doc='property Y') c= DummyInstrument()