Zadání
Zařízení vyžaduje pravidelnou údržbu vždy po 1200 hodinách provozu, a tedy je třeba počítat, kdy stroj opravdu pracuje a kdy nikoliv. Pokud se blíží potřeba servisního intervalu je nutné informovat obsluhu a současně včas stroj zastavit. Pochopitelně s možností „odblokování“. Zařízení budou potřeba v řádu jednotek, maximálně desítek kusů a zákaznický vývoj by byl příliš drahý.
Řešení
Prvotním nápadem bylo použití klasické počítadlo provozní doby a jím vyřešit nejpalčivější problém, tedy zajištění pravidelné údržby. S ohledem na další požadavky bylo však použito iDo. Které rovněž může poskytnout možnost zablokování stroje.
Díky tomu, že program iDo probíhá v jednoduché smyčce, je počítadlo provozní doby je velmi jednoduchá aplikace a záleží jen na tom, jak složitě či komfortně ji chceme realizovat. Pustíme-li tak smyčku například každou sekundu, pak máme zdroj hodinového signálu a zbývá jen jednoduchá inkrementace proměnné při každém průběhu smyčky.
prog ( count1 = count1 + in.1 )
Je-li vstup 1 aktivní (sepnutý), přičteme k proměnné count1 jedničku, jinak ponecháme na původní hodnotě. Pokud stačí pouze informace ve vteřinách a ta bude dále zpracovávána strojově například přes XML, je hotovo. Vykonání příkazu pochopitelně zabere nějaký čas a ten nám může trochu narušit časové informace (vykonání tohoto jediného řádku zabere asi 2ms a tak chyba činí cca 1s za 8,33minut), ale není nic snazšího, žen zkrácením intervalu spouštění smyčky čas korigovat. O kolik, to už nám řekne sám debugger.
V našem případě bychom za toto řešení moc pochváleni nebyli, takže k prostému přičítání vteřin ještě přidáme převod na minuty a hodiny.
prog ( count1 = count1 + in.1, minutes1=iif(count1==60,minutes1+1,minutes1), usr.hour1=iif(count1==60,usr.hour1+1,usr.hour1), count1=iif(count1==60,0,count1), minutes1=iif(minutes1==60,0,minutes1) )
První tři řádky jsou identické, resp. ekvivalentní s prvním příkladem. Jen se počítají nejen vteřiny, ale proběhne-li jich 60, přičte se minuta a je-li i těchto 60, přičte se hodina. V tuto chvíli je ale třeba také jednotlivé čítače po dosažení 60 vynulovat a o to se postarají poslední dva řádky.
Bystřejší si jistě povšimli že proměnná usr.hour1 nemá jméno identické s Count1 či minutes1, ale je uvozena flagem usr. Tím je dosaženo automatického ukládání při změně hodnot. Vzhledem k tomu, že EEPROM má životní cyklus omezen na 100 000 zápisů, ukládáme hodnotu jen po hodinách. Podle aplikace by samozřejmě bylo rovněž možné ukládat pouze při ukončení cyklu měření (rozepnutí vstupu). To už ale záleží na té které aplikaci, jak často může vypadnout .
Nyní již jen stačí přidat blokování stroje a informování obsluhy. Druhý úkon je jednodušší, čili začneme s ním :
prog ( count1 = count1 + in.1, minutes1=iif(count1==60,minutes1+1,minutes1), usr.hour1=iif(count1==60,usr.hour1+1,usr.hour1), count1=iif(count1==60,0,count1), minutes1=iif(minutes1==60,0,minutes1), out.2 = usr.hour1 <= 1150 )
Je-li proměnná usr.hour1 větší nebo rovna 1200hodinám, sepneme relé.
Blokování stroje a jeho odblokování již bude trochu složitější, protože bude třeba zastavit čítání času bez ohledu na stav vstupu :
prog ( usr.stop= usr.hour1<=1200, usr.odblok= iif(dip.1,1,0), out.1=iif(usr.stop&&usr.odblok,1,0), count1 = count1 + in.1, minutes1=iif(count1==60,minutes1+1,minutes1), usr.hour1=iif(count1==60,usr.hour1+1,usr.hour1), count1=iif(count1==60,0,count1), minutes1=iif(minutes1==60,0,minutes1), out.2 = usr.hour1 <= 1150 )
Samozřejmě by bylo možné rozšíření o řadu dalších funkcí, například zablokování stroje v případě, že do místnosti vstoupí nějaká osoba (abychom zamezili úrazu) či kontrolu dalších provozních parametrů jako je teplota nebo osvětlení. To vše jsou ale již věci závisející výhradně na uživateli.
Chyba se dá obejít explicitní deklarací proměnné pomocí usr.xxxx := 0, někde na začátku programu. pokud si ale jen hrajeme, kdo by se tím zabýval :)