From 2238c20a373ab5a6817ef782d1cb6ce3a72dae1e Mon Sep 17 00:00:00 2001 From: Markus Zolliker Date: Thu, 22 May 2025 15:11:21 +0200 Subject: [PATCH] DIL5: improve states in the state machine --- frappy_psi/dilution_statemachine.py | 124 ++++++++++++++++------------ frappy_psi/logo.py | 4 +- 2 files changed, 74 insertions(+), 54 deletions(-) diff --git a/frappy_psi/dilution_statemachine.py b/frappy_psi/dilution_statemachine.py index 6f150fa..9f12f87 100644 --- a/frappy_psi/dilution_statemachine.py +++ b/frappy_psi/dilution_statemachine.py @@ -43,8 +43,8 @@ class Dilution(HasStates, Drivable): dump_valve = Attached() circulate_pump = Attached() - compressor = Attached(mandatory=(False)) - turbopump = Attached(mandatory=(False)) + compressor = Attached(mandatory=False) + turbopump = Attached(mandatory=False) condenseline_valve = Attached() circuitshort_valve = Attached() still_pressure = Attached() @@ -54,19 +54,15 @@ class Dilution(HasStates, Drivable): condensing_p_low = Property('Lower limit for condenseline pressure', IntRange()) - condensing_p_high = Property('Lower limit for condenseline pressure', IntRange()) + condensing_p_high = Property('Higher limit for condenseline pressure', IntRange()) target = Parameter('target state', EnumType(Targetstates)) - value = Parameter('target state', EnumType(Targetstates)) + value = Parameter('current state', EnumType(Targetstates)) init = True - def earlyInit(self): - super().earlyInit() - - def read_value(self): - return self.value + def write_target(self, target): """ @@ -149,21 +145,20 @@ class Dilution(HasStates, Drivable): self.compressor.write_target(1) return True - @status_code(BUSY, 'condense mode') + @status_code(BUSY) def wait_for_condense_line_pressure(self, state): if (self.condenseline_pressure.read_value > 500): return Retry - + self.condense_valve.write_target(0) return self.circulate - - def initialize_condense_valves(self): - return True - - @status_code(BUSY, 'condense state') + def initialize_condense_valves(self, state): + raise NotImplementedError + + @status_code(BUSY) def condense(self, state): """Führt das Kondensationsverfahren durch.""" - if self.init: + if state.init: self.initialize_condense_valves() self.circuitshort_valve.write_target(0) self.dump_valve.write_target(0) @@ -176,7 +171,6 @@ class Dilution(HasStates, Drivable): self.compressor.write_target(1) self.circulate_pump.write_target(1) - self.init = False return Retry if self.condenseline_pressure.read_value() < self.condensing_p_low: @@ -190,63 +184,79 @@ class Dilution(HasStates, Drivable): self.condense_valve.write_target(1) if (self.turbopump is not None): - if (self.condenseline_pressure.read_value() > 900 and self.still_pressure.read_value() > 10): - return Retry - else: - self.turbopump.write_target(1) + return self.condense_wait_before_turbo_start return self.wait_for_condense_line_pressure - - - def initialize_circulation_valves(self): - return True - - @status_code(BUSY, 'circulate state') - def circulate(self): - """Zirkuliert die Mischung.""" - return self.initialize_circulation_valves() - - @status_code(BUSY, 'remove state') - def remove(self): + @status_code(BUSY, 'condense (wait before starting turbo)') + def condense_wait_before_turbo_start(self, state): + if (self.condenseline_pressure.read_value() > 900 and self.still_pressure.read_value() > 10): + return Retry + else: + self.turbopump.write_target(1) + return self.wait_for_condense_line_pressure + + def initialize_circulation_valves(self, state): + raise NotImplementedError + + @status_code(BUSY) + def circulate(self, state): + """Zirkuliert die Mischung.""" + if state.init: + self.initialize_circulation_valves() + return Retry + + @status_code(BUSY, 'remove (wait for turbo shut down)'') + def remove(self, state): """Entfernt die Mischung.""" - if self.init: + if state.init: self.condenseline_valve.write_target(0) self.dump_valve.write_target(1) self.start_time = self.now - self.init = False return Retry - if self.turbopump is not None: + if self.turbopump is not None: self.turbopump.write_target(0) - if (self.now - self.start_time < 300 or self.turbopump.read_speed() > 60): - return Retry + if (self.now - self.start_time < 300 or self.turbopump.read_speed() > 60): + return Retry self.circuitshort_valve.write_target(1) if self.turbopump is not None: - if self.still_pressure.read_value() > 20: - return Retry - self.turbopump.write_target(1) - + return self.remove_wait_for_still_pressure + + return remove_endsequence + + @status_code(BUSY, 'remove (wait for still pressure low)') + def remove_wait_for_still_pressure(self, state): + if self.still_pressure.read_value() > 20: + return Retry + self.turbopump.write_target(1) + return self.remove_endsequence + + @status_code(BUSY) + def remove_endsequence(self, state): if self.still_pressure.read_value() > 1e-4: return Retry - self.circuitshort_valve.write_target(0) self.dump_valve.write_target(0) - + if self.compressor is not None: self.compressor.write_target(0) - - for valve in self.remove_closed_valves: - valve.write_target(0) - + self.remove_check_manual_valves() + self.remove_close_valves() self.circulate_pump.write_target(0) - return Finish - + + def remove_check_manual_valves(self): + raise NotImplementedError + + def remove_close_valves(self): + raise NotImplementedError + + class DIL5(Dilution): MV10 = Attached() @@ -269,6 +279,8 @@ class DIL5(Dilution): self.circulate_open_valves = [self.MV11, self.circulate_pump, self.GV2, self.V5, self.compressor, self.condenseline_valve, self.MV1, self.MV3a, self.MV3b, self.GV1, self.MV9, self.MV14] self.condense_closed_valves = [self.MV10, self.MV13, self.MV8, self.MVB, self.MV2] self.condense_open_valves = [self.MV1, self.MV3a, self.MV3b, self.GV1, self.MV9, self.MV14, self.MV12, self.MV11] + self.remove_check_closed_valves = [self.MV11, self.MV9, self.MV12, self.MV1] + self.remove_closed_valves = [self.condenseline_valve, self.circuitshort_valve, self.V5, self.condense_valve, self.dump_valve] super().earlyInit() def initialize_condense_valves(self): @@ -296,5 +308,13 @@ class DIL5(Dilution): valve.write_target(1) self.stop_machine() raise ImpossibleError(f'valve {valve.name} must be open') - + + def remove_check_manual_valves(self): + for valve in self.remove_check_closed_valves: + if (valve.read_value() == 1): + self.final_status(WARN, "manual valve {valve.name} must be closed") + + def remove_close_valves(self): + for valve in self.remove_closed_valves: + valve.write_target(0) diff --git a/frappy_psi/logo.py b/frappy_psi/logo.py index 71d9439..6b243b2 100644 --- a/frappy_psi/logo.py +++ b/frappy_psi/logo.py @@ -130,9 +130,9 @@ class Valve(Snap7Mixin, Drivable): self.setFastPoll(True, 0.001) def read_status(self): - self.log.info('read_status') + self.log.debug('read_status') value = self.read_value() - self.log.info('value %d target %d', value, self.target) + self.log.debug('value %d target %d', value, self.target) if value != self.target: if self._remaining_tries is None: self.target = self.read_value()