Код:Таймер (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 дней в году)
Последний раз редактировалось Григори; 28.12.2023 в 10:44.
Ничего не понятно, но очень интересно
Почему:
i_WorkКод:Work := true;
Вы не выходите из этого if при таком условии...
И
не закомментировали... Внимательнее...Код:l_FlowDay := 0;
Последний раз редактировалось МихаилГл; 28.12.2023 в 10:44.
Так я и пишу ФБ, чтобы сделать потоки за определенное кол-во времени, если не обнулять - будет просто общий поток(а он работает нормально)
Суть такая:
Программа считает целый день воду и, как только наступают след. сутки, она сбрасывает показания в 0 и считает заново (суточный/месячный/годовой расход).
Если в сутках у нас только 24, то сделать самое просто сравнение времени с нулями еще можно. Но вот с месяцами и годами так не выйдет, ибо всегда разное, поэтому просто каждый цикл смотрим и сравниваем текущие входные числа с локальными, если не равно, то перезаписать локальную и сбросить счетчик
Последний раз редактировалось Григори; 28.12.2023 в 10:54.
Ничего не понятно, но очень интересно