Vai al contenuto

Calcolo di un timeout

Home Forum Programmazione IEC 61131 (LogicLab) Calcolo di un timeout

Stai visualizzando 4 post - dal 1 a 4 (di 4 totali)
  • Autore
    Post
  • #46288
    Paolo
    Partecipante

    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 riferimento

    TimeBuf:=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?

    #46294
    Paolo
    Partecipante

    Pensa 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 warning

    IF (TimeBuf-TimeTmpWarning > (DELAY_TM*1000)) THEN Warning := TRUE;

    Quando la porta è chiusa imposto: Warning := FALSE;

    #46298
    Sergio Bertana
    Amministratore del forum

    Si 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.

     

    #46299
    Paolo
    Partecipante

    Grazie mille

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