Variable forcing now uses limited list and buffer instead of systematical instance tree traversal and in-tree "fvalue" to keep track of forced value for pointed variables (external, located). Pointer swapping is performed when forcing externals and located, with backup being restored when forcing is reset. Match Beremiz commit 93ad018fb602.
FUNCTION_BLOCK DELAY (* N-sample delay *)
VAR_INPUT
RUN : BOOL ; (* 1 = run, 0 = reset *)
XIN : REAL ;
N : INT (* 0 <= N < 128 or manufacturer- *)
END_VAR (* specified maximum value *)
VAR_OUTPUT XOUT : REAL; END_VAR (* Delayed output *)
VAR X : ARRAY [0..127] (* N-Element queue *)
OF REAL; (* with FIFO discipline *)
I, IXIN, IXOUT : INT := 0;
END_VAR
IF RUN THEN IXIN := MOD(IXIN + 1, 128) ; X[IXIN] := XIN ;
IXOUT := MOD(IXOUT + 1, 128) ; XOUT := X[IXOUT];
ELSE XOUT := XIN ; IXIN := N ; IXOUT := 0;
FOR I := 0 TO N DO X[I] := XIN; END_FOR;
END_IF ;
END_FUNCTION_BLOCK