frappy_psi.thermofisher improvements

- merge Loop with Sensor
- make convergence work

Change-Id: Iba0cafc524ada6d490b7a5c30f4127e77fd163f3
This commit is contained in:
zolliker 2023-06-05 09:49:03 +02:00
parent 9e52665b88
commit 720d010c47
2 changed files with 22 additions and 23 deletions

View File

@ -14,10 +14,6 @@ Mod('T',
'holder temperature',
io='io',
target=Param(max=100),
)
Mod('Th',
'frappy_psi.thermofisher.SensorA10',
'heat exch. temperature',
io='io',
tolerance=0.5,
settling_time=20,
)

View File

@ -73,8 +73,8 @@
"""
from frappy.core import StringIO, Parameter, Readable, HasIO, \
Drivable, FloatRange, IDLE, ERROR, WARN, BoolType
from frappy.core import StringIO, Parameter, HasIO, \
Drivable, FloatRange, IDLE, BUSY, ERROR, WARN, BoolType
from frappy_psi.convergence import HasConvergence
@ -83,9 +83,20 @@ class ThermFishIO(StringIO):
identification = [('RVER', r'.*')] # Firmware Version
class SensorA10(HasIO, Readable):
class TemperatureLoopA10(HasConvergence, HasIO, Drivable):
ioClass = ThermFishIO
value = Parameter('internal temperature', unit='degC')
value = Parameter('temperature', unit='degC')
target = Parameter('setpoint/target', datatype=FloatRange, unit='degC', default=0)
circ_on = Parameter('is circulation running', BoolType(), readonly=False, default=False)
# pids
p_heat = Parameter('proportional heat parameter', FloatRange(), readonly=False)
i_heat = Parameter('integral heat parameter', FloatRange(), readonly=False)
d_heat = Parameter('derivative heat parameter', FloatRange(), readonly=False)
p_cool = Parameter('proportional cool parameter', FloatRange(), readonly=False)
i_cool = Parameter('integral cool parameter', FloatRange(), readonly=False)
d_cool = Parameter('derivative cool parameter', FloatRange(), readonly=False)
status_messages = [
(ERROR, 'high tempr. cutout fault', 2, 0),
(ERROR, 'high RA tempr. fault', 2, 1),
@ -138,22 +149,14 @@ class SensorA10(HasIO, Readable):
for status_type, status_msg, vi, bit in self.status_messages:
if values_int[vi-1] & (1 << bit):
conv_status = HasConvergence.read_status(self)
if self.isBusy(conv_status):
# use 'inside tolerance' and 'outside tolerance' from HasConvergence,
# else our own status
return BUSY, conv_status[1] if 'tolerance' in conv_status[1] else status_msg
return status_type, status_msg
return WARN, 'circulation off'
class TemperatureLoopA10(SensorA10, Drivable):
value = Parameter('temperature', unit='degC')
target = Parameter('setpoint/target', datatype=FloatRange, unit='degC', default=0)
circ_on = Parameter('is circulation running', BoolType(), readonly=False, default=False)
# pids
p_heat = Parameter('proportional heat parameter', FloatRange(), readonly=False)
i_heat = Parameter('integral heat parameter', FloatRange(), readonly=False)
d_heat = Parameter('derivative heat parameter', FloatRange(), readonly=False)
p_cool = Parameter('proportional cool parameter', FloatRange(), readonly=False)
i_cool = Parameter('integral cool parameter', FloatRange(), readonly=False)
d_cool = Parameter('derivative cool parameter', FloatRange(), readonly=False)
def read_circ_on(self):
return self.communicate('RO')
@ -171,7 +174,7 @@ class TemperatureLoopA10(SensorA10, Drivable):
"""
self.write_circ_on('1')
self.communicate(f'SS {target}')
# self.start_state()
self.convergence_start()
return target
## heat PID