dil5: add sorb_heater and still_heater, fix several issues
This commit is contained in:
+30
-2
@@ -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,
|
||||
# )
|
||||
|
||||
@@ -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):
|
||||
|
||||
+32
-2
@@ -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='$'))
|
||||
|
||||
Reference in New Issue
Block a user