etisserant@0: FUNCTION_BLOCK DELAY (* N-sample delay *) etisserant@0: VAR_INPUT etisserant@0: RUN : BOOL ; (* 1 = run, 0 = reset *) etisserant@0: XIN : REAL ; etisserant@0: N : INT (* 0 <= N < 128 or manufacturer- *) etisserant@0: END_VAR (* specified maximum value *) etisserant@0: VAR_OUTPUT XOUT : REAL; END_VAR (* Delayed output *) etisserant@0: VAR X : ARRAY [0..127] (* N-Element queue *) etisserant@0: OF REAL; (* with FIFO discipline *) etisserant@0: I, IXIN, IXOUT : INT := 0; etisserant@0: END_VAR etisserant@0: IF RUN THEN IXIN := MOD(IXIN + 1, 128) ; X[IXIN] := XIN ; etisserant@0: IXOUT := MOD(IXOUT + 1, 128) ; XOUT := X[IXOUT]; etisserant@0: ELSE XOUT := XIN ; IXIN := N ; IXOUT := 0; etisserant@0: FOR I := 0 TO N DO X[I] := XIN; END_FOR; etisserant@0: END_IF ; etisserant@0: END_FUNCTION_BLOCK etisserant@0: