Цитата Сообщение от 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