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