Вот мы и подобрались к ротации насосов. Первоначально была мысль сделать эту часть в хайвел. Сформировать регистр, сдвигать его ... Но пощупав хайвеловскую среду программирования , и познакомившись получше с панелью, решил сделать в панели на яве.
Итак, что у нас есть:
- 6 насосов 2 из которых в резерве, 4 в ротации
- Насосы могут иметь нерабочее состояние
- Ротация происходит через равные промежутки.
- ПИД регулятор.
Начнем с регулятора. У нас 6 насосов. Весь диапазон выхода ПИД сделал 0-600. Т.е. по 100 единиц на насос. (пока ротацию не учитываем)
0-100 - зона работы насоса 1
100-200 - зона работы насоса 2
200-300 - зона работы насоса 3
300-400 - зона работы насоса 4
400-500 - зона работы насоса 5 (назначен для первого резервного)
500-600 - зона работы насоса 6 (назначен для второго резервного)
Допустим, ПИД достиг уровня 350. Т.е. мы должны включить 1,2,3 насоссы на полную мощность, а насос 4 на 50%.
Теперь добавим ротацию. Т.е. для рассмотренного выше случая все без изменений, первый насос - насос1.
Пусть прошло время, произошел импульс ротации, первый насос станет - насос №2. Тогда 2,3,4 должны включится на полную мощность, а 5 на 50%, так до следующего импульса ротации. После шестого, первым снова станет насос №1.
Еще нужно учесть, что насосы могут быть в аварии, или находится в режиме "ручной" или "выключен", в этом случае ротация должна перескакивать на следующий, а если ПИД-регулятор попадает на недоступный, то мы тоже должны это учесть.
С задачами определились, теперь надо как-то сделать :)
Вспомним, что режимы насосов, задание на запуск, флаг аварии, задание скорости отправляемое в плк - это массивы, индекс ы котором - номер насоса.
Т.е. можно создать массив индексов насосов в режиме авто и доступных для включения. На первом месте в этом массиве всегда будет находится насос первый в ротации, если ПИД-регулятор решит, что надо два, то из массива берем индекс второго доступного насоса, и так далее. Если насосы кончились, то берем из резерва.
Теперь реализация :
Ротация
Формирование массива "АВТО"
Может возникнуть вопрос, почему не сделана проверка в макросе, где происходит смена основного насоса. Дело в том, что он вызывается с периодичностью раз в сутки, а за сутки много чего может произойти.
Распределение выхода ПИД по насосам
Идея в том, что ПИД у нас 0-600, а скоростной вход насоса 0-100. ПИД распределяем между насосами. На последний ы списке отправляется остаток.
Запуск резервов
Запуск резервов работает следующим образом. Если Все насосы в авто запущены, а ПИД решил, что нужно еще, то программа пытается запустить первый резерв, потом второй (по необходимости), если первый не доступен, то запускает сразу второй.