Gestire temporizzazioni in linguaggio ST

Attenzione !I messaggi sul forum potrebbero essere modificati dal nostro staff. La data e l'ora dei messaggi potrebbe non essere quella di invio ma quella di moderazione da parte dello staff. Grazie per l'attenzione.

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

Questo argomento contiene 3 risposte, ha 2 partecipanti, ed è stato aggiornato da  Sergio Bertana 8 anni, 3 mesi fa.

Stai vedendo 4 articoli - dal 1 a 4 (di 4 totali)
  • Autore
    Articoli
  • #34883

    Andrea
    Membro

    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 vedendo 4 articoli - dal 1 a 4 (di 4 totali)

Devi essere loggato per rispondere a questa discussione.