FUNCTION_BLOCK DIFFEQ VAR_INPUT RUN : BOOL ; (* 1 = run, 0 = reset *) XIN : REAL ; A : ARRAY[1..] OF REAL ; (* Input coefficients *) M : INT ; (* Length of input history *) B : ARRAY[0..] OF REAL ; (* Output coefficients *) N : INT ; (* Length of output history *) END_VAR VAR_OUTPUT XOUT : REAL := 0.0 ; END_VAR VAR (* NOTE : Manufacturer may specify other array sizes *) XI : ARRAY [0..128] OF REAL ; (* Input history *) XO : ARRAY [0..128] OF REAL ; (* Output history *) I : INT ; END_VAR XO[0] := XOUT ; XI[0] := XIN ; XOUT := B[0] * XIN ; IF RUN THEN FOR I := M TO 1 BY -1 DO XOUT := XOUT + A[I] * XO[I] ; XO[I] := XO[I-1]; END_FOR; FOR I := N TO 1 BY -1 DO XOUT := XOUT + B[I] * XI[I] ; XI[I] := XI[I-1]; END_FOR; ELSE FOR I := 1 TO M DO XO[I] := 0.0; END_FOR; FOR I := 1 TO N DO XI[I] := 0.0; END_FOR; END_IF ; END_FUNCTION_BLOCK