diff --git a/cfg/dil5_cfg.py b/cfg/dil5_cfg.py index 3b8065b0..d5b9d1b4 100644 --- a/cfg/dil5_cfg.py +++ b/cfg/dil5_cfg.py @@ -292,7 +292,7 @@ Mod('dil', ## Dilution lakeshore Temperature controller -Mod('io_ls273', +Mod('io_ls', 'frappy_psi.ls372.StringIO', 'io for Ls372', uri=lsc_uri, @@ -301,7 +301,7 @@ Mod('io_ls273', Mod('sw', 'frappy_psi.ls372.Switcher', 'channel switcher', - io = 'io_ls273', + io = 'io_ls', ) Mod('T_ivc', @@ -338,4 +338,32 @@ Mod('T_mix', channel = 5, htrrng = '1mA', switcher = 'sw', + meaning = ['temperature', 30], ) + +Mod('htr_sorb', + 'frappy_psi.ls372.SorbHeater', + 'sorb heater', + io = 'io_ls', + output = 1, + fullpower = 5, +) + +Mod('htr_still', + 'frappy_psi.ls372.SorbHeater', + 'sorb heater', + io = 'io_ls', + output = 2, + fullpower = 0.2, +) + +#Mod('T_sorb_reg', +# 'frappy_psi.picontrol.PIctrl', +# 'controlled mix ch. temperature', +# input_module = 'T_sorb', +# output_module = 'htr_sorb', +# output_min = 0, +# output_max = 3.6, +# p = 0.05, +# itime = 120, +# ) diff --git a/frappy_psi/dilution.py b/frappy_psi/dilution.py index 03a2bbe0..35755778 100644 --- a/frappy_psi/dilution.py +++ b/frappy_psi/dilution.py @@ -187,7 +187,7 @@ class Dilution(HasStates, Drivable): pulse_time = 60 * self.pulse_factor / pdump if pulse_time > 59: self.log.info('open V9') - self.condense_value.write_target(1) + self.condense_valve.write_target(1) else: self.log.info('V9 pulse %r', pulse_time) self._start_time = state.now @@ -222,11 +222,12 @@ class Dilution(HasStates, Drivable): def circulate(self, state): """Zirkuliert die Mischung.""" if state.init: + # self.value = V.circulating self.handle_valves(**self.condense_valves) if self.wait_valves(): return Retry self.check_valve_result() - self.value = V.circulating + # self.value = V.circulating return Finish @status_code(BUSY, 'remove (wait for turbo shut down)') @@ -234,6 +235,7 @@ class Dilution(HasStates, Drivable): """Entfernt die Mischung.""" if state.init: + # self.value = V.removing self.handle_valves(**self.remove_valves) if self.turbopump is not None: self._start_time = state.now @@ -282,6 +284,7 @@ class Dilution(HasStates, Drivable): return Retry self.check_valve_result() self._warn_manual_work = True + # self.value = V.off return self.final_status(WARN, 'please check manual valves') def read_status(self): diff --git a/frappy_psi/ls372.py b/frappy_psi/ls372.py index 1cbfbe93..bbec51f7 100644 --- a/frappy_psi/ls372.py +++ b/frappy_psi/ls372.py @@ -26,11 +26,12 @@ the hardware state. """ import time +from math import sqrt import frappy.io from frappy.datatypes import BoolType, EnumType, FloatRange, IntRange from frappy.lib import formatStatusBits -from frappy.core import Command, Drivable, Parameter, Property, CommonReadHandler, CommonWriteHandler +from frappy.core import Command, Drivable, Parameter, Property, CommonReadHandler, CommonWriteHandler, Writable, HasIO from frappy.extparams import StructParam from frappy_psi.convergence import HasConvergence from frappy_psi.channelswitcher import Channel, ChannelSwitcher @@ -196,7 +197,7 @@ class ResChannel(Channel): enabled = Parameter('is this channel enabled?', datatype=BoolType(), readonly=False) pause = Parameter('pause after channel change', datatype=FloatRange(3, 60, unit='s'), readonly=False) dwell = Parameter('dwell time with autoscan', datatype=FloatRange(1, 200, unit='s'), readonly=False) - filter = Parameter('filter time', datatype=FloatRange(1, 200, unit='s'), readonly=False) + filter = Parameter('filter time', datatype=FloatRange(0, 200, unit='s'), readonly=False) _toggle_autorange = 'init' _prev_rdgrng = (1, 1) # last read values for icur and exc @@ -377,6 +378,35 @@ class TemperatureChannel(ResChannel): return self.value if self.enabled else 0 +class SorbHeater(HasIO, Writable): + value = Parameter('heater output', FloatRange(0, unit='W')) + target = Parameter('heater output', FloatRange(0, unit='$'), readonly=False, default=0) + output = Property('output channel', IntRange(0, 2), default=1) + heater_range = Parameter('heater range', IntRange(0, 1), readonly=False) + target_max = Parameter('max power', FloatRange(0, unit='$'), readonly=False, default=5) + fullpower = Parameter('power at 100 %', FloatRange(0, unit='$'), readonly=False, default=5) + + def write_target(self, value): + percent = 100 * sqrt(value / self.fullpower) + ch = self.output + on = bool(value) + if on != bool(self.heater_range): + self.write_heater_range(on) + percent = parse1(self.communicate(f'MOUT {ch},{percent};MOUT?{ch}')) + return (percent * 0.01) ** 2 * self.fullpower + + def read_value(self): + percent = parse1(self.communicate(f'MOUT?{self.output}')) + return (percent * 0.01) ** 2 * self.fullpower + + def write_heater_range(self, value): + ch = self.output + return parse1(self.communicate(f'RANGE {ch},{value};RANGE?{ch}')) + + def read_heater_range(self): + return parse1(self.communicate(f'RANGE?{self.output}')) + + class TemperatureLoop(HasConvergence, TemperatureChannel, Drivable): loop = Property('lakshore loop', IntRange(0, 1), default=0) # TODO: implemented specific issues of loop 1 target = Parameter('setpoint', FloatRange(0, unit='$'))