PDA

Просмотр полной версии : Каскадное управление насосами



Borobeska
10.04.2023, 05:30
Приветствую!

Такая задача:
Есть станция поддержания давления на 5 насосов с ПЧ на каждый насос.
Насосы должны управляться с помощью ПИД и переключаться последовательно или по наработке, через какой-то промежуток времени.
При этом станция не должна останавливаться, а плавно переключаться.
Если один из насосов выходит из работы (авария, отключение) станция автоматически подключает другой насос для дальнейшей работы.


Существует ли библиотеки, где реализована такая задача или какие нибудь готовые примеры, на которые можно опереться?

Вроде разобрался, если запись не удалят к тому моменту, как я все сделаю. Выложу сюда блоки на проверку/доработку)

P.S. Буду рад, если накидаете ин-фы - видео/мануалов по ST, чтоб и начальные знания получить, и в углубленной теме понять можно было, что делать.

krollcbas
10.04.2023, 06:59
Не придумаешь столько библиотек

Попробуйте для начала оформить графически и выстроить автомат состояний, то есть оформить стрелками(переходами) и шариками(состояниями)
https://fast-project.ru/engineering/proect-ppo/algoritm.html

1. Пишете перечень состояний в каком может находиться установка в каждый из моментов времени (шарики)
2. Продумываете перечень условий переходов из состояния в состояние (стрелки)

67132














































Ниже пример кода


CASE State OF

0:(*Закрыт*)
BLINK(ENABLE:=1 , TIMELOW:=TIMEINT.FALSETIME , TIMEHIGH:=TIMEINT.TRUETIME );
Q_Open :=FALSE;
Q_Close:=BLINK.OUT;
IF SP_Position>Position AND Delta>1 THEN State:=2; END_IF;
IF Position>99 THEN State:=4; END_IF;
STS := STS OR 2;
IF NOT INTLK_OFF THEN State:=7; END_IF;
IF NOT INTLK_ON THEN State:=8; END_IF;

2:(*Открывается*)
BLINK1(ENABLE:=1 , TIMELOW:=TIMEINT.FALSETIME , TIMEHIGH:=TIMEINT.TRUETIME );
Q_Open :=BLINK1.OUT;
Q_Close:=FALSE;
IF Delta<1 THEN State:=3; END_IF;
IF Position>99 THEN State:=4; END_IF;
IF SP_Position<Position AND Delta>1 THEN State:=5; END_IF; (*Убавили уставку, закрываем*)
STS := STS OR 4;
IF NOT INTLK_OFF THEN State:=7; END_IF;
IF NOT INTLK_ON THEN State:=8; END_IF;

3:(*Частично открытое состояние*)
Q_Open :=FALSE;
Q_Close:=FALSE;
IF SP_Position>Position AND Delta>1 THEN State:=2; END_IF;
IF SP_Position<Position AND Delta>1 THEN State:=5; END_IF;
IF Position>99 THEN State:=4; END_IF;
IF Position<1 THEN State:=0; END_IF;
STS := STS OR 4;
IF NOT INTLK_OFF THEN State:=7; END_IF;
IF NOT INTLK_ON THEN State:=8; END_IF;

4:(*Открыт*)
BLINK(ENABLE:=1 , TIMELOW:=TIMEINT.FALSETIME , TIMEHIGH:=TIMEINT.TRUETIME );
Q_Open :=BLINK.OUT;
Q_Close:=FALSE;
IF SP_Position<Position AND Delta>1 THEN State:=5; END_IF;
IF Position<1 THEN State:=0; END_IF;
STS := STS OR 1;
IF NOT INTLK_OFF THEN State:=7; END_IF;
IF NOT INTLK_ON THEN State:=8; END_IF;

5:(*Закрывается*)
BLINK1(ENABLE:=1 , TIMELOW:=TIMEINT.FALSETIME , TIMEHIGH:=TIMEINT.TRUETIME );
Q_Open :=FALSE;
Q_Close:=BLINK1.OUT;
IF Delta<1 THEN State:=6; END_IF;
IF Position<1 THEN State:=0; END_IF;
IF SP_Position>Position AND Delta>1 THEN State:=2; END_IF; (*Прибавили уставку, открываем*)
STS := STS OR 4;
IF NOT INTLK_OFF THEN State:=7; END_IF;
IF NOT INTLK_ON THEN State:=8; END_IF;

6:(*Частично закрытое состояние*)
Q_Open :=FALSE;
Q_Close:=FALSE;
IF SP_Position>Position AND Delta>1 THEN State:=2; END_IF;
IF SP_Position<Position AND Delta>1 THEN State:=5; END_IF;
IF Position>99 THEN State:=4; END_IF;
IF Position<1 THEN State:=0; END_IF;
STS := STS OR 4;
IF NOT INTLK_OFF THEN State:=7; END_IF;
IF NOT INTLK_ON THEN State:=8; END_IF;

7:(*Заблокирован на закрытое состояние*)
Q_Open :=FALSE;
Q_Close:=TRUE;
STS := STS OR 32;
IF INTLK_OFF THEN State:=0; END_IF;

8:(*Заблокирован на открытое состояние*)
Q_Open :=TRUE;
Q_Close:=FALSE;
STS := STS OR 16;
IF INTLK_ON THEN State:=0; END_IF;

END_CASE;

Borobeska
11.04.2023, 02:32
Да, первым делом для себя начертил логику всей этой работы.
Надеялся, что есть уже готовые решения, которые оптимизируют работу)

Андрей Чернов
24.04.2023, 16:49
Сам недавно задавался подобным вопросом. Собирал в сети по крупицам информацию. От Евгения Кислова взял блок ротации насосов по моточасам, доработал его на большее количество насосов, поспрашивал коллег об алгоритме, поискал возможные решения на ютубе. Все равно моих знаний и опыта пока не хватает чтоб написать красивый компактный блок без костылей. Но "ОНО" работает, пока что... :rolleyes:

AlexZ
25.04.2023, 08:54
Приветствую!

Такая задача:
Есть станция поддержания давления на 5 насосов с ПЧ на каждый насос.
Насосы должны управляться с помощью ПИД и переключаться последовательно или по наработке, через какой-то промежуток времени.
При этом станция не должна останавливаться, а плавно переключаться.
Если один из насосов выходит из работы (авария, отключение) станция автоматически подключает другой насос для дальнейшей работы.


Существует ли библиотеки, где реализована такая задача или какие нибудь готовые примеры, на которые можно опереться?

Вроде разобрался, если запись не удалят к тому моменту, как я все сделаю. Выложу сюда блоки на проверку/доработку)

P.S. Буду рад, если накидаете ин-фы - видео/мануалов по ST, чтоб и начальные знания получить, и в углубленной теме понять можно было, что делать.

Это не каскад. Каскад, это когда нужно обеспечивать давление в том числе и количеством насосов. А в Вашем случае главное чтобы хорошо работали обратные клапана. Для предотвращения гидроударов запуск насоса должен осуществляться с небольшой задержкой после останова другого. И еще советую, если ПИД библиотечный, чтобы у каждого насоса был свой ПИД, и держать ПИД в таком "состоянии", чтобы при включении насоса он сразу выходил на ту же частоту, с которой работал предыдущий насос.

rinatd
25.04.2023, 10:26
Сам недавно задавался подобным вопросом. Собирал в сети по крупицам информацию. От Евгения Кислова взял блок ротации насосов по моточасам, доработал его на большее количество насосов, поспрашивал коллег об алгоритме, поискал возможные решения на ютубе. Все равно моих знаний и опыта пока не хватает чтоб написать красивый компактный блок без костылей. Но "ОНО" работает, пока что... :rolleyes:

можно посмотреть ваш исходник?)