Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 18

Тема: Реализация алгоритма наполнения емкости с тремя стадиями

  1. #1

    Unhappy Реализация алгоритма наполнения емкости с тремя стадиями

    Всем добрый день. Недавно подкинули интересную задачку, но которую не могу нормально реализовать.
    Дано:
    Аналоговый датчик уровня воды (0-6м, но я делал динамическую подгонку).
    Необходимо реализовать три стадии:
    1) Если опустилось ниже определенного порога 1 высоты, включается Насос 1. Если поднялось до порога 1.1 Выключить насос 1(полное заполнение)
    2) Если опустилось ниже порога 2, отключить насос 1 и перейти на насос 2. Если поднялось до порога 2.1 выключить насос 2 и перейти на насос 1
    3) Если опустилось ниже порога 3, работают насосы 1 и 2. Если поднялось до порога 3.1 выключить насос 1, насос 2 оставить в работе
    (То есть каждая стадия имеет пороги включения и выключения)

    Сам реализовывал в ФБ STшном на IFах с >= и <=, выходила полная шляпа(Стадии накладывались друг на друга)
    Прикладываю проект со своими пробами, но там все уже перемешано и напеределывано 100 раз.
    Вложения Вложения
    Ничего не понятно, но очень интересно

  2. #2

    По умолчанию

    Вам осталось совсем чуть-чуть дажать и получилось бы так:
    Код:
    function_block Control
    
        var_input
            level : real;   // Текущий уровень
            level1 : real;  // Максимальный
            level2 : real;  // Средний
            level3 : real;  // Минимальный
        end_var
    
        var_output
            pump1 : bool;   // Насос 1
            pump2 : bool;   // Насос 2
        end_var
    
        if level >= level1 then
            pump1:=false; pump2:=false;
        elsif level < level1 and level >= level2 then
            pump1:=true; pump2:=false;
        elsif level < level2 and level >= level3 then
            pump1:=false; pump2:=true;
        elsif level < level3 then
            pump1:=true; pump2:=true;
        end_if
    
    end_function_block

  3. #3

    По умолчанию

    Да или так:
    Код:
        if level < level3 then
            pump1:=true; pump2:=true;
        elsif level < level2 then
            pump1:=false; pump2:=true;
        elsif level < level1 then
            pump1:=true; pump2:=false;
        else
            pump1:=false; pump2:=false;
        end_if

  4. #4
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    1,239

    По умолчанию

    а у меня так получилось

    Код:
    function_block WaterLevel 
    
        var_input 
           rCurrent_lvl:    real; //тек. уровень
           iD_AlarmLamp_high_on: real;
           iD_AlarmLamp_high_off: real;
           iD_Pump1_Off: real;
           iD_Pump1_On: real;
           iD_Pump2_Off: real;
           iD_Pump2_On: real;
           iD_Pumps_vmeste_Off: real;
           iD_Pumps_vmeste_On: real;
           iD_AlarmLamp_low_on: real;
           iD_AlarmLamp_low_off: real;       
        end_var
    
        var_output 
           xPump1: BOOL;
           xPump2: BOOL;
           xAlarmUp: BOOL;
           xAlarmLow: BOOL;
        end_var
    
        var 
           xFlag1: SYS.RS;
           xFlag2: SYS.RS;
           xFlag3: SYS.RS;
        end_var
         
        xFlag1(S := rCurrent_lvl < iD_Pump1_On, R := rCurrent_lvl >= iD_Pump1_Off);
        xFlag2(S := rCurrent_lvl < iD_Pump2_On, R := rCurrent_lvl >= iD_Pump2_Off);
        xFlag3(S := rCurrent_lvl < iD_Pumps_vmeste_On, R := rCurrent_lvl >= iD_Pumps_vmeste_Off);
     
        xPump1 := (xFlag1.Q and not xFlag2.Q) or xFlag3.Q;
        xPump2 := xFlag2.Q or xFlag3.Q;
             
        xAlarmUp := xPump1 and xPump2;
        
    end_function_block

  5. #5

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    пропускаем через центрифугу и посыпаем реальностью
    Смотрю анализирую. Как понимаю, что активации находятся в диапазонах между условными уровнями.
    Но таким макаром насос 1 будет срабатывать сразу, как текущий уровень опустится ниже отметки выключения даже на чуть-чуть(проверил, да, начинает работать как только опустилось ниже отметки)

    Но алгоритм хотя бы работает, сейчас посижу покумекаю с разумом, может добавить насосу 1 две разных точки вкл/выкл
    Ничего не понятно, но очень интересно

  6. #6

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    жмём еще
    Код:
    pump1 := level < level3 or (level >= level2 and level < level1);
    pump2 := level < level2;
    Очень красивый код, однако, но тоже начинает срабатывать почти сразу, как вода утекла на 0.01 мм от верхней границы(
    Ничего не понятно, но очень интересно

  7. #7

    По умолчанию

    А может кто-нибудь PUTBIT в Лоджике на ST изобразить?
    В биб-ке Util.lib код выглядит так 1 Код Путбит.jpg

    А в Лоджике как то так, соответственно AND, OR и ROL не работают
    Код:
    function PUTBIT: udint; //имя функции и тип данных выхода
    VAR_INPUT
        X: udint;   (* value to be manipulated *)
        N: udint;      (* position of bit to be changed *)
        B:BOOL;        (* value of specified bit *)
    END_VAR    
        
        IF B=TRUE THEN
        PUTBIT:=(X OR SHL(1,N));
           ELSE
        PUTBIT:=(X AND ROL(4294967294,N));
        END_IF;
        
    end_function
    Последний раз редактировалось kondor3000; 09.05.2024 в 15:08.

  8. #8

    Smile

    Цитата Сообщение от Dimensy Посмотреть сообщение
    а у меня так получилось

    Код:
    function_block WaterLevel 
    
        var_input 
           rCurrent_lvl:    real; //тек. уровень
           iD_AlarmLamp_high_on: real;
           iD_AlarmLamp_high_off: real;
           iD_Pump1_Off: real;
           iD_Pump1_On: real;
           iD_Pump2_Off: real;
           iD_Pump2_On: real;
           iD_Pumps_vmeste_Off: real;
           iD_Pumps_vmeste_On: real;
           iD_AlarmLamp_low_on: real;
           iD_AlarmLamp_low_off: real;       
        end_var
    
        var_output 
           xPump1: BOOL;
           xPump2: BOOL;
           xAlarmUp: BOOL;
           xAlarmLow: BOOL;
        end_var
    
        var 
           xFlag1: SYS.RS;
           xFlag2: SYS.RS;
           xFlag3: SYS.RS;
        end_var
         
        xFlag1(S := rCurrent_lvl < iD_Pump1_On, R := rCurrent_lvl >= iD_Pump1_Off);
        xFlag2(S := rCurrent_lvl < iD_Pump2_On, R := rCurrent_lvl >= iD_Pump2_Off);
        xFlag3(S := rCurrent_lvl < iD_Pumps_vmeste_On, R := rCurrent_lvl >= iD_Pumps_vmeste_Off);
     
        xPump1 := (xFlag1.Q and not xFlag2.Q) or xFlag3.Q;
        xPump2 := xFlag2.Q or xFlag3.Q;
             
        xAlarmUp := xPump1 and xPump2;
        
    end_function_block
    Вы докрутили мою идею с флагами и триггерами, я даже не додумался сделать правило для исключения первого насоса при флаге на второй.
    Вы с Сергеем0308 какие-то великие хранителя форума, спасибо большое)
    Ничего не понятно, но очень интересно

  9. #9

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    что значит однако?
    как описали, так и предложили
    Значит у меня язык такой, ТЗ в голове нормально звучит, но только для меня. Спасибо большое за предложенные варианты, вышли красивые и понятные для понимания)
    Ничего не понятно, но очень интересно

  10. #10
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    1,239

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    А может кто-нибудь PUTBIT в Лоджике на ST изобразить?
    В биб-ке Util.lib код выглядит так 1 Код Путбит.jpg

    А в Лоджике как то так, соответственно AND, OR и ROL не работают
    я тупо через case перебирал биты

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Ответов: 2
    Последнее сообщение: 19.04.2023, 11:59
  2. Реализация алгоритма..
    от VaBo в разделе Панели оператора (HMI)
    Ответов: 8
    Последнее сообщение: 28.09.2020, 11:28
  3. реализация последовательного алгоритма
    от Brandon_heat_dre в разделе Разработки
    Ответов: 9
    Последнее сообщение: 20.11.2018, 21:19
  4. Уровень в емкости
    от Технос в разделе Панели оператора (HMI)
    Ответов: 12
    Последнее сообщение: 26.08.2016, 08:48
  5. Ответов: 9
    Последнее сообщение: 04.11.2015, 12:46

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

Ваши права

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