Потому что у вас похоже используются переменные из этого ФБ в основном коде (не смотрел внимательно), а он (ФБ) начнет работать только после 5 секунд после подачи питания.
Вид для печати
Вы запись входных и выходных переменных выведите из под условия разрешения работы - они должны всегда выполняться
Но это не поможет - у вас локальное время не сохраняется, поэтому после перезагрузки все и сбрасывается. Поэтому как-то так
Код:Чтение входных данных
if РАЗРЕШИТЬ then
здесь считаем
else
запись текущего времени в локальные переменные
end_if
Запись выходных данных
Переменные l_hour, l_month и др. на выход блока и через энергонезависимую переменную обратно на входы, видимо только так
Вот, проверил, не сбрасывает
Вложение 72684Код: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
Но, есть нюанс - если перерыв питания придется на стык часа, дня и т.д., то не сбросится.
Здесь надо по другому делать
Короче прошлое время всегда равно 0, поэтому всё будет сбрасываться. Сделал инициализацию времени при включении. Всё стало работать.