Показано с 1 по 6 из 6

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

  1. #1

    По умолчанию Каскадное управление насосами

    Приветствую!

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


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

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

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

  2. #2

    По умолчанию Автомат состояний

    Не придумаешь столько библиотек

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

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

    au05hxjke5l2hndsob89uj7c267hn45o.png














































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

    Код:
    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;
    Последний раз редактировалось krollcbas; 10.04.2023 в 07:06.
    +79104444236
    С уважением,
    Лапшин Вячеслав

  3. #3

    По умолчанию

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

  4. #4

    По умолчанию

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

  5. #5
    Пользователь
    Регистрация
    28.03.2007
    Адрес
    г. Донецк
    Сообщений
    123

    По умолчанию

    Цитата Сообщение от Borobeska Посмотреть сообщение
    Приветствую!

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


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

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

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

  6. #6

    По умолчанию

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

Похожие темы

  1. каскадное управление регуляторов КТР
    от Никита2020 в разделе Контроллеры для систем отопления и ГВС
    Ответов: 7
    Последнее сообщение: 01.12.2021, 17:25
  2. каскадное управление регуляторов КТР
    от Никита2020 в разделе Эксплуатация
    Ответов: 1
    Последнее сообщение: 07.10.2021, 16:02
  3. КАСКАДНОЕ УПРАВЛЕНИЕ
    от kukla100 в разделе ПЛК1хх
    Ответов: 33
    Последнее сообщение: 24.04.2020, 11:54
  4. каскадное управление тэнами с пид
    от Keldish в разделе Программируемые реле
    Ответов: 3
    Последнее сообщение: 17.09.2017, 16:59

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •