From 718d5303104955adbd14326f08112430efc2cebd Mon Sep 17 00:00:00 2001 From: Thomas Lemon Date: Tue, 20 Jan 2026 23:08:07 -0800 Subject: [PATCH 1/6] Use get_latest instead of direct parameter call to get setpoint --- src/qcodes/instrument_drivers/Lakeshore/lakeshore_base.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/qcodes/instrument_drivers/Lakeshore/lakeshore_base.py b/src/qcodes/instrument_drivers/Lakeshore/lakeshore_base.py index 3305230337d8..a4d09ef6a130 100644 --- a/src/qcodes/instrument_drivers/Lakeshore/lakeshore_base.py +++ b/src/qcodes/instrument_drivers/Lakeshore/lakeshore_base.py @@ -488,7 +488,12 @@ def wait_until_set_point_reached( f"be set to 'kelvin'." ) - t_setpoint = self.setpoint() + # NOTE: Getting the setpoint directly from the instrument too soon + # after setting the setpoint may result in the last setpoint + # being returned, in which case the loop below will never exit + # because it is expecting the wrong setpoint. Use get_latest + # to read from the parameter directly instead of the instrument. + t_setpoint = self.setpoint.get_latest() time_now = time.perf_counter() time_enter_tolerance_zone = time_now From d9691a25acd91c7a433b45fa3c38b8f6309d065b Mon Sep 17 00:00:00 2001 From: Thomas Lemon Date: Tue, 20 Jan 2026 23:27:05 -0800 Subject: [PATCH 2/6] Update newsfragment for PR 7796 --- docs/changes/newsfragments/7796.improved_driver | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 docs/changes/newsfragments/7796.improved_driver diff --git a/docs/changes/newsfragments/7796.improved_driver b/docs/changes/newsfragments/7796.improved_driver new file mode 100644 index 000000000000..4b1f825d195e --- /dev/null +++ b/docs/changes/newsfragments/7796.improved_driver @@ -0,0 +1,2 @@ +Fixed bug in Lakeshore driver that was causing blocking_t +to periodically hang indefinitely. From 65d54e22a4c53bb1355fa435fd53268475d59ab8 Mon Sep 17 00:00:00 2001 From: Thomas Lemon Date: Wed, 21 Jan 2026 10:16:43 -0800 Subject: [PATCH 3/6] Use time delay instead of get_latest to ensure correct setpoint returned --- .../Lakeshore/lakeshore_base.py | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/qcodes/instrument_drivers/Lakeshore/lakeshore_base.py b/src/qcodes/instrument_drivers/Lakeshore/lakeshore_base.py index a4d09ef6a130..bc2855416fb2 100644 --- a/src/qcodes/instrument_drivers/Lakeshore/lakeshore_base.py +++ b/src/qcodes/instrument_drivers/Lakeshore/lakeshore_base.py @@ -351,6 +351,22 @@ def __init__( """Duration during which temperature has to be within tolerance""" self.wait_equilibration_time(0.5) + self.setpoint_settle_delay: Parameter = self.add_parameter( + "setpoint_settle_delay", + set_cmd=None, + get_cmd=None, + initial_value=0.5, + vals=vals.Numbers(0, 5), + label="Setpoint settle delay", + docstring="Short time delay to ensure instrument returns correct" + "setpoint when setpoint() is called immediately after setting. This is used" + "inside the function `wait_until_set_point_reached`.", + unit="s", + ) + """Short time delay after setting setpoint to ensure instrument returns correct + setpoint when setpoint() is called immediately after setting. This is used + inside the function `wait_until_set_point_reached`.""" + self.blocking_t: Parameter = self.add_parameter( "blocking_t", label="Setpoint value with blocking until it is reached", @@ -488,12 +504,11 @@ def wait_until_set_point_reached( f"be set to 'kelvin'." ) - # NOTE: Getting the setpoint directly from the instrument too soon - # after setting the setpoint may result in the last setpoint - # being returned, in which case the loop below will never exit - # because it is expecting the wrong setpoint. Use get_latest - # to read from the parameter directly instead of the instrument. - t_setpoint = self.setpoint.get_latest() + # NOTE: Adding a small delay to give the instrument time to + # update its setpoint to ensure correct setpoint is returned, + # otherwise the while loop below will never be exited. + time.sleep(self.setpoint_settle_delay.get_latest()) + t_setpoint = self.setpoint() time_now = time.perf_counter() time_enter_tolerance_zone = time_now From ee7e6f88fcdf308e57e377a9b6f97098b30c95d0 Mon Sep 17 00:00:00 2001 From: Thomas Lemon Date: Wed, 21 Jan 2026 16:26:48 -0800 Subject: [PATCH 4/6] Use post_delay on setpoint instead of extra parameter. --- .../Lakeshore/lakeshore_base.py | 21 +------------------ 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/src/qcodes/instrument_drivers/Lakeshore/lakeshore_base.py b/src/qcodes/instrument_drivers/Lakeshore/lakeshore_base.py index bc2855416fb2..a7f47f59088d 100644 --- a/src/qcodes/instrument_drivers/Lakeshore/lakeshore_base.py +++ b/src/qcodes/instrument_drivers/Lakeshore/lakeshore_base.py @@ -236,6 +236,7 @@ def __init__( get_parser=float, set_cmd=f"SETP {output_index}, {{}}", get_cmd=f"SETP? {output_index}", + post_delay=0.5, # getting setpoint too soon after getting may fetch previous setpoint ) """ The value of the setpoint in the preferred units of the control loop sensor @@ -351,22 +352,6 @@ def __init__( """Duration during which temperature has to be within tolerance""" self.wait_equilibration_time(0.5) - self.setpoint_settle_delay: Parameter = self.add_parameter( - "setpoint_settle_delay", - set_cmd=None, - get_cmd=None, - initial_value=0.5, - vals=vals.Numbers(0, 5), - label="Setpoint settle delay", - docstring="Short time delay to ensure instrument returns correct" - "setpoint when setpoint() is called immediately after setting. This is used" - "inside the function `wait_until_set_point_reached`.", - unit="s", - ) - """Short time delay after setting setpoint to ensure instrument returns correct - setpoint when setpoint() is called immediately after setting. This is used - inside the function `wait_until_set_point_reached`.""" - self.blocking_t: Parameter = self.add_parameter( "blocking_t", label="Setpoint value with blocking until it is reached", @@ -504,10 +489,6 @@ def wait_until_set_point_reached( f"be set to 'kelvin'." ) - # NOTE: Adding a small delay to give the instrument time to - # update its setpoint to ensure correct setpoint is returned, - # otherwise the while loop below will never be exited. - time.sleep(self.setpoint_settle_delay.get_latest()) t_setpoint = self.setpoint() time_now = time.perf_counter() From 21a6f99163a83b7569fe98cefe48a7288ced0682 Mon Sep 17 00:00:00 2001 From: Thomas <56311859+trlemon@users.noreply.github.com> Date: Thu, 22 Jan 2026 10:56:46 -0800 Subject: [PATCH 5/6] Fix typo in comment Co-authored-by: Mikhail Astafev --- src/qcodes/instrument_drivers/Lakeshore/lakeshore_base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qcodes/instrument_drivers/Lakeshore/lakeshore_base.py b/src/qcodes/instrument_drivers/Lakeshore/lakeshore_base.py index a7f47f59088d..fa2f68315d6a 100644 --- a/src/qcodes/instrument_drivers/Lakeshore/lakeshore_base.py +++ b/src/qcodes/instrument_drivers/Lakeshore/lakeshore_base.py @@ -236,7 +236,7 @@ def __init__( get_parser=float, set_cmd=f"SETP {output_index}, {{}}", get_cmd=f"SETP? {output_index}", - post_delay=0.5, # getting setpoint too soon after getting may fetch previous setpoint + post_delay=0.5, # getting setpoint too soon after setting may fetch previous setpoint ) """ The value of the setpoint in the preferred units of the control loop sensor From d53d97e90c7205fbb0635237145abe3a13fada39 Mon Sep 17 00:00:00 2001 From: Thomas <56311859+trlemon@users.noreply.github.com> Date: Thu, 22 Jan 2026 10:57:24 -0800 Subject: [PATCH 6/6] Update docs/changes/newsfragments/7796.improved_driver Co-authored-by: Mikhail Astafev --- docs/changes/newsfragments/7796.improved_driver | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/changes/newsfragments/7796.improved_driver b/docs/changes/newsfragments/7796.improved_driver index 4b1f825d195e..b589ecace548 100644 --- a/docs/changes/newsfragments/7796.improved_driver +++ b/docs/changes/newsfragments/7796.improved_driver @@ -1,2 +1,4 @@ Fixed bug in Lakeshore driver that was causing blocking_t -to periodically hang indefinitely. +to periodically hang indefinitely: a 0.5 seconds post delay was added to +setpoint parameter to ensure that the setpoint value propagated to the +instrument when the set of the setpoint parameter returns.