Home › Forum › Programmazione IEC 61131 (LogicLab) › Gestire temporizzazioni in linguaggio ST
- Questo topic ha 3 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 13 anni, 8 mesi fa da Sergio Bertana.
-
AutorePost
-
Luglio 27, 2010 alle 3:04 pm #34883AnonimoInattivo
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 ?
Luglio 27, 2010 alle 3:07 pm #36500Sergio BertanaAmministratore del forumLa 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;Luglio 27, 2010 alle 3:23 pm #36501Sergio BertanaAmministratore del forumEsiste 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.
Luglio 27, 2010 alle 3:52 pm #36502Sergio BertanaAmministratore del forumEsistono 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.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.