PLC ST Basic 5, 6, 7

EP5 Timer & Trigger

---------------------------------
PROGRAM MAIN
VAR

    bPizzaInOven : BOOL;
    bBuzzer : BOOL;
    iTotalPiazzaCooker : UDINT;

    fbTimer : TON;
    fbTrigger_RTRIG : R_TRIG;

END_VAR
---------------------------------

fbTimer(IN:=bPizzaInOven, PT:=T#3S);

bBuzzer := fbTimer.Q;

fbTrigger_RTRIG(clk:=fbTimer.Q);

IF fbTrigger_RTRIG.Q THEN
    iTotalPiazzaCooker := iTotalPiazzaCooker + 1;
END_IF

---------------------------------

EP6 Visualization

Add visualization

Solution Explorer -> VISUs -> add / visulaization -> input name & open

Open toolbox

View -> toolbox

Add "insert piazza" button

toolbox/add button -> Inputconfiguration -> onMouseClick -> Execute ST-code -> click ">"

MAIN.bPizzaInOven := TRUE;

Control piazza display

State variable -> Invisible -> NOT MAIN.bPizzaInOven

Elapsed Time display

rectangle -> text = "Elapsed time: %s" -> text variables -> MAIN.fbTimer.ET

Add buzzer display

ellipse -> change color in Normal & Alarm state -> color varibales / toggle color -> MAIN.bBuzzer

EP7 state machine

CASE iState OF

    0:  // Wait for pizza in oven.

        sStateDesc := 'Waiting on Pizza Now.';
        IF stPizzaInOven.bExist THEN
            stPizzaInOven.dtTimeEnteredOven := dtCurrentTime;
            iState := 10;
        END_IF

    10: // We just got a pizza! Cook it.

        sStateDesc := 'Baking That Pizza Now.';
        fbMyTimer(IN:=TRUE,PT:=T#3S);
        IF fbMyTimer.Q THEN
            fbMyTimer(IN:=FALSE); // reset timer
            iState := 20;    
        END_IF


    20: // Can we move the pizza out of the oven?  Its going to burn.

        sStateDesc := 'PIZZA BURNING!!!!.';
        IF NOT stPizzaDone.bExist THEN
            stPizzaInOven.dtTimeExitedOven := dtCurrentTime;
            stPizzaDone := stPizzaInOven;
            stPizzaInOven := stNULL_PIZZA;
            bBuzzer := FALSE;

            iState := 30;

        ELSE

            bBuzzer := TRUE;

        END_IF

    30:  // Pizza just removed. on output tray.

        stPizzaDone.tTimeInOven := stPizzaDone.dtTimeExitedOven - stPizzaDone.dtTimeEnteredOven; 
        iTotalPizzasCooked := iTotalPizzasCooked + 1;
        iState := 0;

ELSE

    sStateDesc := 'Invalid state!';

END_CASE

Last updated

Was this helpful?