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?