mish17 писал(а):Возвращаюсь к своему вопросу. В примере управление 2 насосами кнопками Пуск-Стоп(хочется, реализовать на паттерне Producer\Consumer). Каким образом добавить автоматический режим, чтобы при аварии первого включался второй и наоборот)- необходимо добавлять новые состояния у насосов? Хотя по логике у каждого насоса должны быть Остановлен, Разгон, Работа, Останов, Авария.
Ну...
Вы несколько упрощаете свою задачу и немного не верно понимаете данную модель программирования.
Например, по Вашей логике (классификации состояний), насос не может быть одновременно в Аварии и Останов, на самом деле это не так. Возможно Вы путаете действие (процесс - разгон, работа, торможение) и состояние (работоспособен/не работоспособен). Можно еще добавить пред аварийное состояние, например когда начинает расти температура насоса (двигателя) или потребляемый ток, т.е. он как-бы еще работает, но лучше переключиться на резерв.
Нужно четко расписать состояния, действия, команды и т.д.
Например для каждого насоса:
* состояния:
- работоспособен
- не работоспособен
- пред аварийное
* действия объекта:
- простой
- разгон
- нормальная работа
- торможение
* команды управления:
- старт
- стоп
- опрос датчиков
* события:
- старт насоса 1
- старт насоса 2
- стоп насоса 1
- стоп насоса 2
и т.д.
Продумать логику совместной работы насосов.
Могут ли они работать одновременно, например при аварии 1, начинается его торможение и сразу стартует 2. Или 1 должен дождаться, когда 2 выйдет в рабочий режим и только после этого начать торможение с плавной передачей нагрузки и без резких скачков давления.
Либо 2 стартует только после полной остановки 1.... и т.д. и т.п.
Потом разработать алгоритм работы, например
Инициализация
1.Определение текущего состояния (по идее датчиков должно быть больше)
- опрос датчика 1 насоса 1
- опрос датчика 2 насоса 1
- решение о состоянии насоса 1 (в зависимости от действия объекта)
- опрос датчика 1 насоса 2
- опрос датчика 2 насоса 2
- решение о состоянии насоса 2 (в зависимости от действия объекта)
- отображение текущего состояния (допустим для "действия"="простой" все сигналы в норме, присваивается обоим насосам "состояние"="работоспособен")
2. Ожидание (idle)
Допустим нажали кнопку запуска насоса 1, при этом генерируется событие "старт насоса 1". Совершаем над насосом 1 "действие"="разгон"
3. Разгон насоса
Для этого нужно знать оптимальные/предельные (кому как) значения скорость, ускорение, ну и для прошаренных - рывок.
В процессе разгона путем интегрирования рывка получаем ускорение, а из ускорения скорость, из скорости значение тока управления (или частоты, скважности и т.д. не знаю что у Вас), постоянно контролируя чтобы все значения не выходили за допустимые пределы.
- начальный момент I(t)=I(0)=0
- на следующем шаге (t+dt) все считаем и допустим получили I(t+dt)=0.3
- определение текущего состояния (при "действие"="разгон") и если "состояние"="работоспособен" продолжаем разгон (t+dt) иначе, например "состояние"="не работоспособен", "действие"="торможение"
И так пока не выведем его "действия объекта"="нормальная работа".
4. Нормальная работа
- вычисление управляющего воздействия для регулирования (на основании показания датчиков)
- определение текущего состояния (при "действие"="нормальная работа"). Если "состояние"="работоспособен" продолжаем "нормальная работа" иначе, например "состояние"="не работоспособен", "действие"="торможение"
5. Торможение
- аналогично разгону, только в обратную сторону
Потом уже продумывать события и логику работы, например при нажатии кнопки СТОП, мы определяем какого из насосов "действие"="разгон" или "нормальная работа" и генерируем соответствующее событие, например "стоп насоса 1". Возможно для обоих насосов. При этом для 1 насоса "состояние"="работоспособен", "действие"="торможение" и действуем по п.5.
И т.д. и т.п.
А уже потом начинаем программировать
.
Вы сами осмыслите все, я не идеален, не всего знаю и это лишь мое первоначальное представление (с чего начинать, потом будет корректироваться и наращиваться), возможно у Вас будут дополнения и изменения.
Я немного отдохну, а то только с работы, устал как с... Позже постараюсь пример накидать. На самом деле не все так страшно, как кажется