====== 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).