diff -r 000000000000 -r fb772792efd1 lib/counter.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/counter.txt Wed Jan 31 15:32:38 2007 +0100 @@ -0,0 +1,94 @@ +(* Following taken directly from the IEC 61131.3 draft standard *) + +(* + * An IEC 61131-3 IL and ST compiler. + * + * Based on the + * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10) + * + *) + + +(* + * This is part of the library conatining the functions + * and function blocks defined in the standard. + * + * Counter function blocks + * ----------------------- + *) + + +FUNCTION_BLOCK CTU + VAR_INPUT + CU : BOOL; + R : BOOL; + PV : INT; + END_VAR + VAR_OUTPUT + Q : BOOL; + CV : INT; + END_VAR + VAR RETAIN + PVmax : INT; + END_VAR + IF R THEN CV := 0 ; + ELSIF CU AND (CV < PVmax) + THEN CV := CV+1; + END_IF ; + Q := (CV >= PV) ; +END_FUNCTION_BLOCK + + +FUNCTION_BLOCK CTD + VAR_INPUT + CD : BOOL; + LD : BOOL; + PV : INT; + END_VAR + VAR_OUTPUT + Q : BOOL; + CV : INT; + END_VAR + VAR RETAIN + PVmin : INT; + END_VAR + IF LD THEN CV := PV ; + ELSIF CD AND (CV > PVmin) + THEN CV := CV-1; + END_IF ; + Q := (CV <= 0) ; +END_FUNCTION_BLOCK + + +FUNCTION_BLOCK CTUD + VAR_INPUT + CU : BOOL; + CD : BOOL; + R : BOOL; + LD : BOOL; + PV : INT; + END_VAR + VAR_OUTPUT + QU : BOOL; + QD : BOOL; + CV : INT; + END_VAR + VAR RETAIN + PVmax : INT; + PVmin : INT; + END_VAR + IF R THEN CV := 0 ; + ELSIF LD THEN CV := PV ; + ELSE + IF NOT (CU AND CD) THEN + IF CU AND (CV < PVmax) + THEN CV := CV+1; + ELSIF CD AND (CV > PVmin) + THEN CV := CV-1; + END_IF; + END_IF; + END_IF ; + QU := (CV >= PV) ; + QD := (CV <= 0) ; +END_FUNCTION_BLOCK +