diff -r af3d0e3ac65d -r 1679f514f38a lib/counter.txt --- a/lib/counter.txt Mon Apr 04 15:22:42 2011 +0100 +++ b/lib/counter.txt Mon Apr 04 15:26:13 2011 +0100 @@ -18,6 +18,13 @@ *) + +(******************) +(* *) +(* C T U *) +(* *) +(******************) + FUNCTION_BLOCK CTU VAR_INPUT CU : BOOL; @@ -28,16 +35,96 @@ Q : BOOL; CV : INT; END_VAR - - VAR RRR : REAL; END_VAR - RRR := 9.9; - - IF R THEN CV := 0 ; - ELSIF CU AND (CV < PV) - THEN CV := CV+1; - END_IF ; - Q := (CV >= PV) ; -END_FUNCTION_BLOCK + IF R THEN CV := 0 ; + ELSIF CU AND (CV < PV) + THEN CV := CV+1; + END_IF ; + Q := (CV >= PV) ; +END_FUNCTION_BLOCK + + +FUNCTION_BLOCK CTU_DINT + VAR_INPUT + CU : BOOL; + R : BOOL; + PV : DINT; + END_VAR + VAR_OUTPUT + Q : BOOL; + CV : DINT; + END_VAR + IF R THEN CV := 0 ; + ELSIF CU AND (CV < PV) + THEN CV := CV+1; + END_IF ; + Q := (CV >= PV) ; +END_FUNCTION_BLOCK + + +FUNCTION_BLOCK CTU_LINT + VAR_INPUT + CU : BOOL; + R : BOOL; + PV : LINT; + END_VAR + VAR_OUTPUT + Q : BOOL; + CV : LINT; + END_VAR + IF R THEN CV := 0 ; + ELSIF CU AND (CV < PV) + THEN CV := CV+1; + END_IF ; + Q := (CV >= PV) ; +END_FUNCTION_BLOCK + + +FUNCTION_BLOCK CTU_UDINT + VAR_INPUT + CU : BOOL; + R : BOOL; + PV : UDINT; + END_VAR + VAR_OUTPUT + Q : BOOL; + CV : UDINT; + END_VAR + IF R THEN CV := 0 ; + ELSIF CU AND (CV < PV) + THEN CV := CV+1; + END_IF ; + Q := (CV >= PV) ; +END_FUNCTION_BLOCK + + +FUNCTION_BLOCK CTU_ULINT + VAR_INPUT + CU : BOOL; + R : BOOL; + PV : ULINT; + END_VAR + VAR_OUTPUT + Q : BOOL; + CV : ULINT; + END_VAR + IF R THEN CV := 0 ; + ELSIF CU AND (CV < PV) + THEN CV := CV+1; + END_IF ; + Q := (CV >= PV) ; +END_FUNCTION_BLOCK + + + + + + + +(******************) +(* *) +(* C T D *) +(* *) +(******************) FUNCTION_BLOCK CTD @@ -58,6 +145,85 @@ END_FUNCTION_BLOCK +FUNCTION_BLOCK CTD_DINT + VAR_INPUT + CD : BOOL; + LD : BOOL; + PV : DINT; + END_VAR + VAR_OUTPUT + Q : BOOL; + CV : DINT; + END_VAR + IF LD THEN CV := PV ; + ELSIF CD AND (CV > 0) + THEN CV := CV-1; + END_IF ; + Q := (CV <= 0) ; +END_FUNCTION_BLOCK + + +FUNCTION_BLOCK CTD_LINT + VAR_INPUT + CD : BOOL; + LD : BOOL; + PV : LINT; + END_VAR + VAR_OUTPUT + Q : BOOL; + CV : LINT; + END_VAR + IF LD THEN CV := PV ; + ELSIF CD AND (CV > 0) + THEN CV := CV-1; + END_IF ; + Q := (CV <= 0) ; +END_FUNCTION_BLOCK + + +FUNCTION_BLOCK CTD_UDINT + VAR_INPUT + CD : BOOL; + LD : BOOL; + PV : UDINT; + END_VAR + VAR_OUTPUT + Q : BOOL; + CV : UDINT; + END_VAR + IF LD THEN CV := PV ; + ELSIF CD AND (CV > 0) + THEN CV := CV-1; + END_IF ; + Q := (CV <= 0) ; +END_FUNCTION_BLOCK + + +FUNCTION_BLOCK CTD_ULINT + VAR_INPUT + CD : BOOL; + LD : BOOL; + PV : ULINT; + END_VAR + VAR_OUTPUT + Q : BOOL; + CV : ULINT; + END_VAR + IF LD THEN CV := PV ; + ELSIF CD AND (CV > 0) + THEN CV := CV-1; + END_IF ; + Q := (CV <= 0) ; +END_FUNCTION_BLOCK + + +(********************) +(* *) +(* C T U D *) +(* *) +(********************) + + FUNCTION_BLOCK CTUD VAR_INPUT CU : BOOL; @@ -86,3 +252,118 @@ QD := (CV <= 0) ; END_FUNCTION_BLOCK + +FUNCTION_BLOCK CTUD_DINT + VAR_INPUT + CU : BOOL; + CD : BOOL; + R : BOOL; + LD : BOOL; + PV : DINT; + END_VAR + VAR_OUTPUT + QU : BOOL; + QD : BOOL; + CV : DINT; + END_VAR + IF R THEN CV := 0 ; + ELSIF LD THEN CV := PV ; + ELSE + IF NOT (CU AND CD) THEN + IF CU AND (CV < PV) + THEN CV := CV+1; + ELSIF CD AND (CV > 0) + THEN CV := CV-1; + END_IF; + END_IF; + END_IF ; + QU := (CV >= PV) ; + QD := (CV <= 0) ; +END_FUNCTION_BLOCK + + +FUNCTION_BLOCK CTUD_LINT + VAR_INPUT + CU : BOOL; + CD : BOOL; + R : BOOL; + LD : BOOL; + PV : LINT; + END_VAR + VAR_OUTPUT + QU : BOOL; + QD : BOOL; + CV : LINT; + END_VAR + IF R THEN CV := 0 ; + ELSIF LD THEN CV := PV ; + ELSE + IF NOT (CU AND CD) THEN + IF CU AND (CV < PV) + THEN CV := CV+1; + ELSIF CD AND (CV > 0) + THEN CV := CV-1; + END_IF; + END_IF; + END_IF ; + QU := (CV >= PV) ; + QD := (CV <= 0) ; +END_FUNCTION_BLOCK + + +FUNCTION_BLOCK CTUD_UDINT + VAR_INPUT + CU : BOOL; + CD : BOOL; + R : BOOL; + LD : BOOL; + PV : UDINT; + END_VAR + VAR_OUTPUT + QU : BOOL; + QD : BOOL; + CV : UDINT; + END_VAR + IF R THEN CV := 0 ; + ELSIF LD THEN CV := PV ; + ELSE + IF NOT (CU AND CD) THEN + IF CU AND (CV < PV) + THEN CV := CV+1; + ELSIF CD AND (CV > 0) + THEN CV := CV-1; + END_IF; + END_IF; + END_IF ; + QU := (CV >= PV) ; + QD := (CV <= 0) ; +END_FUNCTION_BLOCK + + +FUNCTION_BLOCK CTUD_ULINT + VAR_INPUT + CU : BOOL; + CD : BOOL; + R : BOOL; + LD : BOOL; + PV : ULINT; + END_VAR + VAR_OUTPUT + QU : BOOL; + QD : BOOL; + CV : ULINT; + END_VAR + IF R THEN CV := 0 ; + ELSIF LD THEN CV := PV ; + ELSE + IF NOT (CU AND CD) THEN + IF CU AND (CV < PV) + THEN CV := CV+1; + ELSIF CD AND (CV > 0) + THEN CV := CV-1; + END_IF; + END_IF; + END_IF ; + QU := (CV >= PV) ; + QD := (CV <= 0) ; +END_FUNCTION_BLOCK