Il flusso del programma così come l’hai descritto è perfetto, ed è legittima anche la tua perplessità. Ecco la stampa di un programma che esegue quello che ti necessita.
La differenza di tempo “SysGetSysTime(TRUE)-TimeBf” essendo tra due valori di tipo UDINT mantiene il rapporto circolare è restituisce un valore corretto anche se vi è un rollover del valore di ritorno dalla funzione SysGetSysTime(TRUE).
Attenzione il calcolo della differenza deve avvenire nell’intervallo di tempo necessario al rollover del valore, per spiegarmi esendo il tempo incrementato ad ogni uS il rollover avviene dopo 4294967295 uS pari a 4294 secondi. Se la differenza “SysGetSysTime(TRUE)-TimeBf” fosse eseguita con un valore di TimeBf salvato da più di 4294 secondi il risultato sarebbe in errore. Ecco perchè non ho scritto qualcosa del tipo:
Error:=(SysGetSysTime(TRUE)-TimeBf) > 5000000;
Perchè immaginando che l’ingresso di heartbeat non arrivi più ogni 4294 secondi avrei per 5 secondi l’uscita Error disattiva pur essendo in errore. Allego il programma sorgente.