FUNCTION "FC_GetSetLocalTime" : Int
TITLE = 'Read / Write / Set Local Time (DTL)'
VERSION : 1.1
// ────────────────────────────────────────────────────────────────
//  Purpose:
//    - Read current local time (RD_LOC_T)
//    - Write new local date/time (WR_LOC_T)
//  Call examples:
//    Read:  xWrite := FALSE;  RET_VAL := FC_GetSetLocalTime(xWrite:=FALSE, dtLocal=>CurrentTime);
//    Write: xWrite := TRUE;   RET_VAL := FC_GetSetLocalTime(xWrite:=TRUE,  dtLocal:=NewTime);
// ────────────────────────────────────────────────────────────────

VAR_INPUT
    xWrite      : BOOL;             // FALSE = read only   TRUE = write new time
    dtLocal     : DTL;              // IN:  new local time when xWrite=TRUE
                                    // OUT: current local time when xWrite=FALSE
END_VAR

VAR_OUTPUT
    xDone       : BOOL;             // TRUE = operation finished (no error)
    xError      : BOOL;             // TRUE = failed
    wStatus     : WORD;             // Detailed status / error code
END_VAR

VAR_TEMP
    ret         : Int;
END_VAR

BEGIN

xDone   := FALSE;
xError  := FALSE;
wStatus := 16#0000;
ret     := 0;

IF xWrite THEN
    // ─── WRITE new local time ─────────────────────────────────────
    WR_LOC_T(
        LOCTIME := dtLocal,     // Desired local date/time
        RET_VAL => ret,
        STATUS  => wStatus
    );

    IF ret = 0 THEN
        xDone  := TRUE;
    ELSE
        xError := TRUE;
    END_IF;

ELSE
    // ─── READ current local time ──────────────────────────────────
    RD_LOC_T(
        RET_VAL => ret,
        STATUS  => wStatus,
        LOCTIME => dtLocal      // Current local time returned here
    );

    IF ret = 0 THEN
        xDone  := TRUE;
    ELSE
        xError := TRUE;
    END_IF;
END_IF;

"FC_GetSetLocalTime" := ret;    // Usually 0 = OK, positive = warning, negative = error

END_FUNCTION