Примерно так, но это не точно...
Вид для печати
Код:Таймер (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
Как считаете, будет ли работать, если начать сравнение с конкретными числами:
например:
ЕСЛИ час = 00 И минута = 00 и СЕКУНДА = 00
поток день = 0
КОНЕЦ ЕСЛИ
P.S.: Так действительно значение сохраняется
Только вот, боюсь, с показаниями за месяц это работать не будет, ибо у нас бывает 28, 29, 30, 31 день в месяце. Ну и 365-366 дней в году)
Почему:
i_WorkКод:Work := true;
Вы не выходите из этого if при таком условии...
И
не закомментировали... Внимательнее...Код:l_FlowDay := 0;
Так я и пишу ФБ, чтобы сделать потоки за определенное кол-во времени, если не обнулять - будет просто общий поток(а он работает нормально)
Суть такая:
Программа считает целый день воду и, как только наступают след. сутки, она сбрасывает показания в 0 и считает заново (суточный/месячный/годовой расход).
Если в сутках у нас только 24, то сделать самое просто сравнение времени с нулями еще можно. Но вот с месяцами и годами так не выйдет, ибо всегда разное, поэтому просто каждый цикл смотрим и сравниваем текущие входные числа с локальными, если не равно, то перезаписать локальную и сбросить счетчик