Added double curly braces for pragma (kept single curly braces for compatibility). Added macro def and undef surrounding pragma to simplify user code. Moved useless comment from generated code back to code generator.
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