Цитата Сообщение от 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

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