Страница 2 из 5 ПерваяПервая 1234 ... ПоследняяПоследняя
Показано с 11 по 20 из 44

Тема: ФБ сохранения показаний на ST с энергонезависимостью.

  1. #11

    По умолчанию

    Цитата Сообщение от Григори Посмотреть сообщение
    Не совсем понимаю, как это реализовать. Поставить линии задержки на все выходные переменные?
    Примерно так, но это не точно...

  2. #12

    По умолчанию

    Цитата Сообщение от Dimensy Посмотреть сообщение
    Еще один вход сделать - разрешение работы
    И завести на него 1 с линией задержки, верно?
    Ничего не понятно, но очень интересно

  3. #13

    По умолчанию

    Цитата Сообщение от Григори Посмотреть сообщение
    И завести на него 1 с линией задержки, верно?
    Нужно проверить хватит ли одного цикла

  4. #14

    По умолчанию

    Код:
    Таймер (in:=  not (стартовый не энергонезависимый бит), pt:= T#5s)
    if Таймер.Q then
       стартовать программу;
       стартовый не энергонезависимый бит:= 1;
    end_if

  5. #15

    По умолчанию

    Цитата Сообщение от AlexCrane Посмотреть сообщение
    Нужно проверить хватит ли одного цикла
    Поставил и сделал в блоке:
    IF разрешение работать = 1
    (Основной код фб)
    END_IF

    После перезапуска он вообще стопится, даже цена импульса из энергонезависимости не подгружается
    Ничего не понятно, но очень интересно

  6. #16

    По умолчанию

    Цитата Сообщение от МихаилГл Посмотреть сообщение
    Код:
    Таймер (in:=  not (стартовый не энергонезависимый бит), pt:= T#5s)
    if Таймер.Q then
       стартовать программу;
       стартовый не энергонезависимый бит:= 1;
    end_if
    Сделал, отвалилась запись входных переменных (цены импульса)

    Код:
    FUNCTION_BLOCK Flowmeter // имя функционального блока.
    
        VAR_INPUT // объявление входных переменных
            i_Work: BOOL; // разрешение на работу
            i_Imp: BOOL; // переменная считывания переднего фронта импульса
            i_ImpMass: REAL; // переменна цены импульса
            i_Flow: REAL; // Общий поток
            i_FlowYear: REAL; // Годовой поток
            i_FlowMonth: REAL; // Поток за месяц
            i_FlowDay: REAL; // Поток за день
            i_FlowHour: REAL; // Поток за час
    
            i_nowYear: UDINT; // Текущий год
            i_nowMonth: UDINT; // Текущий месяц
            i_nowDay: UDINT; // Текущий день
            i_nowHour: UDINT; // Текущий час
            i_nowMinute: UDINT; // Текущая минута
            i_nowSecond: UDINT; // Текущая секунда
        END_VAR
    
        VAR_OUTPUT // объявление выходных переменных
            Flow: REAL;
            FlowDay: REAL;
            FlowHour: REAL;
            FlowMonth: REAL;
            FlowYear: REAL;
            ImpMass: REAL;
            Work: BOOL;
        END_VAR
    
        VAR // объявление локальных переменных
            TON: TON_FB;
            TON_Q: BOOL;
            l_Flow: REAL;
            l_FlowDay: REAL;
            l_FlowHour: REAL;
            l_FlowMonth: REAL;
            l_FlowYear: REAL;
            l_year: UDINT;
            l_month: UDINT;
            l_day: UDINT;
            l_hour: UDINT;
            l_minute: UDINT;
            l_second: UDINT;
            l_impMass: REAL;
        END_VAR
    
    
        TON(IN := NOT(i_Work), PT := 5, Q => TON_Q);
        
        IF TON_Q THEN
            
            l_Flow := i_Flow;
            l_FlowYear := i_FlowYear;
            l_FlowMonth := i_FlowMonth;
            l_FlowDay := i_FlowDay;
            l_FlowHour := i_FlowHour;
            l_impMass := 100;
            
           IF i_Imp = TRUE THEN
            l_flow := l_Flow + ((1 / 1000) * i_ImpMass);
            l_FlowDay := l_FlowDay + ((1 / 1000) * i_ImpMass);
            l_FlowHour := l_FlowHour + ((1 / 1000) * i_ImpMass);
            l_FlowMonth := l_FlowMonth + ((1 / 1000) * i_ImpMass);
            l_FlowYear := l_FlowYear + ((1 / 1000) * i_ImpMass);
           END_IF
    
           IF i_nowDay <> l_day THEN
            l_day := i_nowDay;
            l_FlowDay := 0;
           END_IF
    
            IF i_nowHour <> l_hour THEN
                l_hour := i_nowHour;
            // l_FlowHour := 0;
            END_IF
    
            IF i_nowMonth <> l_month THEN
            l_month := i_nowMonth;
            // l_FlowMonth := 0;
            END_IF
    
            IF i_nowYear <> l_year THEN
            l_year := i_nowYear;
            // l_FlowYear := 0;
            END_IF
    
            ImpMass := l_impMass;
            Flow := l_Flow;
            FlowHour := l_FlowHour;
            FlowDay := l_FlowDay;
            FlowMonth := l_FlowMonth;
            FlowYear := l_FlowYear;
        
        Work := true;
        END_IF
    
    
    END_FUNCTION_BLOCK
    Код с записями переменных делал и внутри условия и вне, без изменений.
    Ничего не понятно, но очень интересно

  7. #17

    По умолчанию

    Как считаете, будет ли работать, если начать сравнение с конкретными числами:
    например:
    ЕСЛИ час = 00 И минута = 00 и СЕКУНДА = 00
    поток день = 0
    КОНЕЦ ЕСЛИ

    P.S.: Так действительно значение сохраняется

    Только вот, боюсь, с показаниями за месяц это работать не будет, ибо у нас бывает 28, 29, 30, 31 день в месяце. Ну и 365-366 дней в году)
    Последний раз редактировалось Григори; 28.12.2023 в 10:44.
    Ничего не понятно, но очень интересно

  8. #18

    По умолчанию

    Почему:
    Код:
    Work := true;
    i_Work

    Вы не выходите из этого if при таком условии...

    И

    Код:
    l_FlowDay := 0;
    не закомментировали... Внимательнее...
    Последний раз редактировалось МихаилГл; 28.12.2023 в 10:44.

  9. #19

    По умолчанию

    Цитата Сообщение от МихаилГл Посмотреть сообщение
    Почему:
    Код:
    Work := true;
    i_Work

    Вы не выходите из этого if при таком условии...
    к i_Work и Work привязана одна и та же переменная, просто i_Work - входная, Work - выходная

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

  10. #20

    По умолчанию

    Цитата Сообщение от МихаилГл Посмотреть сообщение

    Код:
    l_FlowDay := 0;
    не закомментировали... Внимательнее...
    Так я и пишу ФБ, чтобы сделать потоки за определенное кол-во времени, если не обнулять - будет просто общий поток(а он работает нормально)

    Суть такая:

    Программа считает целый день воду и, как только наступают след. сутки, она сбрасывает показания в 0 и считает заново (суточный/месячный/годовой расход).
    Если в сутках у нас только 24, то сделать самое просто сравнение времени с нулями еще можно. Но вот с месяцами и годами так не выйдет, ибо всегда разное, поэтому просто каждый цикл смотрим и сравниваем текущие входные числа с локальными, если не равно, то перезаписать локальную и сбросить счетчик
    Последний раз редактировалось Григори; 28.12.2023 в 10:54.
    Ничего не понятно, но очень интересно

Страница 2 из 5 ПерваяПервая 1234 ... ПоследняяПоследняя

Похожие темы

  1. Ответов: 11
    Последнее сообщение: 05.05.2020, 16:00
  2. Автоматизация сохранения трендов
    от Vinsen в разделе Master SCADA 3
    Ответов: 12
    Последнее сообщение: 08.10.2018, 11:51
  3. Ошибка сохранения проекта MASTERSCADA
    от AndreMary в разделе Master SCADA 3
    Ответов: 5
    Последнее сообщение: 13.02.2015, 13:04
  4. Ошибка пути сохранения отчета
    от klg в разделе Master SCADA 3
    Ответов: 2
    Последнее сообщение: 01.12.2014, 16:56
  5. режим сохранения графиков
    от soi в разделе OWEN Proces Manager
    Ответов: 1
    Последнее сообщение: 26.03.2012, 10:49

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

Ваши права

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