Téma: Opakovené časované spouštění funkcí
Často je potřeba spouště různé funkce, vždy co XXX sekund nebo minut nebo hodin nebo dní atd.
Příkladem může být regulace topení - každých 5 vteřin potřebujeme aktualizovat teplotu, každých 15 minut odeslat data na portál, každých 5 minut aktualizovat display, každý den zapnout čerpadlo aby se protočilo a tak dále.
Následující příklad ukazuje kostru programu, který toto řeší. Jsou zde uvedeny tři funkce, které se spouští vždy co 5, 8 a 15 sekund.
Samozřejmě pokud potřebujete dobu v hodinách a né v sekundách, pak jednoduše použijete pravidlo že 1 hodina = 3600 sekund.
Počet funkcí lze samozřejmě rozšířit i na více než tři uvedené v příkladu. Z programu je to více než zřejmé, jak to udělat.
Dejte si však pozor, aby kód vykonávaný v jednotlivých funkcích netrval příliš dlouho. Pokud to bude do jedné vteřiny, tak není problém, ale pokud by jste tam dali nějaké dlouhé čekání a podobně, tak to pak celé nebude z principu fungovat. Program musíte navrhnout tak, aby všechny funkce byly neblokující. To znamená vykonat akci a na nic nečekat.
Program využívá sys[4], což je NTP čas (proměnná která zvyšuje svou hodnotu každou sekundu). Pokud zařízení SDS nemá kontakt s NTP serverem, i přesto je tento program funkční, protože zařízení SDS automaticky zvyšuje čas každou sekundu samo.
#define F1_OPAKOVAT_SEC 5
funkce_1
{
echo('FUNKCE 1');
}
#define F2_OPAKOVAT_SEC 15
funkce_2
{
echo('FUNKCE 2');
}
#define F3_OPAKOVAT_SEC 8
funkce_3
{
echo('FUNKCE 3');
}
var next_F1, next_F2, next_F3;
main
{
// inicializace sem atd...
// zacnu
next_F1 = sys[4] + F1_OPAKOVAT_SEC;
next_F2 = sys[4] + F2_OPAKOVAT_SEC;
next_F3 = sys[4] + F3_OPAKOVAT_SEC;
main_loop:
if (sys[4] > next_F1) { next_F1 = sys[4] + F1_OPAKOVAT_SEC; funkce_1(); }
if (sys[4] > next_F2) { next_F2 = sys[4] + F2_OPAKOVAT_SEC; funkce_2(); }
if (sys[4] > next_F3) { next_F3 = sys[4] + F3_OPAKOVAT_SEC; funkce_3(); }
goto main_loop;
}