Jump to content
PLC Forum


Sign in to follow this  
Paperin0

Prime prove con Codesys ^ST^ ~ .~

Recommended Posts

Paperin0

Salve a tutti.
Premetto che sono alle prime armi con il linguaggio st e mi sto trovando in difficolta con un esercizio di cui non riesco a trovare la soluzione, ne ragionandoci ne in rete.

Praticamente ho bisogno di gestire un'unità di traffico fittizia, ovvero.. ho un semaforo e dopo aver ricevuto uno START devo far alternare le fasi...verde ^10 sec^... giallo ^10 sec^... rosso ^10 sec^ per poi tornare al verde e via dicendo in loop con uno STOP per far fermare il tutto.

Alcuni dei problemi riscontrati sono:
-non riesco a far partire e a resettare il timer 
-non riesco a farlo mettere in loop 
-non riesco a inserire una fase ^giallo^

Grazie a tutti per la lettura, spero che tra voi ci sia qualcuno che sappia aiutarmi.

 

FUNCTION_BLOCK POU
VAR_INPUT
    Start : BOOL;            //Avvio
    Stop : BOOL;            //Fermata
END_VAR
VAR_OUTPUT
    uscita : BOOL;
    StatoAttuale : INT;        //Stato attuale
    StatoSuccessivo : INT;     //Stato successivo
    
    Tempo: TON;        //timer
    TempoTrascorso: TIME;     //tempo trascorso
    Variabile : BOOL;    
    Verde : BOOL;             //Verde 
    Giallo : BOOL;            //Giallo
    Rosso : BOOL;             //Rosso
END_VAR
VAR
END_VAR

////////////////////////////////////////////////////

IF Start <> 0  THEN
    StatoAttuale := 1;
    Stop := FALSE;
        ELSE
            Stop:=TRUE;
            StatoAttuale :=0;                        
END_IF

CASE StatoAttuale OF
    1:         //IF NOT (Tempo.Q) THEN 
            IF StatoAttuale =1 THEN
                Verde := TRUE;
                Rosso := FALSE;
                Tempo.IN := TRUE ;             // timer input
                Tempo.PT := T#10S;                 // timer periodo 
                TempoTrascorso := Tempo.ET;        // tempo trascorso
                uscita := Tempo.Q;        
            END_IF 
                    IF (Tempo.Q)THEN
                        StatoAttuale :=2;
                        tempo.IN:= FALSE;                            
                    END_IF
                
    2:         IF StatoAttuale =2 THEN
                Verde := FALSE;
                Rosso := TRUE;
                Tempo.IN := TRUE ;             // timer input
                Tempo.PT := T#10S;                 // timer periodo 
                TempoTrascorso := Tempo.ET;        // tempo trascorso
                uscita := Tempo.Q;
            END_IF    
                    IF (Tempo.Q)THEN
                            StatoAttuale :=1;
                            tempo.IN:= FALSE;
                    END_IF
END_CASE

 

Share this post


Link to post
Share on other sites

Water

.. beh di primo acchito ... non hai istanziato il timer!

MioTimer ( Enable := ??, TIMELOW := ??, TIMEHIGH := ??)    ;

ciao

Share this post


Link to post
Share on other sites
Water

.scusa ti ho fatto l'esempio di un blinker, per il TON TOF è questo:

MioTON    (IN := "abilita_timer", PT:= "Tempo_timer")    ;

 

dopodiche puoi usare MioTON.Q e MioTON.PT per il tempo trascorso,

sulla logica di funzionamento non ti posso aiutare però prova ad usare un contatore da incrementare con i timers,

usando poi il valore nel Case ... ma non prenderla per buona

ciao

Share this post


Link to post
Share on other sites
Paperin0

Ormai avevo risolto in :D. Comunque sia grazie mille per la risposta 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...