Вот мой вариант блока

Код:
FUNCTION_BLOCK ENGINE_HOURS
    VAR_INPUT
        START: BOOL; (*АКТИВАЦИЯ СЧЕТА МОТОЧАСОВ*)
        I_TH : DWORD; (*ВВОД НОВОГО ЗНАЧЕНИЯ НАРАБОТКИ В ЧАСАХ В РУЧНУЮ*)
        I_TD : DWORD; (*ВВОД НОВОГО ЗНАЧЕНИЯ НАРАБОТКИ В СУТКАХ В РУЧНУЮ*)
        ENTER: BOOL; (*АКТИВАЦИЯ ВВЕДЕННЫХ В РУЧНУЮ ЗНАЧЕНИЙ*)
        RESET: BOOL; (*СБРОС СЧЕТЧИКОВ ПРИНУДИТЕЛЬНО*)
    END_VAR
    VAR_OUTPUT
        O_TM : WORD; (*ВРЕМЯ НАРАБОТКИ В МИНУТАХ*)
        O_TH : WORD; (*ВРЕМЯ НАРАБОТКИ В ЧАСАХ*)
        O_TD : WORD; (*ВРЕМЯ НАРАБОТКИ В СУТКАХ*)
    END_VAR
    VAR
        tStart:         TIME; (* Точка времени начала счета *)
        tWorking:       TIME; (* Общее время работы счетчика *)
        tMemmory:       TIME; (* Общее время наработки после отключения *)
        dwCalc:         DWORD; (* Для расчета минут и часов *)
        xStartMemmory:  BOOL;
        xResetMemmory:  BOOL;
    END_VAR

    (* Если появился сигнал на входе сброса, сбрасываем счетчик *)
    IF RESET AND NOT xResetMemmory THEN
        tStart   := T#0s;
        tMemmory := T#0s;
    END_IF;
    xResetMemmory := RESET;

    (* Определяем передний фронт сигнала начала измерения.
    и сохраняем точку времени *)
    IF START AND NOT xStartMemmory THEN
        tStart := TIME();
    END_IF;

    (* Определяем задний фронт START, и если отключился
    сохраняем наработанное время в переменную *)
    IF NOT START AND xStartMemmory THEN
        tMemmory := tMemmory + (TIME() - tStart);
    END_IF;
    xStartMemmory := START;

    tWorking := (TIME() - tStart) + tMemmory;
    IF ENTER THEN
        tWorking := tWorking + DWORD_TO_TIME((I_TH * 3600000) + (I_TD * 86400000));
    END_IF;
    
    dwCalc := TIME_TO_DWORD(tWorking) / (1000 * 60); (* dwCalc хранит общее количество минут *)
    O_TM   := dwCalc MOD 60; (* Остаток минут *)
    dwCalc := dwCalc / 60;   (* dwCalc хранит общее количество часов *)
    O_TH   := dwCalc MOD 24; (* Остаток часов *)
    O_TD   := dwCalc / 24;   (* Общее количество суток *)
END_FUNCTION_BLOCK
1. Правда такой блок имеет ограничение и может считать только до 49 дней включая добавочные часы и дни.
2. Блок должен определяться в энергонезависимой памяти.
3. Расчет часов и дней происходит не общий а остаток. Например 10 дней 12 часов. То есть часов ни когда не будет больше чем 23. Тоже самое касается минут.