Страница 4 из 5 ПерваяПервая ... 2345 ПоследняяПоследняя
Показано с 31 по 40 из 44

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

  1. #31

    По умолчанию

    Цитата Сообщение от Григори Посмотреть сообщение
    Почему-то при задержке ФБ перестает считать, хотя все срабатывает (смотрю по цене импульса).
    Пока сделал с тупым сравнением на равенство дат и времени (но если ПРку рубанет в эти нужные моменты, боюсь, она не сбросит показания).
    Попробую еще связаться с этой проблемой к ОВЕНовцам, может они что-то подскажут)

    Если получится вывести идеальный вариант ФБ, отпишусь в теме
    Потому что у вас похоже используются переменные из этого ФБ в основном коде (не смотрел внимательно), а он (ФБ) начнет работать только после 5 секунд после подачи питания.

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

    По умолчанию

    Цитата Сообщение от Григори Посмотреть сообщение
    Код:
    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_nowHour = 00 AND i_nowMinute = 00 AND i_nowSecond = 00 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;
        
        i_Work := true;
        END_IF
    
    
    END_FUNCTION_BLOCK
    Вы запись входных и выходных переменных выведите из под условия разрешения работы - они должны всегда выполняться
    Но это не поможет - у вас локальное время не сохраняется, поэтому после перезагрузки все и сбрасывается. Поэтому как-то так
    Код:
    Чтение входных данных
    if РАЗРЕШИТЬ then
       здесь считаем
    else
       запись текущего времени в локальные переменные
    end_if
    Запись выходных данных
    Последний раз редактировалось Dimensy; 28.12.2023 в 12:36.

  3. #33

    По умолчанию

    Цитата Сообщение от Dimensy Посмотреть сообщение
    Вы запись входных и выходных переменных выведите из под условия разрешения работы - они должны всегда выполняться
    Но это не поможет - у вас локальное время не сохраняется, поэтому после перезагрузки все и сбрасывается. Поэтому как-то так
    Код:
    Чтение входных данных
    if РАЗРЕШИТЬ then
       здесь считаем
    else
       запись текущего времени в локальные переменные
    end_if
    Запись выходных данных
    Тоже делал, и сейчас еще раз перепроверил, не работает
    Ничего не понятно, но очень интересно

  4. #34

    По умолчанию

    Переменные l_hour, l_month и др. на выход блока и через энергонезависимую переменную обратно на входы, видимо только так

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

    По умолчанию

    Цитата Сообщение от Григори Посмотреть сообщение
    Тоже делал, и сейчас еще раз перепроверил, не работает
    Вот, проверил, не сбрасывает
    Код:
    function_block Flowmeter //имя функционального блока.
    
        var_input //объявление входных переменных
            bEn:            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;
        end_var
            
        var //объявление локальных переменных
            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
        
        l_Flow := i_Flow;
        l_FlowYear := i_FlowYear;
        l_FlowMonth := i_FlowMonth;
        l_FlowDay := i_FlowDay;
        l_FlowHour := i_FlowHour;
        l_impMass:= i_ImpMass;
        
        if bEn then
       
            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_FlowDay := 0;
                l_day := i_nowDay; 
            end_if
        
            if i_nowHour <> l_hour then
                 l_FlowHour := 0;
                l_hour := i_nowHour; 
            end_if
        
            if i_nowMonth <> l_month then
                l_FlowMonth := 0;
                l_month := i_nowMonth; 
            end_if
        
            if i_nowYear <> l_year then
                l_FlowYear := 0;
                l_year := i_nowYear; 
            end_if
        else
            l_year := i_nowYear;
            l_month := i_nowMonth;
            l_day := i_nowDay;
            l_hour := i_nowHour;
        end_if
        
        ImpMass := l_impMass;
        Flow := l_Flow;
        FlowHour := l_FlowHour;
        FlowDay := l_FlowDay;
        FlowMonth := l_FlowMonth;
        FlowYear := l_FlowYear;
    
    end_function_block
    111.owle

    Но, есть нюанс - если перерыв питания придется на стык часа, дня и т.д., то не сбросится.
    Здесь надо по другому делать

  6. #36

    По умолчанию

    Цитата Сообщение от Dimensy Посмотреть сообщение
    Вот, проверил, не сбрасывает
    Код:
    function_block Flowmeter //имя функционального блока.
    
        var_input //объявление входных переменных
            bEn:            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;
        end_var
            
        var //объявление локальных переменных
            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
        
        l_Flow := i_Flow;
        l_FlowYear := i_FlowYear;
        l_FlowMonth := i_FlowMonth;
        l_FlowDay := i_FlowDay;
        l_FlowHour := i_FlowHour;
        l_impMass:= i_ImpMass;
        
        if bEn then
       
            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_FlowDay := 0;
                l_day := i_nowDay; 
            end_if
        
            if i_nowHour <> l_hour then
                 l_FlowHour := 0;
                l_hour := i_nowHour; 
            end_if
        
            if i_nowMonth <> l_month then
                l_FlowMonth := 0;
                l_month := i_nowMonth; 
            end_if
        
            if i_nowYear <> l_year then
                l_FlowYear := 0;
                l_year := i_nowYear; 
            end_if
        else
            l_year := i_nowYear;
            l_month := i_nowMonth;
            l_day := i_nowDay;
            l_hour := i_nowHour;
        end_if
        
        ImpMass := l_impMass;
        Flow := l_Flow;
        FlowHour := l_FlowHour;
        FlowDay := l_FlowDay;
        FlowMonth := l_FlowMonth;
        FlowYear := l_FlowYear;
    
    end_function_block
    111.owle

    Но, есть нюанс - если перерыв питания придется на стык часа, дня и т.д., то не сбросится.
    Здесь надо по другому делать
    Вероятность просадки по питанию в стыки крайне мала, как мне кажется, но не равна нулю, к сожалению. Спасибо большое за предложенное решение
    А по-другому, это как? Вернее, с какого ракурса смотреть на решение задачи?
    Ничего не понятно, но очень интересно

  7. #37

    По умолчанию

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

  8. #38

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Короче прошлое время всегда равно 0, поэтому всё будет сбрасываться. Сделал инициализацию времени при включении. Всё стало работать.
    Спасибо большое за решение, что-то совсем запутался с этой энергонезависимостью того-сего, не подумал насчет инициализации
    Ничего не понятно, но очень интересно

  9. #39

    По умолчанию

    Цитата Сообщение от Григори Посмотреть сообщение
    Спасибо большое за решение, что-то совсем запутался с этой энергонезависимостью того-сего, не подумал насчет инициализации
    Двоишник)...

  10. #40

    По умолчанию

    Цитата Сообщение от МихаилГл Посмотреть сообщение
    Двоишник)...
    Не двоечник, а веб-разработчик
    Где вообще можно посмотреть, какие переменные в каких соусах энергонезависимые?
    Руководство по OL штудировать?
    Ничего не понятно, но очень интересно

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

Похожие темы

  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

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

Ваши права

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