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