Home › Forum › Programmazione IEC 61131 (LogicLab) › Calcolo di un timeout
- Questo topic ha 3 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 5 anni, 3 mesi fa da Paolo.
-
AutorePost
-
Gennaio 9, 2019 alle 1:27 pm #46288PaoloPartecipante
Avrei bisogno di un chiarimento in merito al calcolo di un timeout. Ho bisogno di segnalare lo stato di apertura di una porta se questa rimane aperta per un tempo troppo lungo (tempo di timeout).
Quando la porta viene aperta mi salvo il tempo di riferimento, quindi controllo che rispetto al tempo corrente, non sia stato superato il tempo di timeout.Una volta passato questo tempo imposto a true un flag relativo allo stato allarmato della porta. Il flag viene impostato a false solo quando la porta viene richiusa. lo schema è questo:
UDINT TimeBuf; //ora corrente
UDINT TimeTmpWarning;//tempo di riferimentoTimeBuf:=SysGetSysTime(TRUE);
se porta chiusa : //il tempo di riferimento viene aggiornato
TimeTmpWarning := TimeBuf;se porta aperta : //il tempo di riferimento NON viene più aggiornato
quindi controllo così se la porta è aperta per un periodo troppo lungo:
IF (TimeBuf-TimeTmpWarning > (DELAY_TM*1000)) THEN
Warning := TRUE;
ELSE
Warning := FALSE;
END_IF;Ma cosa succede se la porta rimane aperta troppo a lungo? che TimeBuf va in overflow e riparte da 0. Quindi il tempo di riferimento, anche se la porta è rimasta aperta, risulta == al tempo corrente o minore del tempo di troppo aperto. Warning durante questo periodo torna ad essere falso per il tempo necessario a farlo riscattare.
Qualche suggerimento?
Gennaio 9, 2019 alle 1:31 pm #46294PaoloPartecipantePensa e ripensa avrei modificato il codice in questo modo:
Se porta chiusa : //il tempo di riferimento viene aggiornato
TimeTmpWarning := TimeBuf;Se porta aperta : //il tempo di riferimento NON viene più aggiornato quindi
Se viene superato il tempo di delay viene impostata la segnalazione di warningIF (TimeBuf-TimeTmpWarning > (DELAY_TM*1000)) THEN Warning := TRUE;
Quando la porta è chiusa imposto: Warning := FALSE;
Gennaio 9, 2019 alle 3:19 pm #46298Sergio BertanaAmministratore del forumSi in effetti basta fare come hai detto. Ma perchè appoggi il valore in TimeTmpWarning, tutto il tuo programma si sviluppa in due righe (Ho ipotizzato un ritardo di 10 Secondi).
IF (DoorClosed) THEN Warning:=FALSE; TimeBf:=SysGetSysTime(TRUE); END_IF;
IF ((SysGetSysTime(TRUE)-TimeBf) > 10000000) THEN Warning:=TRUE; END_IF;DoorClosed è l’ingresso di porta chiusa (Attivo se chiusa) e Warning è l’uscita di allarme. Ecco il programma in simulazione su PC con SimuLink (Screenshot), download programma DoorAlarm.
Gennaio 10, 2019 alle 7:06 am #46299PaoloPartecipanteGrazie mille
-
AutorePost
- Devi essere connesso per rispondere a questo topic.