Hi,
I have just started programming in TWINCAT to get some experience in structured text. I have just finished my first function block but I have hit a problem. My timers do not count inside a function block. What am I doing wrong?
The block is manipulated via a visualization.
I have just started programming in TWINCAT to get some experience in structured text. I have just finished my first function block but I have hit a problem. My timers do not count inside a function block. What am I doing wrong?
The block is manipulated via a visualization.
Code:
PROGRAM MAIN
VAR
myValve : FB_PNUEMATICVALVE;
setOpen : BOOL;
END_VAR
myValve(bSetOpen:=setOpen);
Code:
FUNCTION_BLOCK FB_PNUEMATICVALVE
VAR_INPUT
bSetOpen : BOOL := FALSE;
END_VAR
VAR_OUTPUT
uiWarning : UINT := 0; //b1: valve sensor error
bIsOpen : BOOL := FALSE;
END_VAR
VAR
fbTimerValve : TON;
fbTimerFeedBack : TON;
usiState : USINT := 0;
usiLoopAttempts : USINT := 0;
bSensorOpen : BOOL := FALSE;
bSensorClosed : BOOL := TRUE;
bValve : BOOL := FALSE;
bFeedBack : BOOL := FALSE;
END_VAR
CASE usiState OF
0: // STATIC
IF bSetOpen <> bIsOpen THEN
fbTimerValve(IN:=TRUE, PT:=T#100S);
//fbTimerFeedBack(IN:=TRUE, PT:=T#50S);
usiState := 10;
bValve := bSetOpen;
END_IF
10: // MOVING
IF fbTimerValve.Q THEN
fbTimerValve(IN:=FALSE);
IF bSensorOpen OR bSensorClosed THEN
uiWarning := uiWarning OR E_BIT_MASKS.b1;
ELSE
uiWarning := uiWarning OR E_BIT_MASKS.b2;
END_IF
usiState := 20;
RETURN;
END_IF
IF fbTimerFeedBack.Q THEN
fbTimerFeedBack(IN:=FALSE);
uiWarning := uiWarning OR E_BIT_MASKS.b5;
usiState := 30;
RETURN;
END_IF;
IF (bSensorClosed AND NOT bSetOpen) OR (bSensorOpen AND bSetOpen) THEN
fbTimerValve(IN:=FALSE);
fbTimerFeedBack(IN:=FALSE);
usiState := 0;
bIsOpen := bValve;
END_IF
IF bFeedBack = bValve THEN
fbTimerFeedBack(IN:=FALSE);
END_IF
20: //ERROR, try looping
30: //Crititcal ERROR, do nothing
END_CASE