3 Commits
paul ... flame

Author SHA1 Message Date
077a182b4d frappy_psi.cryoltd (flame): improvements
- better error handling
- make persistency mode persistent
- read setpoint from HW
2025-11-25 14:03:51 +01:00
3e7e53135c KJ35: changed flame magnet default tolerance 2024-07-12 09:46:51 +02:00
57b567f453 move magnet from flamedil bananapi to flamemag raspberry 2024-06-12 11:19:18 +02:00
3 changed files with 35 additions and 12 deletions

View File

@@ -1,12 +1,14 @@
Node('flamemag.psi.ch',
'flame magnet',
interface='tcp://5000'
interface='tcp://5000',
)
sea_cfg = 'flamemag.config'
Mod('cio',
'frappy_psi.cryoltd.IO',
'IO to cryo ltd software',
uri='tcp://flamedil:3128',
uri='tcp://flamemag:3128',
)
Mod('main',
@@ -24,7 +26,7 @@ Mod('B',
target=Param(
max=35000.0,
),
mode='PERSISTENT',
#mode='PERSISTENT',
hw_units='T',
A_to_G=285.73,
ramp=Param(
@@ -32,7 +34,7 @@ Mod('B',
),
overshoot={'o': 1.0, 't': 180.0},
degauss={'s': 500.0, 'd': 30.0, 'f': 5.0, 't': 120.0},
tolerance=5.0,
tolerance=50.0,
wait_switch_on = 30,
wait_switch_off = 30,
wait_stable_field=180.0,

View File

@@ -29,7 +29,8 @@ import re
import time
from math import copysign
from frappy.core import HasIO, StringIO, Readable, Drivable, Parameter, Command, \
Module, Property, Attached, Enum, IDLE, BUSY, ERROR
Module, Property, Attached, Enum, IDLE, BUSY, ERROR, nopoll, PersistentParam, \
PersistentMixin
from frappy.errors import ConfigError, BadValueError, HardwareError
from frappy.datatypes import FloatRange, StringType, EnumType, StructOf
from frappy.states import HasStates, status_code, Retry
@@ -41,7 +42,10 @@ VALUE_UNIT = re.compile(r'([-0-9.E]*\d|inf)([A-Za-z/%]*)$')
def as_float(value):
"""converts string (with unit) to float"""
try:
return float(VALUE_UNIT.match(value).group(1))
except Exception:
raise ValueError(f'can not convert {value!r} to float with unit')
BOOL_MAP = {'TRUE': True, 'FALSE': False}
@@ -113,6 +117,8 @@ class Main(HasIO, Module):
# ignore multiline values
# if needed, we may collect here and treat with a special key
continue
if not value:
continue # silently ignore empty values
obj, pname, cvt = self.params_map.get(key, missing)
if obj:
if not hasattr(obj, pname):
@@ -268,7 +274,7 @@ class BaseMagfield(HasStates, Channel):
def cvt_error(self, text):
if text != self._last_error:
self._last_error = text
self.log.error(text)
self.log.error(f'{self.channel}_Error: {text}')
return text
return self._error_text
@@ -287,6 +293,11 @@ class BaseMagfield(HasStates, Channel):
ramp = Parameter()
target = Parameter()
@nopoll
def read_setpoint(self):
self.main.doPoll()
return self.setpoint
def write_ramp(self, ramp):
if self._rate_units != 'A/s':
self.sendcmd('Set:<CH>:ChangeRateUnits A/s')
@@ -323,9 +334,18 @@ class BaseMagfield(HasStates, Channel):
return super().start_field_change
def start_ramp_to_target(self, sm):
try:
self.start_sweep(sm.target)
self.log.info('start_ramp_to_target: start_sweep done')
except Exception as e:
self.log.error('start_ramp_to_target: start_sweep failed with %r', e)
raise
return self.ramp_to_target # -> stabilize_field
# def start_ramp_to_target(self, sm):
# self.start_sweep(sm.target)
# return self.ramp_to_target # -> stabilize_field
def stabilize_field(self, sm):
if self._ready_text == 'FALSE':
# wait for overshoot/degauss/cycle
@@ -432,7 +452,7 @@ class BaseMagfield(HasStates, Channel):
self._error_text = ''
class MainField(BaseMagfield, magfield.Magfield):
class MainField(PersistentMixin, BaseMagfield, magfield.Magfield):
checked_modules = None
def earlyInit(self):
@@ -456,12 +476,13 @@ class MainField(BaseMagfield, magfield.Magfield):
super().check_limits(value)
self.check_combined(None, 0, value)
mode = Parameter(datatype=EnumType(PersistencyMode))
mode = PersistentParam(datatype=EnumType(PersistencyMode))
def write_mode(self, mode):
self.reset_error()
super().write_mode(mode) # updates mode
return mode
self.mode = mode
self.saveParameters()
@status_code('PREPARING')
def start_ramp_to_field(self, sm):

View File

@@ -112,7 +112,7 @@ class SimpleMagfield(HasStates, Drivable):
last = self._last_target
if last is None:
try:
last = self.setpoint # get read back from HW, if available
last = self.read_setpoint() # get read back from HW, if available
except Exception:
pass
if last is None or abs(last - self.value) > self.tolerance: