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

Тема: Ротация 4ёх насосов

  1. #1

    Question Ротация 4ёх насосов

    Доброго времени суток всем!
    появилась следующая задача:
    сделать программу для ротации 4ёх насосов
    Имеется 4 уровня (1ый включает первый насос, 2ой - второй, и т.д., отключение всех работающих насосов - по отключению 1ого уровня)
    Если поднялся 1ый уровень включился насос №1, отработал. Затем по 1ому уровню включился насос №2, отработал. Затем по 1ому - насос №3, поднялся 2ой уровень - включается насос №4.
    Надеюсь суть понятна, по приложенным файлам несложно будет разобраться (также может/не может включится насос определяет состояние его аварии, и произошло ли включение насоса после сигнала на его запуск)

    За основу я взял макрос https://owen.ru/forum/member.php?u=14862 Василия Кашубы, который был выполнен им на 3 насоса.
    И видоизменял уже непосредственно его (его прикрепляю - ротация на 3 насоса)

    Немного помудрив, я получил следующий вариант *2ой прикреплённый файл - ротация на 4 насоса)
    В принципе, работает. Есть одно но:
    например, если 1ый насос в аварии, по ротации по 1ому уровню включается насос №4, по 2ому уровню должен включится насос №1 НО он же в аварии, и должен включится насос №2
    а по факту включается насосы №2 и №3, а насос №4 просто выключается

    так происходит с каждым насосом:
    если в аварии насос №2: по ротации по 1ому уровню включается насос №1, по 2ому уровню должен включится насос №3 (т.к. №2 в аварии), а по факту включаются насосы №3 и №4, а насос №1 просто выключается
    если в аварии насос №3: по ротации по 1ому уровню включается насос №2, по 2ому уровню должен включится насос №4 (т.к. №3 в аварии), а по факту включаются насосы №4 и №1, а насос №2 просто выключается
    если в аварии насос №4: по ротации по 1ому уровню включается насос №3, по 2ому уровню должен включится насос №1 (т.к. №4 в аварии), а по факту включаются насосы №1 и №2, а насос №3 просто выключается

    Помогите, пожалуйста, разобраться где я ошибся с битами и можно ли это исправить?

    Постарался описать понятно. Думаю, если пошагово протыкать макрос, то будет понятно о чём я.
    Вложения Вложения

  2. #2

    По умолчанию

    Посмотрите пока это
    4 насоса_Нараб_Ротация по времени_____ https://owen.ru/forum/showthread.php?t=38920&page=2#13
    Каскадное управл. 8 котлами_____ https://owen.ru/forum/showthread.php...341#post420341
    Управл. 12 насосами_12 аварий_ET_Включение по Уровню_____ https://owen.ru/forum/showthread.php?t=38891#6

  3. #3
    Пользователь Аватар для Сергей0308
    Регистрация
    25.06.2011
    Адрес
    Галактика Андромеды (M31)
    Сообщений
    9,434

    По умолчанию

    Цитата Сообщение от high_roll Посмотреть сообщение
    Доброго времени суток всем!
    появилась следующая задача:
    сделать программу для ротации 4ёх насосов
    Имеется 4 уровня (1ый включает первый насос, 2ой - второй, и т.д., отключение всех работающих насосов - по отключению 1ого уровня)
    Если поднялся 1ый уровень включился насос №1, отработал. Затем по 1ому уровню включился насос №2, отработал. Затем по 1ому - насос №3, поднялся 2ой уровень - включается насос №4.
    Надеюсь суть понятна, по приложенным файлам несложно будет разобраться (также может/не может включится насос определяет состояние его аварии, и произошло ли включение насоса после сигнала на его запуск)

    За основу я взял макрос https://owen.ru/forum/member.php?u=14862 Василия Кашубы, который был выполнен им на 3 насоса.
    И видоизменял уже непосредственно его (его прикрепляю - ротация на 3 насоса)

    Немного помудрив, я получил следующий вариант *2ой прикреплённый файл - ротация на 4 насоса)
    В принципе, работает. Есть одно но:
    например, если 1ый насос в аварии, по ротации по 1ому уровню включается насос №4, по 2ому уровню должен включится насос №1 НО он же в аварии, и должен включится насос №2
    а по факту включается насосы №2 и №3, а насос №4 просто выключается

    так происходит с каждым насосом:
    если в аварии насос №2: по ротации по 1ому уровню включается насос №1, по 2ому уровню должен включится насос №3 (т.к. №2 в аварии), а по факту включаются насосы №3 и №4, а насос №1 просто выключается
    если в аварии насос №3: по ротации по 1ому уровню включается насос №2, по 2ому уровню должен включится насос №4 (т.к. №3 в аварии), а по факту включаются насосы №4 и №1, а насос №2 просто выключается
    если в аварии насос №4: по ротации по 1ому уровню включается насос №3, по 2ому уровню должен включится насос №1 (т.к. №4 в аварии), а по факту включаются насосы №1 и №2, а насос №3 просто выключается

    Помогите, пожалуйста, разобраться где я ошибся с битами и можно ли это исправить?

    Постарался описать понятно. Думаю, если пошагово протыкать макрос, то будет понятно о чём я.
    Посмотрите это, здесь ротация: https://owen.ru/forum/showthread.php?t=36564
    здесь каскад: https://owen.ru/forum/showthread.php?t=32428&page=4

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

    Мой вариант с перспективой расширения до 8 насосов:

    Ротация 8 насосов с 4-я включёнными по уровню.png

    Ротация 8 насосов с 4-я включёнными по уровню.owle
    Последний раз редактировалось Сергей0308; 12.10.2024 в 01:47.
    Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
    справиться с проблемами, либо это не твои проблемы.

  4. #4

    По умолчанию

    Не претендуя на оригинальность предложу решение к вашему ТЗ:
    Owen.jpg

    Код:
    function_block Rotate4 //Блок ротации 4 насосов
    
        var_input
           E1, E2, E3, E4 : bool;       // Разрешение на запуск двигателя
           W1, W2, W3, W4 : bool;       // Насосы в работе
           L1, L2, L3, L4 : bool;       // Определяет число запрашиваемых насосов
        end_var
    
        var_output
           Q1, Q2, Q3, Q4 : bool;       // Насосы в пуске
           A1, A2, A3, A4 : bool;       // Насосы в аварии
        end_var
    
        var
           NextStart : udint;           // Указатель на следующий насос для запуска
           NextStop : udint;            // Указатель на следующий насос для останова 
           T1, T2, T3, T4 : SYS.TON;    // Таймеры для определения исправности насосов
           CountWork : udint;           // Количество насосов в работе
           CountQuery : udint;          // Требуемое кол-во
        end_var
    
        // Определяем кол-во в работе
        CountWork := 0;
        if Q1 then CountWork := CountWork + 1; end_if
        if Q2 then CountWork := CountWork + 1; end_if
        if Q3 then CountWork := CountWork + 1; end_if
        if Q4 then CountWork := CountWork + 1; end_if
    
        // Требуемое кол-во
        CountQuery := 0;
        if L1 then CountQuery := CountQuery + 1; end_if
        if L2 then CountQuery := CountQuery + 1; end_if
        if L3 then CountQuery := CountQuery + 1; end_if
        if L4 then CountQuery := CountQuery + 1; end_if
        
        // Если нужно больше - запускаем следующий
        if CountQuery > CountWork then  // Нужно запустить следующий
            case NextStart of           // Запускаем при условии, что работа разрешена и нет аварии
                0: Q1 := E1 and NOT A1;
                1: Q2 := E2 and NOT A2;
                2: Q3 := E3 and NOT A3;
                3: Q4 := E4 and NOT A4;
            end_case
            NextStart := NextStart + 1; if NextStart > 3 then NextStart := 0; end_if
        end_if
    
        // Если нужно меньше - останавливаем следующий
        if CountWork > CountQuery then  // Нужно выключить следующий
            case NextStop of
                0: Q1 := false;
                1: Q2 := false;
                2: Q3 := false;
                3: Q4 := false;
            end_case
            NextStop := NextStop + 1; if NextStop > 3 then NextStop := 0; end_if
        end_if
    
        // Сбросим аварию при запрете запуска и остановим насос
        if not E1 then A1 := false; Q1:=false; end_if
        if not E2 then A2 := false; Q2:=false; end_if
        if not E3 then A3 := false; Q3:=false; end_if
        if not E4 then A4 := false; Q4:=false; end_if
    
        // Следим за таймером и фиксируем аварию с остановкой насоса
        T1(I:=Q1, T:=T#1s); if T1.Q and not W1 then A1 := true; Q1:=false; end_if
        T2(I:=Q2, T:=T#1s); if T2.Q and not W2 then A2 := true; Q2:=false; end_if
        T3(I:=Q3, T:=T#1s); if T3.Q and not W3 then A3 := true; Q3:=false; end_if
        T4(I:=Q4, T:=T#1s); if T4.Q and not W4 then A4 := true; Q4:=false; end_if
        
    end_function_block

Похожие темы

  1. ФБ на ST ротация насосов
    от 7in в разделе Среда программирования OWEN Logic
    Ответов: 67
    Последнее сообщение: 09.09.2025, 18:56
  2. Ответов: 7
    Последнее сообщение: 01.02.2024, 07:42
  3. Ротация двух насосов в системе ИТП
    от K.K. в разделе ПЛК1хх [М02]
    Ответов: 3
    Последнее сообщение: 16.01.2024, 09:02
  4. Ротация насосов 3+1
    от K.K. в разделе Среда программирования OWEN Logic
    Ответов: 47
    Последнее сообщение: 29.10.2023, 16:37
  5. Ротация двух насосов
    от Вова13 в разделе ПЛК63/73
    Ответов: 19
    Последнее сообщение: 25.12.2022, 00:13

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

Ваши права

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