Vai al contenuto

Gestire temporizzazioni in linguaggio ST

Home Forum Programmazione IEC 61131 (LogicLab) Gestire temporizzazioni in linguaggio ST

Stai visualizzando 4 post - dal 1 a 4 (di 4 totali)
  • Autore
    Post
  • #34883
    Anonimo
    Inattivo

    Devo gestire una temporizzazione in linguaggio ST. Precedentemente utilizzavo i vostri prodotti Picolog e programmavo in linguaggio “C”.

    Nelle vostre librerie era disponibile la funzione IsMsecTimeOver() che rendeva l’esecuzione delle temporizzazioni estremamente semplice. Esiste qualcosa di simile su SlimLine ?

    #36500
    Sergio Bertana
    Amministratore del forum

    La funzione IsMsecTimeOver() si basa sul controllo del tick di sistema che nei sistemi Picolog si incrementa automaticamente ogni 1 mS.

    Nei sistemi SlimLine è possibile da linguaggio ST testare la variabile di sistema SysTime di tipo UDINT che si incrementa ad ogni mS raggiunto il valore massimo si reinizializza. In pratica per eseguire la temporizzazione similarmente a quanto facevi in “C” sui sistemi Picolog puoi fare qualcosa simile al programma sottoriportato che esegue l’inversione della uscita Do00M00 ogni secondo. La variabile RefTimeBuf deve essere dichiarata di tipo UDINT.

    (* Init the reference time at first program loop. *)

    IF SysFirstLoop THEN
        RefTimeBuf:=SysTime; (* Save the reference time *)
    END_IF;

    (* Check if 1 Sec is passed and invert the logic DoOOM00 state. *)

    IF (SysTime > (RefTimeBuf+1000)) THEN
        RefTimeBuf:=SysTime; (* Save the reference time *)
        Do00M00:=NOT(Do00M00);
    END_IF;

    #36501
    Sergio Bertana
    Amministratore del forum

    Esiste anche la funzione SysGetSysTime() che permette la lettura di un tick di sistema che si incrementa ogni uS, in questo caso il programma precedente può essere modificato nel modo.

    (* Init the reference time at first program loop. *)

    IF SysFirstLoop THEN
        RefTimeBuf:=SysGetSysTime(TRUE); (* Save the reference time *)
    END_IF;

    (* Check if 1 Sec is passed and invert the logic DoOOM00 state. *)

    IF (SysGetSysTime(TRUE) > (RefTimeBuf+1000000)) THEN
        RefTimeBuf:=SysGetSysTime(FALSE); (* Save the reference time *)
        Do00M00:=NOT(Do00M00);
    END_IF;

    Da notare la chiamata a SysGetSysTime() con la flag FALSE per avere lo stesso tempo utilizzato nel confronto e non perdere i uS di tempo necessari alla esecuzione delle istruzioni di confronto.

    #36502
    Sergio Bertana
    Amministratore del forum

    Esistono comunque anche i blocchi funzione eTOF, Timer Off ed eTON, Timer On che possono essere utilizzati in tutti e 5 i linguaggi della IEC61131. Entrambi i blocchi funzione eseguono temporizzazioni con tempo definibile in mS.

Stai visualizzando 4 post - dal 1 a 4 (di 4 totali)
  • Devi essere connesso per rispondere a questo topic.