Calcolo di un timeout

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) Calcolo di un timeout

Questo argomento contiene 3 risposte, ha 2 partecipanti, ed è stato aggiornato da  Paolo 7 mesi, 2 settimane fa.

Stai vedendo 4 articoli - dal 1 a 4 (di 4 totali)
  • Autore
    Articoli
  • #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 vedendo 4 articoli - dal 1 a 4 (di 4 totali)

Devi essere loggato per rispondere a questa discussione.