Я хотел бы смоделировать машину, используя впечатляющий пакет python-statemachine. Я впервые читаю о концепции конечного автомата, поэтому потратил около одного дня на чтение (опять же) впечатляющей документации по пакету. Я думаю, что у меня есть вариант использования, к которому применима концепция и пакет. Я хотел бы научиться этому.
Контекст
Машина имеет несколько рабочих состояний. Для минимального рабочего примера (MWE) я предполагаю три состояния, а именно: Выкл., Ожидание, Вкл.. Машина может выполнять работу только в одном состоянии: «Включено» в MWE. Машина может перейти из выключенного состояния во включенное только через режим ожидания, что потребует некоторого времени.
Как только машине будет предложено выполнить работу (событие), она должна перейти в состояние «Включено» независимо от того, в каком состоянии он находится в данный момент, выполнить работу, а затем перейти обратно в режим ожидания, соблюдая определенную последовательность. Выключить -> Ожидание -> Включено.
Минимальный рабочий пример варианта использования
В настоящее время я добился желаемого поведения с помощью специального метода switch_on , который реализует заданную последовательность состояний посредством операторов if. Он вызывается в методе («действии») do_work, который обрабатывает процедуру работы машины.
Код: Выделить всё
from statemachine import StateMachine, State
class Machine(StateMachine):
"""
A simple machine model with three states: off, standby, and on.
"""
# Define the states
off = State(initial=True)
standby = State()
on = State()
# Define events triggering transitions
off_to_standby = off.to(standby, on="off_to_standby_action")
standby_to_on = standby.to(on, on="standby_to_on_action")
on_to_standby = on.to(standby, on="on_to_standby_action")
def __init__(self, off_to_standby_time, standby_to_on_time, on_to_standby_time):
# characteristics
self.off_to_standby_time = off_to_standby_time
self.standby_to_on_time = standby_to_on_time
self.on_to_standby_time = on_to_standby_time
# live variable
self.time_counter = 0
self.work_done = 0
super(Machine, self).__init__()
# Define state actions. Use decorator syntax to avoid stupid method names like `on_enter_on`.
@off.enter
def turn_off(self):
print("Turning off")
@standby.enter
def turn_standby(self):
print("Turning to standby")
@on.enter
def turn_on(self):
print("Turning on")
# Define transition actions
def off_to_standby_action(self):
print("Transition: Off to standby")
self.time_counter += self.off_to_standby_time
return self.time_counter
def standby_to_on_action(self):
print("Transition: Standby to on")
self.time_counter += self.standby_to_on_time
return self.time_counter
def on_to_standby_action(self):
print("Transition: On to standby")
self.time_counter += self.on_to_standby_time
return self.time_counter
# Define custom methods
def switch_on(self): # c. После достижения состояния c и выполнения некоторого действия он должен вернуться в состояние b .
(Я сохранил этот последний дополнительный переход в примере, чтобы избежать предупреждения пользователя пакетом, что все нефинальные состояния должны иметь хотя бы один исходящий переход.)
Мое текущее решение такое же, как и в другом MWE: я использую собственный метод to_c, который реализует определенную последовательность состояний через операторы if и вызывается в пользовательском методе do_c перед выполнением какого-либо действия.
[code]from statemachine import StateMachine, State
class AbstractMachine(StateMachine):
# Define the states
a = State(initial=True)
b = State()
c = State()
# Define events triggering transitions
a_to_b = a.to(b)
b_to_c = b.to(c)
c_to_b = c.to(b)
def __init__(self):
self.action_list = []
super(AbstractMachine, self).__init__()
# Define state actions
def on_enter_a(self):
print("On a")
def on_enter_b(self):
print("On b")
def on_enter_c(self):
print("On c")
# Define custom methods
def to_c(self): #
Подробнее здесь: [url]https://stackoverflow.com/questions/79122982/how-to-transition-multiple-states-in-a-predefined-sequence-in-dependence-of-the[/url]
Мобильная версия