
Сообщение от
kondor3000
Жалко только, что при отключении питания ничего не сохраняется.
Да, мой косяк.
Исправил
Код:
FUNCTION_BLOCK RunTime_Counter //имя функционального блока
VAR_INPUT //объявление входных переменных
Run : BOOL; //разрешение работы
Set : BOOL; //запись уставок времени
Res : BOOL; //сброс счетчиов
SetHour, SetMin, SetSec, SetOn: UDINT; //входы уставок
Work_ : udint; //Вход для энергонезависимоцй переменной наработки
cOn_ : udint; //Вход для энергонезависимой перееменной количество включений
END_VAR
VAR_OUTPUT //объявление выходных переменных
Work, cOn : UDINT; //выходы для энергонезависимых переменных
sHour, sMin, sSec, sOn: UDINT; //выходы времени и количества включений
END_VAR
VAR //объявление локальных переменных
T, T1: UDINT;
RunTrig : SYS.RTRIG;
init : BOOL:=true;
END_VAR
T:= TIME_TO_UDINT(GET_TIME());
if Init then //Инициализация при первом включении
Work := Work_;
cOn := cOn_;
SetHour := Work / 3600;
SetMin := (Work / 60) mod 60;
SetSec := Work mod 60;
SetOn:=cOn;
T1 := T;
Init := false;
end_if
RunTrig(I := Run);
if Run then
if T-T1 >= 1000 then
Work := Work_ + 1;
T1 := T;
end_if
cOn := cOn_ + bool_to_udint(RunTrig.Q);
sHour := Work / 3600;
sMin := (Work / 60) mod 60;
sSec := Work mod 60;
sOn:=cOn;
else
T1 := T;
sHour := SetHour;
sMin := SetMin;
sSec := SetSec;
sOn := SetOn;
if Set then
Work := sHour * 3600 + sMin * 60 + sSec;
cOn := sOn;
end_if
if Res then
sHour := 0;
sMin := 0;
sSec := 0;
sOn := 0;
Work := 0;
cOn := 0;
end_if
end_if
END_FUNCTION_BLOCK