====== Pokročilé definování úloh kontroléru ======
#;;
Patron
Neuron
Gate
Unipi 1.1
Axon
#;;
Systém Mervis umožňuje definovat úlohy, které má kontrolér (RT) vykonávat. Úloha je definice podmínek pro spuštění vybraného, neboli mapovaného programu, či více různých programů ve stanoveném pořadí.
Ve **zjednodušeném módu** sestavy je vždy definována jedna úloha, která opakovaně vykonává program **main.program.fbd** a není možné toto nastavení změnit. Pokud vznikne potřeba mít [[cs:sw:01-mervis:multiple-controllers-hidden|více kontrolerů v jedné sestavě]], spouštět více různých programů, nebo spuštění některého programu podmínit, je nutné mít sestavu v **[[cs:sw:01-mervis:creating-new-project-hidden?tns#prepnuti_do_plneho_modu|plném módu]]**.
----
V tomto návodu je popsáno, jak a kde úlohy definovat, jaké existují kategorie a typy úloh, vč. toho, jak optimalizovat vykonávání programu, ošetřit a zaznamenat chybové stavy, popř. i automatickou opravu.
===== Popis vlastností úlohy =====
Dvojklikem na název regulátoru v levém panelu sestavy se zobrazí seznam definovaných úloh s jejich vlastnostmi.
{{ .:advanced-task-definition:advanced_task_definition_03_open_task_list.png?direct |}}
Seznam úloh regulátoru ve výchozím stavu (založení ve **Zjednodušeném módu**) vypadá takto:
{{ .:advanced-task-definition:advanced_task_definition_04_open_task_list.png?direct |}}
----
Úlohy mají následující vlastnosti:
|< 100% 25% 75%>|
^ Vlastnosti ^ Význam ^
| ID | Identifikační číslo úlohy |
| Kategorie | Kategorie úlohy, vizte sekci [[#kategorie_uloh|Kategorie úloh]] |
| Task | Vlastní pojmenování úlohy |
| Priorita | Priorita, s jako bude úloha vykonána, nula je nejvyšší priorita |
| Mapování programu | Přiřazení konkrétního programu do úlohy |
| Typ | Typ běhu úlohy, popsáno v sekci [[#typy_uloh|Typy úloh]] |
| Parametry | Parametry se různí podle použitého typu |
==== Kategorie úloh ====
Existují čtyři kategorie úloh, ale používají se pouze dvě:
{{ .:advanced-task-definition:advanced_task_definition_05_task_categories.png?direct |}}
----
**NormalOperationTask** - Normální operace, výchozí nastavení každé úlohy, úloha se vykonává podle zvoleného typu a definovaných parametrů.
**ExecutionError** - Úloha se spouští pouze v případě, kdy dojde ke kritické chybě úlohy NormalOperationTask (např. dělení nulou). V případě vytvoření úlohy s touto kategorií se ID úlohy automaticky změní na poslední (nejvyšší) ID. Úloha s touto kategorií může být pouze jedna.
Mervis IDE umožňuje vytvoření více úloh kategorie NormalOperationTask za předpokladu, že první bude typu Freewheeling, nebo Cyclic a další úlohy této kategorie budou pouze typu Event. Typy úloh jsou podrobně popsány [[#typy_uloh|níže]].
Pro případ, kdy má nepřetržitý běh programu vyšší prioritu, než běh bez chyb a jejich zaznamenání, je možné vypnout volbu **Stop při výjimce** ve vlastnostech regulátoru a úlohu typu ExecutionError nikdy nespustit:
{{.:advanced-task-definition:stop-on-except.png?direct|}}
==== Mapování programu ====
Dvojklikem do kolonky pod **Mapování programu** se zobrazí okno:
{{ .:advanced-task-definition:advanced_task_definition_06_program_mapping.png?direct |}}
V tomto okně se označením myší vybere požadovaný program a přidá kliknutím na tlačítko **Přidat →**.
{{ .:advanced-task-definition:advanced_task_definition_07_program_mapping_window.png?direct |}}
Pokud se v seznamu nezobrazí požadovaný program, je nutné zkompilovat sestavu!
==== Typy úloh ====
Typ úlohy určí způsob jejího vykonávání.
{{ .:advanced-task-definition:advanced_task_definition_08_task_types.png?direct |}}
|< 100% 20% 80%>|
^ Typ ^ Význam ^
| Freewheeling | Normální vykonávání, pauza mezi cykly podle ''%'' nastavení |
| Cyclic | Spuštění úlohy se provádí periodicky dle definovaného intervalu v ''ms'' |
| Event | Úloha se vykoná v případě splnění definované podmínky |
----
1. Freewheeling
Nastavení typu Freewheeling znamená, že zvolená úloha se bude vykonávat neustále dokola, podle možností kontroléru.
Parametr **Poměr doby neaktivity** udává dobu čekání na další výpočetní cyklus. Doba se udává jako podíl z doby posledního výpočetního cyklu. Příklad: bude-li jeden výpočetní cyklus trvat 10 ms a poměr doby neaktivity bude nastaven na 30 %, regulátor spustí další cyklus až po 3 ms.
----
2. Cyclic
Při nastavení typu Cyclic bude úloha prováděna každou pevně nastavenou periodu [ms].
Při delších periodách je výhodné využít syntaxe ST, například při nastavení periody 2 h a 20 min napíšeme namísto čísla 8400000 hodnotu **t#2h20m** (datový typ TIME).
----
3. Event
Nastavení typu Event nabízí podmíněné vykonání úlohy, která se může vykonávat buď jednorázově, nebo opakovaně v reakci na zvolenou proměnnou. Celkem existují 4 možnosti:
^ Podmínka spuštění ^ Význam ^
| Náběžná hrana | Jednorázové vykonání úlohy při náběžné hraně |
| Sestupná hrana | Jednorázové vykonání úlohy při sestupné hraně |
| Vysoká úroveň | Nepřetržité vykonávání úlohy při hodnotě TRUE |
| Nízká úroveň | Nepřetržité vykonávání úlohy při hodnotě FALSE |
{{ .:advanced-task-definition:advanced_task_definition_09_trigger_conditions.png?direct |}}
Po rozkliknutí parametru **proměnná** se objeví okno se seznamem proměnných, požadovanou proměnnou lze přidat výběrem a kliknutím na tlačítko **Přidat ->**.
{{ :cs:sw:01-mervis:advanced-task-definition:event-assign.png?direct |}}
Pro spuštění úlohy typu event je nutné jako spouštěcí proměnnou zvolit takovou proměnnou, která je použita v hlavním programu. Pro použití proměnné ve FBD ji stačí napojit na sebe samou:
{{ :cs:sw:01-mervis:advanced-task-definition:commerrror-fix.png?direct |}}
Stejné pravidlo platí i pro commerror a další atributy.
===== Definování úlohy =====
Po vygenerování sestavy ve **zjednodušeném módu** je pro kontrolér automaticky vytvořena úloha s namapovaným programem **main**. Při založení sestavy v **plném módu** je nutné vytvořit program a úlohu a namapovat.
Pro přidání úlohy stačí kliknout do libovolného místa v otevřeném okně pravým tlačítkem myši a vybrat možnost **Přidat task** v kontextovém menu.
{{ .:advanced-task-definition:advanced_task_definition_01_add_task.png?direct |}}
Vytvoření úlohy a jiné změny je třeba potvrdit kliknutím na **OK** v červené liště.
{{ :cs:sw:01-mervis:advanced-task-definition:changes-confirm.png?nolink |}}
**POZOR!** \\
Všechny změny úlohy je **vždy** nutné potvrdit kliknutím na **OK** v červené liště.
===== Příklad použití =====
==== Nastavení bezpečného stavu ovládaného zařízení ====
Bezpečnými hodnotami se rozumí takové, které nemohou ohrozit zdraví pracovníků a poškodit zařízení. Pokud dojde při běhu programu k výjimce (např. k dělení nulou), **NormalOperation** se zastaví a spustí se úloha **ExecutionError**.
1. Příklad bezpečného stavu zařízení "pila"
Zařízení obsluhující pilu. V situaci, kdy nastane chyba programu, úloha **NormalOperation** se zastaví, úloha **ExecutionError** se spustí a zastaví list pily a posuv. Díky tomuto ošetření chybového stavu se předejde možným zraněním pracovníků, nebo poškození pily.
2. Příklad bezpečného stavu zařízení "cementárna"
Zařízení obsluhující plnič v cementárně. V situaci, kdy nastane chyba programu, úloha **NormalOperation** se zastaví, úloha **ExecutionError** se spustí a uzavře klapky zásobníků. Díky tomuto ošetření chybového stavu se předejde zbytečným ztrátám materiálu.
**UPOZORNĚNÍ**
Je dobrým zvykem nastavit výchozí hodnoty vstupů a výstupů na bezpečné hodnoty.
Pro opětovné spuštění úlohy **NormalOperation** po ošetření chybového stavu je nutné dát do úlohy **ExecutionError** funkci **RESUMENORMALTASK**. /*FIXME - doplnit odkaz, až bude dokumentace k blokům na naší KB*/
----
Informování e-mailem, SMS, popř. optická signalizace poruchy na ULED
O chybovém stavu je vhodné informovat příslušné osoby e-mailem, či SMS a tento stav zaznamenat /*FIXME doplnit odkaz na alarmy (článek)*/ vyvoláním alarmu. Detailní popis nastavení hlášení lze nalézt v samostatných článcích věnovaných odesílání [[cs:sw:01-mervis:sending-email-hidden|e-mailů]] a [[cs:sw:01-mervis:sending-sms-lte-hidden|SMS]].
Pro názornost lze přidat optickou signalizaci např. na uživatelskou LED diodu X1, nebo sepnout výstup DO/RO s připojeným signalizačním zařízením.
==== Použití typu Event ====
1. Spuštění jednorázové akce
Při náběžné hraně DI se vyvolá jednorázová akce - ovlivnění parametru programu, odeslání hlášení, či výpočet nové hodnoty v závislosti na událost.
2. Přepínání mezi programy
Podle hodnoty DI se provádí dva různé programy (false program1 a true program2). Toto je výhodné zejména ve FBD, v ST lze stejného chování podmínkou IF.
3. Spouštění programů s danou periodou
Blok BD2 (pulzní generátor) bude generovat pulzy, které mohou spouštět další program. Výhodné je to v případech, kdy potřebujeme spouštět jiný program opakovaně, ale je nežádoucí jej spouštět každý výpočetní cyklus (pro úsporu výpočetního výkonu).