From 4881f4de3d48af33312333835bce9a5ad07df076 Mon Sep 17 00:00:00 2001 From: rtan Date: Thu, 22 Aug 2024 10:47:10 +0200 Subject: [PATCH] min_range_list in b rotation added --- 20240709SerdarModScript.py | 79 ++++++++++++++++++++++++++++++++++---- 1 file changed, 71 insertions(+), 8 deletions(-) diff --git a/20240709SerdarModScript.py b/20240709SerdarModScript.py index c9a6624..4b8d01b 100644 --- a/20240709SerdarModScript.py +++ b/20240709SerdarModScript.py @@ -303,7 +303,7 @@ def sep_num_from_units(powerbox_output :str)->list: else: return [powerbox_output,] -def query_no_echo(instr:pyvisa.resources.Resource, command:str, sleeptime=0.01)->str: +def query_no_echo(instr:pyvisa.resources.Resource, command:str, sleeptime=0)->str: """helper function for the Attocube APS100 that queries a function to the device, removing the echo. Args: @@ -327,7 +327,7 @@ def query_no_echo(instr:pyvisa.resources.Resource, command:str, sleeptime=0.01)- print(f"Error communicating with instrument: {e}") return None -def write_no_echo(instr:pyvisa.resources.Resource, command:str, sleeptime=0.01)->str: +def write_no_echo(instr:pyvisa.resources.Resource, command:str, sleeptime=0)->str: """helper function for the Attocube APS100 that writes a function to the device, removing the echo. Args: @@ -572,11 +572,60 @@ def sweep_b_val(instr:pyvisa.resources.Resource, min_bval:float, max_bval:float, wl = np.array(loaded_files.wavelength) np.savetxt("Wavelength.txt", wl) + # TODO: write a function that simultaneously controls the two power supplies and perform the rotation of the B-field. => Threading # in function head should be func(instr1, instr2, args1, kwargs1, args2, kwargs2) def b_field_rotation(instr1:pyvisa.resources.Resource, instr2:pyvisa.resources.Resource, - Babs:float, startangle:float, endangle:float, angle_stepsize:float, clockwise=True, sweepdown=False)->None: - pass + Babs:float, startangle:float, endangle:float, angle_stepsize:float, path_save:str, base_file_name:str, anticlockwise=True, sweepdown=False)->None: + """_summary_ + + Args: + instr1 (pyvisa.resources.Resource): _description_ + instr2 (pyvisa.resources.Resource): _description_ + Babs (float): absolute B-field value in T + startangle (float): _description_ + endangle (float): _description_ + angle_stepsize (float): _description_ + anticlockwise (bool, optional): _description_. Defaults to True. + sweepdown (bool, optional): _description_. Defaults to False. + """ + if path_save is None: + path_save = datetime.datetime.now().strftime("%Y_%m_%d_%H%M_hrs_") # TODO: add path_save, base_file_name in the function header + + if base_file_name =='': + base_file_name = datetime.datetime.now().strftime('%Y_%m_%d_%H.%M') + + start_time = time.time() # start of the scan function + + idnstr1 = query_no_echo(instr1, '*IDN?') + + idnstr2 = query_no_echo(instr1, '*IDN?') + + # TODO: find which one is the dual power supply, then, ramp B_x to Babs value + if '2301034' in idnstr1: # serial no. the dual power supply + pass + elif '2101034' in idnstr2: + # swap instruments, instr 1 to be the dual power supply + instr1, instr2 = instr2, instr1 + + # TODO: compare which device has the lower rates, save initial rates lists, then set both devices to the lower rates for each range + # then, set the initial values back + # list of rates (with units) for diff ranges of each device, only up to Range 1 for single power supply as that is already + # the max recommended current. + init_range_lst1 = list(sep_num_from_units(el) for el in query_no_echo(instr1, 'RATE? 0;RATE? 1;RATE? 2').split(';')) + init_range_lst2 = list(sep_num_from_units(el) for el in query_no_echo(instr2, 'RATE? 0;RATE? 1').split(';')) + + min_range_lst = [min(el1[0], el2[0]) for el1,el2 in zip(init_range_lst1, init_range_lst2)] # min rates for each given range + + write_no_echo(instr1, f'RATE 0 {min_range_lst[0]};RATE 1 {min_range_lst[1]}') + write_no_echo(instr2, f'RATE 0 {min_range_lst[0]};RATE 1 {min_range_lst[1]}') + + # TODO: check the device rates and ranges in the lab tmrw or friday + + write_no_echo(instr1, f'CHAN 2;ULIM {Babs*10};SWEEP UP') # sets to B_x, the B_x upper limit and sweeps the magnet field to the upper limit + + # TODO: include the functionalities located in the function above, update function header with the new parameters of path_save, base_file_name + ################################################################# END OF FUNCTION DEFS ########################################################################################### @@ -584,17 +633,29 @@ def b_field_rotation(instr1:pyvisa.resources.Resource, instr2:pyvisa.resources.R # Initialise PYVISA ResourceManager rm = pyvisa.ResourceManager() -# print(rm.list_resources()) # 'ASRL8::INSTR' for dual power supply, 'ASRL9::INSTR' for single power supply +# print(rm.list_resources()) +# 'ASRL8::INSTR' for dual power supply, 'ASRL9::INSTR' for single power supply (online PC) +# 'ASRL10::INSTR' for dual power supply, 'ASRL12::INSTR' for single power supply (offline PC) + # Open the connection with the APS100 dual power supply -powerbox_dualsupply = rm.open_resource('ASRL8::INSTR', - baud_rate=9600, # Example baud rate, adjust as needed +powerbox_dualsupply = rm.open_resource('ASRL10::INSTR', + baud_rate=9600, data_bits=8, parity= pyvisa.constants.Parity.none, stop_bits= pyvisa.constants.StopBits.one, - timeout=5000)# 5000 ms timeout + timeout=100)# 5000 ms timeout + +# Open the connection with the APS100 dual power supply +powerbox_singlesupply = rm.open_resource('ASRL12::INSTR', + baud_rate=9600, + data_bits=8, + parity= pyvisa.constants.Parity.none, + stop_bits= pyvisa.constants.StopBits.one, + timeout=100)# 5000 ms timeout write_no_echo(powerbox_dualsupply, 'REMOTE') # turn on the remote mode +write_no_echo(powerbox_singlesupply, 'REMOTE') # turn on the remote mode # TODO: test functionality of the magnet_coil param later on, should work... as this code below is basically implemented inside the scan func. # select axis for the dual supply, either z-axis(CHAN 1 ^= Supply A) or x-axis(CHAN 2 ^= Supply B) @@ -644,5 +705,7 @@ sweep_b_val(powerbox_dualsupply, set_llim_bval, set_ulim_bval, set_res_bval, 'z- # Internally, axes are numbered 0 to 2 write_no_echo(powerbox_dualsupply, 'LOCAL') # turn off the remote mode +write_no_echo(powerbox_singlesupply, 'LOCAL') # turn off the remote mode # time.sleep(0.5) powerbox_dualsupply.close() +powerbox_singlesupply.close() \ No newline at end of file