etisserant@0: (* Following taken directly from the IEC 61131.3 draft standard *) etisserant@0: etisserant@0: (* etisserant@0: * An IEC 61131-3 IL and ST compiler. etisserant@0: * etisserant@0: * Based on the etisserant@0: * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10) etisserant@0: * etisserant@0: *) etisserant@0: etisserant@0: etisserant@0: (* etisserant@0: * This is part of the library conatining the functions etisserant@0: * and function blocks defined in the standard. etisserant@0: * etisserant@0: * Counter function blocks etisserant@0: * ----------------------- etisserant@0: *) etisserant@0: etisserant@0: msousa@276: msousa@276: (******************) msousa@276: (* *) msousa@276: (* C T U *) msousa@276: (* *) msousa@276: (******************) msousa@276: msousa@290: etisserant@0: FUNCTION_BLOCK CTU etisserant@0: VAR_INPUT etisserant@0: CU : BOOL; etisserant@0: R : BOOL; etisserant@0: PV : INT; etisserant@0: END_VAR etisserant@0: VAR_OUTPUT etisserant@0: Q : BOOL; etisserant@0: CV : INT; etisserant@0: END_VAR msousa@290: VAR msousa@290: CU_T: R_TRIG; msousa@290: END_VAR msousa@290: msousa@290: CU_T(CU); msousa@290: IF R THEN CV := 0 ; msousa@290: ELSIF CU_T.Q AND (CV < PV) msousa@276: THEN CV := CV+1; msousa@276: END_IF ; msousa@276: Q := (CV >= PV) ; msousa@276: END_FUNCTION_BLOCK msousa@276: msousa@276: msousa@276: FUNCTION_BLOCK CTU_DINT msousa@276: VAR_INPUT msousa@276: CU : BOOL; msousa@276: R : BOOL; msousa@276: PV : DINT; msousa@276: END_VAR msousa@276: VAR_OUTPUT msousa@276: Q : BOOL; msousa@276: CV : DINT; msousa@276: END_VAR msousa@290: VAR msousa@290: CU_T: R_TRIG; msousa@290: END_VAR msousa@290: msousa@290: CU_T(CU); msousa@290: IF R THEN CV := 0 ; msousa@290: ELSIF CU_T.Q AND (CV < PV) msousa@276: THEN CV := CV+1; msousa@276: END_IF ; msousa@276: Q := (CV >= PV) ; msousa@276: END_FUNCTION_BLOCK msousa@276: msousa@276: msousa@276: FUNCTION_BLOCK CTU_LINT msousa@276: VAR_INPUT msousa@276: CU : BOOL; msousa@276: R : BOOL; msousa@276: PV : LINT; msousa@276: END_VAR msousa@276: VAR_OUTPUT msousa@276: Q : BOOL; msousa@276: CV : LINT; msousa@276: END_VAR msousa@290: VAR msousa@290: CU_T: R_TRIG; msousa@290: END_VAR msousa@290: msousa@290: CU_T(CU); msousa@290: IF R THEN CV := 0 ; msousa@290: ELSIF CU_T.Q AND (CV < PV) msousa@276: THEN CV := CV+1; msousa@276: END_IF ; msousa@276: Q := (CV >= PV) ; msousa@276: END_FUNCTION_BLOCK msousa@276: msousa@276: msousa@276: FUNCTION_BLOCK CTU_UDINT msousa@276: VAR_INPUT msousa@276: CU : BOOL; msousa@276: R : BOOL; msousa@276: PV : UDINT; msousa@276: END_VAR msousa@276: VAR_OUTPUT msousa@276: Q : BOOL; msousa@276: CV : UDINT; msousa@276: END_VAR msousa@290: VAR msousa@290: CU_T: R_TRIG; msousa@290: END_VAR msousa@290: msousa@290: CU_T(CU); msousa@290: IF R THEN CV := 0 ; msousa@290: ELSIF CU_T.Q AND (CV < PV) msousa@276: THEN CV := CV+1; msousa@276: END_IF ; msousa@276: Q := (CV >= PV) ; msousa@276: END_FUNCTION_BLOCK msousa@276: msousa@276: msousa@276: FUNCTION_BLOCK CTU_ULINT msousa@276: VAR_INPUT msousa@276: CU : BOOL; msousa@276: R : BOOL; msousa@276: PV : ULINT; msousa@276: END_VAR msousa@276: VAR_OUTPUT msousa@276: Q : BOOL; msousa@276: CV : ULINT; msousa@276: END_VAR msousa@290: VAR msousa@290: CU_T: R_TRIG; msousa@290: END_VAR msousa@290: msousa@290: CU_T(CU); msousa@290: IF R THEN CV := 0 ; msousa@290: ELSIF CU_T.Q AND (CV < PV) msousa@276: THEN CV := CV+1; msousa@276: END_IF ; msousa@276: Q := (CV >= PV) ; msousa@276: END_FUNCTION_BLOCK msousa@276: msousa@276: msousa@276: msousa@276: msousa@276: msousa@276: msousa@276: msousa@276: (******************) msousa@276: (* *) msousa@276: (* C T D *) msousa@276: (* *) msousa@276: (******************) etisserant@0: etisserant@0: etisserant@0: FUNCTION_BLOCK CTD etisserant@0: VAR_INPUT etisserant@0: CD : BOOL; etisserant@0: LD : BOOL; etisserant@0: PV : INT; etisserant@0: END_VAR etisserant@0: VAR_OUTPUT etisserant@0: Q : BOOL; etisserant@0: CV : INT; etisserant@0: END_VAR msousa@290: VAR msousa@290: CD_T: R_TRIG; msousa@290: END_VAR msousa@290: msousa@290: CD_T(CD); etisserant@0: IF LD THEN CV := PV ; msousa@290: ELSIF CD_T.Q AND (CV > 0) etisserant@0: THEN CV := CV-1; etisserant@0: END_IF ; etisserant@0: Q := (CV <= 0) ; etisserant@0: END_FUNCTION_BLOCK etisserant@0: etisserant@0: msousa@276: FUNCTION_BLOCK CTD_DINT msousa@276: VAR_INPUT msousa@276: CD : BOOL; msousa@276: LD : BOOL; msousa@276: PV : DINT; msousa@276: END_VAR msousa@276: VAR_OUTPUT msousa@276: Q : BOOL; msousa@276: CV : DINT; msousa@276: END_VAR msousa@290: VAR msousa@290: CD_T: R_TRIG; msousa@290: END_VAR msousa@290: msousa@290: CD_T(CD); msousa@276: IF LD THEN CV := PV ; msousa@290: ELSIF CD_T.Q AND (CV > 0) msousa@276: THEN CV := CV-1; msousa@276: END_IF ; msousa@276: Q := (CV <= 0) ; msousa@276: END_FUNCTION_BLOCK msousa@276: msousa@276: msousa@276: FUNCTION_BLOCK CTD_LINT msousa@276: VAR_INPUT msousa@276: CD : BOOL; msousa@276: LD : BOOL; msousa@276: PV : LINT; msousa@276: END_VAR msousa@276: VAR_OUTPUT msousa@276: Q : BOOL; msousa@276: CV : LINT; msousa@276: END_VAR msousa@290: VAR msousa@290: CD_T: R_TRIG; msousa@290: END_VAR msousa@290: msousa@290: CD_T(CD); msousa@276: IF LD THEN CV := PV ; msousa@290: ELSIF CD_T.Q AND (CV > 0) msousa@276: THEN CV := CV-1; msousa@276: END_IF ; msousa@276: Q := (CV <= 0) ; msousa@276: END_FUNCTION_BLOCK msousa@276: msousa@276: msousa@276: FUNCTION_BLOCK CTD_UDINT msousa@276: VAR_INPUT msousa@276: CD : BOOL; msousa@276: LD : BOOL; msousa@276: PV : UDINT; msousa@276: END_VAR msousa@276: VAR_OUTPUT msousa@276: Q : BOOL; msousa@276: CV : UDINT; msousa@276: END_VAR msousa@290: VAR msousa@290: CD_T: R_TRIG; msousa@290: END_VAR msousa@290: msousa@290: CD_T(CD); msousa@276: IF LD THEN CV := PV ; msousa@290: ELSIF CD_T.Q AND (CV > 0) msousa@276: THEN CV := CV-1; msousa@276: END_IF ; msousa@276: Q := (CV <= 0) ; msousa@276: END_FUNCTION_BLOCK msousa@276: msousa@276: msousa@276: FUNCTION_BLOCK CTD_ULINT msousa@276: VAR_INPUT msousa@276: CD : BOOL; msousa@276: LD : BOOL; msousa@276: PV : ULINT; msousa@276: END_VAR msousa@276: VAR_OUTPUT msousa@276: Q : BOOL; msousa@276: CV : ULINT; msousa@276: END_VAR msousa@290: VAR msousa@290: CD_T: R_TRIG; msousa@290: END_VAR msousa@290: msousa@290: CD_T(CD); msousa@276: IF LD THEN CV := PV ; msousa@290: ELSIF CD_T.Q AND (CV > 0) msousa@276: THEN CV := CV-1; msousa@276: END_IF ; msousa@276: Q := (CV <= 0) ; msousa@276: END_FUNCTION_BLOCK msousa@276: msousa@276: msousa@276: (********************) msousa@276: (* *) msousa@276: (* C T U D *) msousa@276: (* *) msousa@276: (********************) msousa@276: msousa@276: etisserant@0: FUNCTION_BLOCK CTUD etisserant@0: VAR_INPUT etisserant@0: CU : BOOL; etisserant@0: CD : BOOL; etisserant@0: R : BOOL; etisserant@0: LD : BOOL; etisserant@0: PV : INT; etisserant@0: END_VAR etisserant@0: VAR_OUTPUT etisserant@0: QU : BOOL; etisserant@0: QD : BOOL; etisserant@0: CV : INT; etisserant@0: END_VAR msousa@290: VAR msousa@290: CD_T: R_TRIG; msousa@290: CU_T: R_TRIG; msousa@290: END_VAR msousa@290: msousa@290: CD_T(CD); msousa@290: CU_T(CU); msousa@290: etisserant@0: IF R THEN CV := 0 ; etisserant@0: ELSIF LD THEN CV := PV ; etisserant@0: ELSE msousa@290: IF NOT (CU_T.Q AND CD_T.Q) THEN msousa@290: IF CU_T.Q AND (CV < PV) etisserant@0: THEN CV := CV+1; msousa@290: ELSIF CD_T.Q AND (CV > 0) etisserant@0: THEN CV := CV-1; etisserant@0: END_IF; etisserant@0: END_IF; etisserant@0: END_IF ; etisserant@0: QU := (CV >= PV) ; etisserant@0: QD := (CV <= 0) ; etisserant@0: END_FUNCTION_BLOCK etisserant@0: msousa@276: msousa@276: FUNCTION_BLOCK CTUD_DINT msousa@276: VAR_INPUT msousa@276: CU : BOOL; msousa@276: CD : BOOL; msousa@276: R : BOOL; msousa@276: LD : BOOL; msousa@276: PV : DINT; msousa@276: END_VAR msousa@276: VAR_OUTPUT msousa@276: QU : BOOL; msousa@276: QD : BOOL; msousa@276: CV : DINT; msousa@276: END_VAR msousa@290: VAR msousa@290: CD_T: R_TRIG; msousa@290: CU_T: R_TRIG; msousa@290: END_VAR msousa@290: msousa@290: CD_T(CD); msousa@290: CU_T(CU); msousa@290: msousa@276: IF R THEN CV := 0 ; msousa@276: ELSIF LD THEN CV := PV ; msousa@276: ELSE msousa@290: IF NOT (CU_T.Q AND CD_T.Q) THEN msousa@290: IF CU_T.Q AND (CV < PV) msousa@276: THEN CV := CV+1; msousa@290: ELSIF CD_T.Q AND (CV > 0) msousa@276: THEN CV := CV-1; msousa@276: END_IF; msousa@276: END_IF; msousa@276: END_IF ; msousa@276: QU := (CV >= PV) ; msousa@276: QD := (CV <= 0) ; msousa@276: END_FUNCTION_BLOCK msousa@276: msousa@276: msousa@276: FUNCTION_BLOCK CTUD_LINT msousa@276: VAR_INPUT msousa@276: CU : BOOL; msousa@276: CD : BOOL; msousa@276: R : BOOL; msousa@276: LD : BOOL; msousa@276: PV : LINT; msousa@276: END_VAR msousa@276: VAR_OUTPUT msousa@276: QU : BOOL; msousa@276: QD : BOOL; msousa@276: CV : LINT; msousa@276: END_VAR msousa@290: VAR msousa@290: CD_T: R_TRIG; msousa@290: CU_T: R_TRIG; msousa@290: END_VAR msousa@290: msousa@290: CD_T(CD); msousa@290: CU_T(CU); msousa@290: msousa@276: IF R THEN CV := 0 ; msousa@276: ELSIF LD THEN CV := PV ; msousa@276: ELSE msousa@290: IF NOT (CU_T.Q AND CD_T.Q) THEN msousa@290: IF CU_T.Q AND (CV < PV) msousa@276: THEN CV := CV+1; msousa@290: ELSIF CD_T.Q AND (CV > 0) msousa@276: THEN CV := CV-1; msousa@276: END_IF; msousa@276: END_IF; msousa@276: END_IF ; msousa@276: QU := (CV >= PV) ; msousa@276: QD := (CV <= 0) ; msousa@276: END_FUNCTION_BLOCK msousa@276: msousa@276: msousa@276: FUNCTION_BLOCK CTUD_UDINT msousa@276: VAR_INPUT msousa@276: CU : BOOL; msousa@276: CD : BOOL; msousa@276: R : BOOL; msousa@276: LD : BOOL; msousa@276: PV : UDINT; msousa@276: END_VAR msousa@276: VAR_OUTPUT msousa@276: QU : BOOL; msousa@276: QD : BOOL; msousa@276: CV : UDINT; msousa@276: END_VAR msousa@290: VAR msousa@290: CD_T: R_TRIG; msousa@290: CU_T: R_TRIG; msousa@290: END_VAR msousa@290: msousa@290: CD_T(CD); msousa@290: CU_T(CU); msousa@290: msousa@276: IF R THEN CV := 0 ; msousa@276: ELSIF LD THEN CV := PV ; msousa@276: ELSE msousa@290: IF NOT (CU_T.Q AND CD_T.Q) THEN msousa@290: IF CU_T.Q AND (CV < PV) msousa@276: THEN CV := CV+1; msousa@290: ELSIF CD_T.Q AND (CV > 0) msousa@276: THEN CV := CV-1; msousa@276: END_IF; msousa@276: END_IF; msousa@276: END_IF ; msousa@276: QU := (CV >= PV) ; msousa@276: QD := (CV <= 0) ; msousa@276: END_FUNCTION_BLOCK msousa@276: msousa@276: msousa@276: FUNCTION_BLOCK CTUD_ULINT msousa@276: VAR_INPUT msousa@276: CU : BOOL; msousa@276: CD : BOOL; msousa@276: R : BOOL; msousa@276: LD : BOOL; msousa@276: PV : ULINT; msousa@276: END_VAR msousa@276: VAR_OUTPUT msousa@276: QU : BOOL; msousa@276: QD : BOOL; msousa@276: CV : ULINT; msousa@276: END_VAR msousa@290: VAR msousa@290: CD_T: R_TRIG; msousa@290: CU_T: R_TRIG; msousa@290: END_VAR msousa@290: msousa@290: CD_T(CD); msousa@290: CU_T(CU); msousa@290: msousa@276: IF R THEN CV := 0 ; msousa@276: ELSIF LD THEN CV := PV ; msousa@276: ELSE msousa@290: IF NOT (CU_T.Q AND CD_T.Q) THEN msousa@290: IF CU_T.Q AND (CV < PV) msousa@276: THEN CV := CV+1; msousa@290: ELSIF CD_T.Q AND (CV > 0) msousa@276: THEN CV := CV-1; msousa@276: END_IF; msousa@276: END_IF; msousa@276: END_IF ; msousa@276: QU := (CV >= PV) ; msousa@276: QD := (CV <= 0) ; msousa@276: END_FUNCTION_BLOCK