6 Modelovanie postupnosti krokov v prostredí Stateflow

Pri riadení zariadení častokrát vykonávame určité postupnosti krokov. Pri robotovi chceme napríklad ísť chvíľku dopredu, zastaviť a následne sa otočiť do strany. V tomto návode si ukážeme, ako môžeme túto postupnosť krokov modelovať v nadstavbe MATLABu a Simulinku, ktorá sa nazýva Stateflow.

Čo budeme potrebovať?

V tomto návode využijeme poskladaného robota z predchádzajúceho návodu o ovládaní robota a na kontaktné pole doplníme o tlačidlo.

Stateflow

Ako sme už spomínali robot pri svojej činnosti vykonáva niekoľko operácií. Môže ísť dopredu, stáť alebo sa otáčať do strany. Takéto operácie môžeme nazvať aj stavy v ktorých sa robot nachádza. Z jedného stavu do druhého sa prepíname, ak nastane nejaká udalosť, alebo uplynie nejaký čas. V našej terminológii môžeme prepínanie medzi stavmi realizovať prechodmi. Modelovaním stavov a prechodov dostávame stavový automat, ktorý reprezentuje, ako sa náš robot bude správať. Stateflow je nadstavba MATLABu a Simulinku na modelovanie stavových automatov.

Tvorba stavového automatu

Otvorte Simulink, vytvorte prázdny model a nastavte pre schému Arduino MEGA 2560 ako koncové zariadenie. Do modelu pridáme nasledujúce bloky

  • Stateflow - Chart
  • Subsystém, ktorý sme vytvorili v predchádzajúcom návode na ovládanie motorov

Schéma by mala zatiaľ vyzerať nasledovne:

Stateflow má vlastný editor, do ktorého sa dostaneme dvojklikom na blok chart. Na pravej strane editora sa nachádzajú ikonky, ktoré môžeme do diagramu vkladať a reprezentujú objekty. Žltý obdĺžniček s okrúhlymi rohmi reprezentuje stav. Kliknite na ikonku a pridajte stav do schémy. Po vložení stavu sa Stateflow opýta na meno stavu, ktoré by malo byť jedinečné. Toto platí na jednu úroveň stavov, keďže stavy je možné aj vnárať. Nazvime náš stav Inicializácia. Šípka, ktorá ukazuje na stav znamená, že v tomto stave budeme začínať. Do stavu môžeme napísať príkazy a využívať vstupy a výstupy. Stavy sami o sebe môžu reagovať na udalosti. Najdôležitejšie sú:

  • entry (môžeme písať aj skratku en) - čo sa má vykonať, keď do stavu vstúpime
  • during (môžeme písať aj skratku du) - čo sa má vykonať, keď vo stave zostávame (nie je možný prechod)
  • exit (môžeme písať aj skratku ex) - čo sa má vykonať, keď zo stavu odchádzame

Do stavu zadáme príkazy na zastavenie motorov.

Pokiaľ by sme nezadali, ktorú udalosť chceme obsluhovať príkazmi, ide automaticky o udalosť vstupu. Stateflow má vlastné premenné, takže musíme označiť, ktoré sú vstupné zo Simulinku, ktoré posielame do Simulinku naspäť a ktoré sú lokálne. Premenné môžeme pridávať rýchlo pomocou editora symbolov. Prepnite sa do záložky Modeling a v časti Design Data zapnite/kliknite na Symbols Pane.

Editor symbolov nám naznačuje, že Stateflow nepozná premenné M1 a M2. Keďže pomocou týchto premenných budeme ovládať motory, ktoré máme namodelované v Simulinku. Klikneme na ikonku v stĺpčeku Type a vyberieme možnosť Output Data. Stateflow priradil premenným porty a tieto porty budú pridané aj v Simulinku bloku Chart. Do nášho stavového automatu môžeme pridať ďalšie stavy. Stav ChodDopredu nastaví rýchlosti pre motory tak, aby robot išiel dopredu, ChodNazad zmení znamienko pre motory a robot bude cúvať a pre zastavenie robota vytvoríme stav Stop. Aby sme sa vedeli medzi stavmi prepínať musíme označiť prechody medzi stavmi. Prejdite myšou na hranu stavu, kurzor sa zmení na krížik a potiahnite šípku do nasledujúceho stavu. Graf by mal vyzerať nasledovne:

Prechody symbolizujú kedy môžeme prejsť z jedného stavu do druhého. Ak by sme nad prechod nenapísali kedy sa môžeme prepnúť, prepli by sa stavy každý cyklus (periódu vzorkovania) bloku Chart. Zjednodušený zápis prechodu vyzerá

  • udalosť[podmienka]/príkaz_prechodu

Udalosť reprezentuje, že sa niečo stalo, čo spôsobí prechod z jedného stavu do druhého. Udalosti modelujeme ako zmenu signálu. Ak sa signál zmení z nulovej hodnoty na kladnú ide o nábežnú hranu (rising edge). V opačnom prípade pri zmene z kladnej hodnoty na nulu ide o dobežnú hranu (falling edge). Podmienka môže obsahovať logický výraz MATLABu, pomocou ktorej vieme tiež ovládať, či prechod nastane alebo nie. Príkaz prechodu obsahuje príkazy, ktoré sa majú vykonať ak je prechod možný. Zápis sa dá pridať kliknutím na symbol otáznika po kliknutí na prechod. Príkladom môže byť zápis

e1[x>10]/y=y+1;

Tento zápis vyjadruje, že prechod je možný ak nastane udalosť e1, premenná x je väčšia ako 10 a ak je prechod možný (nastane udalosť a je splnená podmienka) inkrementujeme premennú y o 1. Udalosti môžeme znázorniť graficky nasledujúco:

Okrem signálov môže udalosti vyvolávať dočasná logika. Najčastejšie sa využíva uplynutie času medzi stavmi. To vieme zabezpečíme nasledujúcim príkazom v prechode

  • after(n,čas), kde n je kladné číslo alebo výraz, čas je kľúčové slovo, ktoré udáva jednotky. Možnosti sú sec, msec alebo usec.

Využime dočasnú logiku a oneskorme vykonávanie pohybov o 2 sekundy.

Ako posledné nastavíme vlastnosti udalostnému modelu. Zabezpečíme nech sa inicializuje do východiskových stavov a nastavíme, aby sa vykonával každých 0.01 sekúnd. V založke Modeling v časti Setup zvoľte Chart Properties a nastavme tieto voľby

  • Update method - Discrete
  • Sample time - 0.01
  • Zaškrtnite Execute (enter) Chart At Initialization

Postupnosť krokov máme namodelovanú a môžeme sa vrátiť pomocou modrej šípky späť do Simulinku. V Simulinku pripojíme motory na výstupy bloku Chart.

Pokiaľ ste nastavili cieľové zariadenie a čas simulácie, môžete spustiť model aj z grafu Stateflow pomocou záložky Hardware. Veľkou výhodou Stateflow je, že počas behu simulácie pomocou Monitor & Tune môžete sledovať, v ktorom stave sa aktuálne nachádzate a vašu logiku tak ladiť. Aktívne stavy sú zvýraznené.

Ako posledné si môžeme vyskúšať prepínanie stavov na základe podmienky. V Stateflow pridajme premennú dát reprezentujúcu stlačenie tlačidla. Nazvime ju ako button a nastavme ju ako vstup. Prechod medzi stavmi Inicializácia a ChodDopredu vykonáme až po spustení tlačidla. Musíme v prechode upraviť zápis na podmienku.

V Simulinku pridáme do schémy blok pre čítanie digitálneho vstupu z pinu, na ktoré je pripojené tlačidlo. Periódu vzorkovania pre vstup dáme rovnakú, akú sme mali v udalostnom modeli teda 0.01 sekundy. Simuláciu môžeme znova spustiť.

Môžete si všimnúť, že udalostná logika čaká na stlačenie tlačidla, až potom sa robot začne hýbať. Po otestovaní nášho algoritmu môžeme nahrať program na Arduino pomocou tlačidla Build, Deploy & Start a vyskúšať program bez počítača. Ako ďalšie môžete naprogramovať rôzne druhy pohybu. Rozšírte logiku napríklad o zatočenie robota.

V tomto návode sme si predstavili modelovanie rozhodovacej logiky v prostredí Stateflow. Pomocou rozhodovacej logiky máte možnosť vykonávať rôzne činnosti robota. V nasledujúcom návode sa pozrieme na snímač čiary.