fs: improve and fix implementation

+ introduce WrapControlledBy and fix HasControlledBy

this in a new module before mercury/triton have been fixed
This commit is contained in:
2025-06-27 14:47:21 +02:00
parent 8385461163
commit a3d0549199
5 changed files with 261 additions and 54 deletions

View File

@@ -47,6 +47,7 @@ Mod('out',
from frappy.core import StringIO, Readable, Parameter, FloatRange, Writable, HasIO, BoolType
from frappy.ctrlby import HasControlledBy
# define the IO class
@@ -65,10 +66,10 @@ class Power(HasIO, Readable):
return volt*current
class Output(HasIO, Writable):
class Output(HasIO, HasControlledBy, Writable):
value = Parameter(datatype=FloatRange(0,100,unit='%'), default=0)
target = Parameter(datatype=FloatRange(0,100,unit='%'))
p_value = Parameter(datatype=FloatRange(0,100,unit='%'), default=0)
p_value = Parameter('?', datatype=FloatRange(0,100,unit='%'), default=0)
maxvolt = Parameter('voltage at 100%',datatype=FloatRange(0,60,unit='V'),default=50,readonly=False)
maxcurrent = Parameter('current at 100%',datatype=FloatRange(0,5,unit='A'),default=2,readonly=False)
output_enable = Parameter('control on/off', BoolType(), readonly=False)
@@ -77,7 +78,7 @@ class Output(HasIO, Writable):
super().initModule()
self.write_output_enable(False)
def write_target(self, target):
def set_target(self, target):
self.write_output_enable(target != 0)
self.communicate(f'VOLT{round(max(8,(target)**0.5 * self.maxvolt)):03d}')
self.communicate(f'CURR{round((target)**0.5* 10 * self.maxcurrent):03d}')

View File

@@ -20,9 +20,9 @@
"""interlocks for furnace"""
from frappy.core import Module, Writable, Attached, Parameter, FloatRange, Readable,\
BoolType, ERROR, IDLE
BoolType, ERROR, IDLE, Command
from frappy.errors import ImpossibleError
from frappy.mixins import HasControlledBy
from frappy.ctrlby import WrapControlledBy
from frappy_psi.picontrol import PImixin
from frappy_psi.convergence import HasConvergence
from frappy_psi.ionopimax import CurrentInput, LogVoltageInput
@@ -86,12 +86,12 @@ class Interlocks(Writable):
self.value = False
if self.control.control_active:
self.log.error('switch control off %r', self.control.status)
self.control.write_control_active(False)
self.control.status = ERROR, self._conditions
self.control.write_control_active(False)
if self.htr and self.htr.target:
self.htr.write_target(0)
if self.relais and (self.relais.value or self.relais.target):
self.relais.write_target(False)
if self.relais.value or self.relais.target:
self.log.warning('switch off relais %r %r', self.relais.value, self.relais.target)
self.relais.write_target(False)
def read_status(self):
conditions = []
@@ -112,35 +112,46 @@ class Interlocks(Writable):
return IDLE, '; '.join(conditions)
return ERROR, self._off_reason
@Command
def reset(self):
"""reset interlock after error
class PI(HasConvergence, PImixin):
will fail if error conditions still apply
"""
self.write_target(1)
class PI(HasConvergence, PImixin, Writable):
input_module = Attached(Readable, 'the input module')
relais = Attached(Writable, 'the interlock relais', mandatory=False)
def read_value(self):
return self.input.value
return self.input_module.value
def write_target(self, value):
super().write_target(value)
def read_status(self):
return self.input_module.status
def set_target(self, value):
super().set_target(value)
if self.relais:
if not self.relais.value or not self.relais.target:
self.log.warning('switch on relais %r %r', self.relais.value, self.relais.target)
self.relais.write_target(1)
class TdkOutput(HasControlledBy, tdkpower.Output):
class PIctrl(WrapControlledBy, PI):
pass
class BkOutput(HasControlledBy, bkpower.Output):
pass
class PI2(PI):
maxovershoot = Parameter('max. overshoot', FloatRange(0, 100, unit='%'), readonly=False, default=20)
def doPoll(self):
self.output_max = self.target * (1 + 0.01 * self.maxovershoot)
self.output_min = self.target * (1 - 0.01 * self.maxovershoot)
super().doPoll()
class PRtransmitter(CurrentInput):
rawrange = (0.004, 0.02)
extendedrange = (0.0036, 0.021)
class PKRgauge(LogVoltageInput):
rawrange = (1.82, 8.6)
valuerange = (5e-9, 1000)
extendedrange = (0.5, 9.5)
value = Parameter(unit='mbar')
def write_target(self, target):
if not self.control_active:
self.output_module.write_target(target)
super().write_target(target)

View File

@@ -63,7 +63,7 @@ import math
from frappy.core import Readable, Writable, Parameter, Attached, IDLE, Property
from frappy.lib import clamp
from frappy.datatypes import LimitsType, EnumType, BoolType, FloatRange
from frappy.newmixins import HasOutputModule
from frappy.ctrlby import HasOutputModule
from frappy_psi.convergence import HasConvergence
@@ -75,12 +75,14 @@ class PImixin(HasOutputModule, Writable):
output_min = Parameter('min output', FloatRange(), default=0, readonly=False)
output_max = Parameter('max output', FloatRange(), default=0, readonly=False)
output_func = Parameter('output function',
EnumType(lin=0, square=1), readonly=False, default=0)
EnumType(lin=0, square=1), readonly=False, value=0)
value = Parameter(unit='K')
_lastdiff = None
_lasttime = 0
_get_range = None # a function get output range from output_module
_overflow = 0
_cvt2int = None
_cvt2ext = None
def initModule(self):
super().initModule()
@@ -149,11 +151,10 @@ class PImixin(HasOutputModule, Writable):
if not value:
self.output_module.write_target(0)
def write_target(self, _):
def set_target(self, value):
if not self.control_active:
self.activate_control()
# unchecked!
class PI(HasConvergence, PImixin):
@@ -178,4 +179,3 @@ class PI2(PI):
if not self.control_active:
self.output.write_target(target)
super().write_target(target)