DIL5: improve states in the state machine

This commit is contained in:
zolliker 2025-05-22 15:11:21 +02:00
parent 018ed920b9
commit 2238c20a37
2 changed files with 74 additions and 54 deletions

View File

@ -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)

View File

@ -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()