Download this file
---
FUNCTION_BLOCK I2CTemplate EXTENDS i2c VAR_INPUT lrMinDistance: LREAL; lrMaxDistance: LREAL; END_VAR VAR_OUTPUT lrDistance: LREAL; xValid: BOOL; xNewMeasurement: BOOL; END_VAR VAR timer: TON; END_VAR
xNewMeasurement := FALSE; SUPER^(); CASE _iState OF 0: IF usiAddress = 0 THEN usiAddress := 16#70; END_IF IF SUPER^.init() THEN _iState := 5; END_IF 5: Timer.pt := T#70MS; _iState := 10; xValid := FALSE; END_CASE
METHOD AfterReadInputs: INT VAR Buffer: ARRAY [..] OF ; len: DINT; END_VAR
SUPER^.AfterReadInputs(); IF _iState = 10 THEN timer(IN:=TRUE); IF timer.Q THEN len := Read(ADR(Buffer), 4); IF len = 4 THEN lrDistance := BYTE_TO_LREAL(Buffer[2])*0.01 + BYTE_TO_LREAL(Buffer[3]) * 2.56; xValid := (lrDistance >= lrMinDistance AND lrDistance <= lrMaxDistance); xNewMeasurement := TRUE; ELSE xValid := FALSE; END_IF Write8(0, 16#51); //new measurement timer(IN:=FALSE); END_IF END_IF
METHOD BeforeWriteOutputs: INT
SUPER^.BeforeWriteOutputs();