dil5: add sorb_heater and still_heater, fix several issues

This commit is contained in:
l_samenv
2026-06-09 14:10:55 +02:00
parent 775566d57a
commit 80decb21cf
3 changed files with 67 additions and 6 deletions
+30 -2
View File
@@ -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,
# )
+5 -2
View File
@@ -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
View File
@@ -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='$'))