From bd324841aa48386e391a63b42dc4bc3736b66b83 Mon Sep 17 00:00:00 2001 From: Jasper-Harvey0 Date: Tue, 26 Mar 2024 13:52:44 +1100 Subject: [PATCH 1/7] Add delay to measurement functions --- src/fixate/drivers/dmm/fluke_8846a.py | 7 ++++++- src/fixate/drivers/dmm/helper.py | 8 +++++++- src/fixate/drivers/dmm/keithley_6500.py | 7 ++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/fixate/drivers/dmm/fluke_8846a.py b/src/fixate/drivers/dmm/fluke_8846a.py index 2a14acd..90d43ba 100644 --- a/src/fixate/drivers/dmm/fluke_8846a.py +++ b/src/fixate/drivers/dmm/fluke_8846a.py @@ -11,6 +11,7 @@ class Fluke8846A(DMM): INSTR_TYPE = "VISA" def __init__(self, instrument, *args, **kwargs): + self.measurement_delay = 0.2 # Delay between call to self.measurement() and querying the DMM. self.instrument = instrument instrument.rtscts = 1 self.lock = Lock() @@ -100,11 +101,15 @@ def trigger(self): self._write("*TRG") # Send trigger to instrument self._is_error() # Catch errors. This might slow things down - def measurement(self): + def measurement(self, delay=False): """ Sets up DMM triggering, creates list of measurements from the read buffer + + delay: If True, will wait for self.measurement_delay seconds before triggering a measurement. returns: a single value as a float """ + if delay: + time.sleep(self.measurement_delay) return self.measurements()[0] def measurements(self): diff --git a/src/fixate/drivers/dmm/helper.py b/src/fixate/drivers/dmm/helper.py index 6093320..64b2e51 100644 --- a/src/fixate/drivers/dmm/helper.py +++ b/src/fixate/drivers/dmm/helper.py @@ -28,7 +28,13 @@ def trigger(self): """ raise NotImplementedError - def measurement(self): + def measurement(self, delay=False): + """ + Trigger and return measurement from the instrument buffer. + + delay: If True, waits for self.measurement_delay seconds then triggers a measurement. + returns: a single value as a float + """ raise NotImplementedError def voltage_ac(self, _range=None): diff --git a/src/fixate/drivers/dmm/keithley_6500.py b/src/fixate/drivers/dmm/keithley_6500.py index 4fe7210..6f50ffe 100644 --- a/src/fixate/drivers/dmm/keithley_6500.py +++ b/src/fixate/drivers/dmm/keithley_6500.py @@ -11,6 +11,7 @@ class Keithley6500(DMM): INSTR_TYPE = "VISA" def __init__(self, instrument, *args, **kwargs): + self.measurement_delay = 0.2 # Delay between call to self.measurement() and querying the DMM. self.instrument = instrument instrument.rtscts = 1 self.lock = Lock() @@ -117,11 +118,15 @@ def trigger(self): self._write("INIT; *WAI") self._is_error() - def measurement(self): + def measurement(self, delay=True): """ Sets up DMM triggering, creates list of measurements from the read buffer + + delay: If True, will wait for self.measurement_delay seconds before triggering a measurement. returns: a single value as a float """ + if delay: + time.sleep(self.measurement_delay) return self.measurements()[0] def measurements(self): From 2de3e31f34db058b43fb172e14f638e53e5d9692 Mon Sep 17 00:00:00 2001 From: Jasper-Harvey0 Date: Tue, 26 Mar 2024 14:20:09 +1100 Subject: [PATCH 2/7] Remove dead code --- src/fixate/drivers/dmm/fluke_8846a.py | 25 ------------------------- src/fixate/drivers/dmm/keithley_6500.py | 8 +++----- 2 files changed, 3 insertions(+), 30 deletions(-) diff --git a/src/fixate/drivers/dmm/fluke_8846a.py b/src/fixate/drivers/dmm/fluke_8846a.py index 90d43ba..f24ed4e 100644 --- a/src/fixate/drivers/dmm/fluke_8846a.py +++ b/src/fixate/drivers/dmm/fluke_8846a.py @@ -1,7 +1,5 @@ from threading import Lock -from pyvisa import constants from fixate.core.exceptions import InstrumentError, ParameterError -from fixate.core.common import mode_builder, deprecated from fixate.drivers.dmm.helper import DMM import time @@ -43,28 +41,8 @@ def __init__(self, instrument, *args, **kwargs): "continuity": "CONF:CONTinuity", "diode": "CONF:DIODe", } - self._filters = { - "voltage_ac": "SENS:VOLT:AC", - "voltage_dc": "SENS:VOLT:DC", - "current_ac": "SENS:CURR:AC", - "current_dc": "SENS:CURR:DC", - "resistance": "SENS:RES", - "fresistance": "SENS:FRES", - None: "", - } self._init_string = "" # Unchanging - self._resolution = { - "voltage_ac": "VOLT:RES", - "voltage_dc": "VOLT:RES", - "current_ac": "CURR:AC:RES", - "current_dc": "CURR:DC:RES", - "resistance": "RES:RES", - "fresistance": "RES:RES", - "capacitance": "CAP:RES", - None: "", - } - @property def samples(self): return self._samples @@ -219,7 +197,6 @@ def _set_measurement_mode(self, mode, _range=None, suffix=None): resistance, fresistance. Reduces previous duplicate code. :param mode: :param _range: - :param _resolution: :return: """ self.mode = mode @@ -287,7 +264,6 @@ def diode(self, low_current=True, high_voltage=False): """ Writes configuration string for diode to the DMM param _range: value set for the range - param _resolution: value set for the resolution """ self._set_measurement_mode( "diode", @@ -298,7 +274,6 @@ def continuity(self): """ Writes configuration string for continuity to the DMM param _range: value set for the range - param _resolution: value set for the resolution """ self._set_measurement_mode("continuity") diff --git a/src/fixate/drivers/dmm/keithley_6500.py b/src/fixate/drivers/dmm/keithley_6500.py index 6f50ffe..162a3e6 100644 --- a/src/fixate/drivers/dmm/keithley_6500.py +++ b/src/fixate/drivers/dmm/keithley_6500.py @@ -1,7 +1,5 @@ from threading import Lock -from pyvisa import constants from fixate.core.exceptions import InstrumentError, ParameterError -from fixate.core.common import mode_builder, deprecated from fixate.drivers.dmm.helper import DMM import time @@ -81,10 +79,10 @@ def local(self): # So just set up a trigger loop. Requires *TRG to be sent to drop it out of the loop (call to remote()). self.samples = 1 self._write("TRIG:LOAD 'EMPTY'") # Load empty model - self._write(f"TRIG:BLOC:MDIG 1, 'defbuffer1', 1") - self._write(f"TRIG:BLOC:DEL:CONS 2, 0.1") + self._write("TRIG:BLOC:MDIG 1, 'defbuffer1', 1") + self._write("TRIG:BLOC:DEL:CONS 2, 0.1") self._write("TRIG:BLOC:BRAN:EVEN 3, COMM, 5") - self._write(f"TRIG:BLOC:BRAN:ALW 4, 1") + self._write("TRIG:BLOC:BRAN:ALW 4, 1") self._write("TRIG:BLOC:BUFF:CLE 5") self._write("TRAC:CLE") self._write("INIT") From 3fbfca7a479cbe7f67c1a31cebfe663c1618f259 Mon Sep 17 00:00:00 2001 From: Jasper-Harvey0 Date: Tue, 26 Mar 2024 14:25:06 +1100 Subject: [PATCH 3/7] Black format --- src/fixate/drivers/dmm/__init__.py | 6 +----- src/fixate/drivers/dmm/fluke_8846a.py | 10 +++++----- src/fixate/drivers/dmm/keithley_6500.py | 16 ++++++---------- 3 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/fixate/drivers/dmm/__init__.py b/src/fixate/drivers/dmm/__init__.py index e77c5b1..071cb44 100644 --- a/src/fixate/drivers/dmm/__init__.py +++ b/src/fixate/drivers/dmm/__init__.py @@ -18,9 +18,7 @@ def open() -> DMM: - for DMM in (Fluke8846A, Keithley6500): - instrument = find_instrument_by_id(DMM.REGEX_ID) if instrument is not None: # We've found a configured instrument so try to open it @@ -28,9 +26,7 @@ def open() -> DMM: try: resource = rm.open_resource(instrument.address) except pyvisa.VisaIOError as e: - raise InstrumentOpenError( - f"Unable to open DMM: {instrument.address}" - ) from e + raise InstrumentOpenError(f"Unable to open DMM: {instrument.address}") from e # Instantiate driver with connected instrument driver = DMM(resource) fixate.drivers.log_instrument_open(driver) diff --git a/src/fixate/drivers/dmm/fluke_8846a.py b/src/fixate/drivers/dmm/fluke_8846a.py index f24ed4e..964e857 100644 --- a/src/fixate/drivers/dmm/fluke_8846a.py +++ b/src/fixate/drivers/dmm/fluke_8846a.py @@ -9,7 +9,9 @@ class Fluke8846A(DMM): INSTR_TYPE = "VISA" def __init__(self, instrument, *args, **kwargs): - self.measurement_delay = 0.2 # Delay between call to self.measurement() and querying the DMM. + self.measurement_delay = ( + 0.2 # Delay between call to self.measurement() and querying the DMM. + ) self.instrument = instrument instrument.rtscts = 1 self.lock = Lock() @@ -82,7 +84,7 @@ def trigger(self): def measurement(self, delay=False): """ Sets up DMM triggering, creates list of measurements from the read buffer - + delay: If True, will wait for self.measurement_delay seconds before triggering a measurement. returns: a single value as a float """ @@ -186,9 +188,7 @@ def _is_error(self, silent=False): else: raise InstrumentError( "Error(s) Returned from DMM\n" - + "\n".join( - [f"Code: {code}\nMessage:{msg}" for code, msg in errors] - ) + + "\n".join([f"Code: {code}\nMessage:{msg}" for code, msg in errors]) ) def _set_measurement_mode(self, mode, _range=None, suffix=None): diff --git a/src/fixate/drivers/dmm/keithley_6500.py b/src/fixate/drivers/dmm/keithley_6500.py index 162a3e6..b6df567 100644 --- a/src/fixate/drivers/dmm/keithley_6500.py +++ b/src/fixate/drivers/dmm/keithley_6500.py @@ -9,7 +9,9 @@ class Keithley6500(DMM): INSTR_TYPE = "VISA" def __init__(self, instrument, *args, **kwargs): - self.measurement_delay = 0.2 # Delay between call to self.measurement() and querying the DMM. + self.measurement_delay = ( + 0.2 # Delay between call to self.measurement() and querying the DMM. + ) self.instrument = instrument instrument.rtscts = 1 self.lock = Lock() @@ -66,9 +68,7 @@ def samples(self, val): # Clip values to upper and lower bounds. DMM likes to crash if set out of bounds if val < 1 or val > 1000000: - raise ParameterError( - "Number of samples out of bounds. Must be between 1 and 1000000" - ) + raise ParameterError("Number of samples out of bounds. Must be between 1 and 1000000") self._write(f":COUN {val}") self._is_error() @@ -227,9 +227,7 @@ def _is_error(self, silent=False): else: raise InstrumentError( "Error(s) Returned from DMM\n" - + "\n".join( - [f"Code: {code}\nMessage:{msg}" for code, msg in errors] - ) + + "\n".join([f"Code: {code}\nMessage:{msg}" for code, msg in errors]) ) def _set_measurement_mode(self, mode, _range=None, suffix=None): @@ -282,9 +280,7 @@ def frequency(self, _range=None, _volt_range=None): command = None if _volt_range: # Have to construct an alternative commnad for FREQuency range - command = ( - f"; :SENS:FREQ:THR:RANG:AUTO OFF; :SENS:FREQ:THR:RANG {_volt_range}" - ) + command = f"; :SENS:FREQ:THR:RANG:AUTO OFF; :SENS:FREQ:THR:RANG {_volt_range}" self._set_measurement_mode("frequency", suffix=command) def period(self, _range=None, _volt_range=None): From f77a4ca297584e1d191b59bcb40206a87b7180a0 Mon Sep 17 00:00:00 2001 From: Jasper-Harvey0 Date: Tue, 26 Mar 2024 14:53:49 +1100 Subject: [PATCH 4/7] Reformat without line-length=100 --- src/fixate/drivers/dmm/__init__.py | 4 +++- src/fixate/drivers/dmm/fluke_8846a.py | 4 +++- src/fixate/drivers/dmm/keithley_6500.py | 12 +++++++++--- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/fixate/drivers/dmm/__init__.py b/src/fixate/drivers/dmm/__init__.py index 071cb44..fcf83cf 100644 --- a/src/fixate/drivers/dmm/__init__.py +++ b/src/fixate/drivers/dmm/__init__.py @@ -26,7 +26,9 @@ def open() -> DMM: try: resource = rm.open_resource(instrument.address) except pyvisa.VisaIOError as e: - raise InstrumentOpenError(f"Unable to open DMM: {instrument.address}") from e + raise InstrumentOpenError( + f"Unable to open DMM: {instrument.address}" + ) from e # Instantiate driver with connected instrument driver = DMM(resource) fixate.drivers.log_instrument_open(driver) diff --git a/src/fixate/drivers/dmm/fluke_8846a.py b/src/fixate/drivers/dmm/fluke_8846a.py index 964e857..cbdec8f 100644 --- a/src/fixate/drivers/dmm/fluke_8846a.py +++ b/src/fixate/drivers/dmm/fluke_8846a.py @@ -188,7 +188,9 @@ def _is_error(self, silent=False): else: raise InstrumentError( "Error(s) Returned from DMM\n" - + "\n".join([f"Code: {code}\nMessage:{msg}" for code, msg in errors]) + + "\n".join( + [f"Code: {code}\nMessage:{msg}" for code, msg in errors] + ) ) def _set_measurement_mode(self, mode, _range=None, suffix=None): diff --git a/src/fixate/drivers/dmm/keithley_6500.py b/src/fixate/drivers/dmm/keithley_6500.py index b6df567..0b9d08b 100644 --- a/src/fixate/drivers/dmm/keithley_6500.py +++ b/src/fixate/drivers/dmm/keithley_6500.py @@ -68,7 +68,9 @@ def samples(self, val): # Clip values to upper and lower bounds. DMM likes to crash if set out of bounds if val < 1 or val > 1000000: - raise ParameterError("Number of samples out of bounds. Must be between 1 and 1000000") + raise ParameterError( + "Number of samples out of bounds. Must be between 1 and 1000000" + ) self._write(f":COUN {val}") self._is_error() @@ -227,7 +229,9 @@ def _is_error(self, silent=False): else: raise InstrumentError( "Error(s) Returned from DMM\n" - + "\n".join([f"Code: {code}\nMessage:{msg}" for code, msg in errors]) + + "\n".join( + [f"Code: {code}\nMessage:{msg}" for code, msg in errors] + ) ) def _set_measurement_mode(self, mode, _range=None, suffix=None): @@ -280,7 +284,9 @@ def frequency(self, _range=None, _volt_range=None): command = None if _volt_range: # Have to construct an alternative commnad for FREQuency range - command = f"; :SENS:FREQ:THR:RANG:AUTO OFF; :SENS:FREQ:THR:RANG {_volt_range}" + command = ( + f"; :SENS:FREQ:THR:RANG:AUTO OFF; :SENS:FREQ:THR:RANG {_volt_range}" + ) self._set_measurement_mode("frequency", suffix=command) def period(self, _range=None, _volt_range=None): From e67f44d344beb4172f06b695486ec003021cc0b8 Mon Sep 17 00:00:00 2001 From: Jasper-Harvey0 Date: Thu, 28 Mar 2024 14:32:36 +1100 Subject: [PATCH 5/7] Update measurement delay functionality --- src/fixate/drivers/dmm/fluke_8846a.py | 16 +++++++++------- src/fixate/drivers/dmm/keithley_6500.py | 14 ++++++++------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/fixate/drivers/dmm/fluke_8846a.py b/src/fixate/drivers/dmm/fluke_8846a.py index cbdec8f..42b2243 100644 --- a/src/fixate/drivers/dmm/fluke_8846a.py +++ b/src/fixate/drivers/dmm/fluke_8846a.py @@ -9,9 +9,8 @@ class Fluke8846A(DMM): INSTR_TYPE = "VISA" def __init__(self, instrument, *args, **kwargs): - self.measurement_delay = ( - 0.2 # Delay between call to self.measurement() and querying the DMM. - ) + # Delay between call to self.measurement() and querying the DMM. + self.measurement_delay = 0 self.instrument = instrument instrument.rtscts = 1 self.lock = Lock() @@ -81,15 +80,18 @@ def trigger(self): self._write("*TRG") # Send trigger to instrument self._is_error() # Catch errors. This might slow things down - def measurement(self, delay=False): + def measurement(self, delay=None): """ Sets up DMM triggering, creates list of measurements from the read buffer - delay: If True, will wait for self.measurement_delay seconds before triggering a measurement. + delay: If not set, will wait for self.measurement_delay seconds before triggering a measurement. If set, will wait for delay seconds before triggering a measurement. returns: a single value as a float """ - if delay: - time.sleep(self.measurement_delay) + if delay is None: + delay = self.measurement_delay + + if delay > 0: + time.sleep(delay) return self.measurements()[0] def measurements(self): diff --git a/src/fixate/drivers/dmm/keithley_6500.py b/src/fixate/drivers/dmm/keithley_6500.py index 0b9d08b..f069abb 100644 --- a/src/fixate/drivers/dmm/keithley_6500.py +++ b/src/fixate/drivers/dmm/keithley_6500.py @@ -9,9 +9,8 @@ class Keithley6500(DMM): INSTR_TYPE = "VISA" def __init__(self, instrument, *args, **kwargs): - self.measurement_delay = ( - 0.2 # Delay between call to self.measurement() and querying the DMM. - ) + # Delay between call to self.measurement() and querying the DMM. + self.measurement_delay = 0.2 self.instrument = instrument instrument.rtscts = 1 self.lock = Lock() @@ -122,11 +121,14 @@ def measurement(self, delay=True): """ Sets up DMM triggering, creates list of measurements from the read buffer - delay: If True, will wait for self.measurement_delay seconds before triggering a measurement. + delay: If not set, will wait for self.measurement_delay seconds before triggering a measurement. If set, will wait for delay seconds before triggering a measurement. returns: a single value as a float """ - if delay: - time.sleep(self.measurement_delay) + if delay is None: + delay = self.measurement_delay + + if delay > 0: + time.sleep(delay) return self.measurements()[0] def measurements(self): From e86e9d02b3ddb3ad56a6bc562ff17f5c888f4c8c Mon Sep 17 00:00:00 2001 From: Jasper-Harvey0 Date: Thu, 9 May 2024 09:59:53 +1000 Subject: [PATCH 6/7] Update release notes --- docs/source/release-notes.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/source/release-notes.rst b/docs/source/release-notes.rst index a765b5d..ac9e8e9 100644 --- a/docs/source/release-notes.rst +++ b/docs/source/release-notes.rst @@ -1,6 +1,18 @@ ================================== Release Notes ================================== +************* +Version 0.6.2 +************* +Release Date xx/xx/xxxx + +New Features +############ + +Improvements +############ +- Update DMM driver with optional measurement delay to improve DMM model compatibility. + ************* Version 0.6.1 ************* From 30b6434fc37bec420ca8790ba0c1dd6c3b96aafe Mon Sep 17 00:00:00 2001 From: Jasper-Harvey0 Date: Tue, 28 May 2024 07:07:16 +1000 Subject: [PATCH 7/7] Fix function definitions for measurement delay. --- src/fixate/drivers/dmm/helper.py | 2 +- src/fixate/drivers/dmm/keithley_6500.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fixate/drivers/dmm/helper.py b/src/fixate/drivers/dmm/helper.py index 64b2e51..f4eb7e2 100644 --- a/src/fixate/drivers/dmm/helper.py +++ b/src/fixate/drivers/dmm/helper.py @@ -28,7 +28,7 @@ def trigger(self): """ raise NotImplementedError - def measurement(self, delay=False): + def measurement(self, delay=None): """ Trigger and return measurement from the instrument buffer. diff --git a/src/fixate/drivers/dmm/keithley_6500.py b/src/fixate/drivers/dmm/keithley_6500.py index f069abb..b6c0e6d 100644 --- a/src/fixate/drivers/dmm/keithley_6500.py +++ b/src/fixate/drivers/dmm/keithley_6500.py @@ -117,7 +117,7 @@ def trigger(self): self._write("INIT; *WAI") self._is_error() - def measurement(self, delay=True): + def measurement(self, delay=None): """ Sets up DMM triggering, creates list of measurements from the read buffer