ZPŘS - Zadání projektu 2017/2018 Vyberte si jedno z těchto zadání a to vypracujte: (15b) 1) Myčka - vytvořte stavový automat pro myčku. Uživatel si může zvolit z několika programů (Oplach, Mytí ECO, Mytí 65 C, Mytí 70 C). Vytvořte sekvenci mytí nádobí. (Předmytí, mytí, druhé mytí, sušení,...) 2) Nápojový automat - vytvořte stavový automat pro nápojový automat. Uživatel si může zvolit několik druhů nápojů, včetně cukru či vody navíc. Řešte vhazování mincí a návrat drobných. Dále řešte sekvenci míchání či vaření nápoje. Řešte situaci, kdy nejsou dostupné suroviny. 3) Pračka - vytvořte stavový automat pro pračku. Uživatel si může zvolit několik programů (Bavlna, Silon,...) dále teplotu ( 30 C, 40 C, 60 C, 90 C). Uživatel může zvolit programy navíc (předepírka, ždímání, stop ve vodě,...). Vytvořte posloupnost praní prádla (předepírka, hlavní praní, ždímání). Součástí hlavní posloupnosti vytvořte i ovládání motoru. Při praní točte střídavě na jednu a druhou stranu. Dále mějte mezi otáčením pauzu. Poznámky pro vypracování: Pro stavový automat si vytvořte enumerátor Uživatelské zásahy budou realizovány pomocí funkce scanf() Stavový automat bude průchozí. Program bude běžet v hlavní smyčce. Na konci hlavní smyčky bude čekání pomocí funkce Sleep(). Čekání pomocí scanf() se toleruje. Jednotlivé stavy hlaste pomocí funkce printf(). Stavový automat musí mít minimálně 5 stavů a větvení (rozhodování). Nejprve navrhněte stavový automat a až poté dle něho pište kód. Kód pište sami, budete ho obhajovat a musíte rozumnět každému procesu, souvislostem a každé řádce kódu. Odevzdejte komentovaný kód v jazyce C a nákres stavového automatu. Proveďte ukázku Vašeho kódu vyučujícímu a vysvětlete, jak program pracuje. Odpověžte na otázky, které Vám vyučující položí. - 1 -
Ukázka projektu Zde je uveden ukázkový projekt. Stavový automat reprezentuje ovládání závory. V programu si můžeme zvolit dva časy (dlouhý a krátký) otevření závory a také časové neomezené otevření. INIT Ready CYCLE ENTERED HOLD ACTIVATED GATE CLOSED TIME EXPIRED Opening Hold Closing HOLD DEACTIVATED Obr. 1: Stavový automat // I n c l u d e s #i n c l u d e <s t d i o. h> #i n c l u d e <s t d l i b. h> #i n c l u d e <windows. h> // Defines #d e f i n e SHORT_TIME 30 #d e f i n e LONG_TIME 60 #d e f i n e CLOSING_CONST 10 // Types typedef enum STATE_READY, STATE_OPENING, STATE_CLOSING, STATE_HOLD STATES; // Global v a r i a b l e s STATES actual_state ; - 2 -
i n t time = 0 ; // Function prototypes i n t ready_state ( void ) ; void opening_state ( i n t open_time ) ; void c l o s i n g _ s t a t e ( void ) ; void hold_state ( void ) ; // Main entry point i n t main ( void ) i n t selected_time = 0 ; actual_state = STATE_READY; while ( 1 ) // system (" c l s " ) ; /////////////////////////// // Main loop /////////////////////////// switch ( actual_state ) case STATE_READY: selected_time = ready_state ( ) ; case STATE_OPENING: opening_state ( selected_time ) ; case STATE_CLOSING: c l o s i n g _ s t a t e ( ) ; case STATE_HOLD: hold_state ( ) ; d e f a u l t : ///////////////////////// // End o f main loop ///////////////////////// Sleep ( 1 0 0 ) ; - 3 -
i n t ready_state ( void ) char input = 0 ; p r i n t f ("GATE READY\n " ) ; p r i n t f (" I n s e r t \" s \" f o r s h o r t cycle, " ) ; p r i n t f ("\" l \" f o r long c y c l e " ) ; p r i n t f (" or \"h\" f o r hold : " ) ; f s e e k ( stdin, 0, SEEK_END) ; s c a n f ("%c",& input ) ; i f ( input == s ) actual_state = STATE_OPENING; p r i n t f (" Short time s e l e c t e d. \ n " ) ; return SHORT_TIME; e l s e i f ( input == l ) actual_state = STATE_OPENING; p r i n t f (" Long time s e l e c t e d. \ n " ) ; return LONG_TIME; e l s e i f ( input == h ) actual_state = STATE_HOLD; p r i n t f (" Hold mode s e l e c t e d. \ n " ) ; e l s e p r i n t f ("Wrong input c h a r a c t e r! \ n " ) ; void opening_state ( i n t open_time ) i f ( time == 0) p r i n t f ("GATE OPEN " ) ; time++; p r i n t f ( ". " ) ; i f ( time == open_time ) time = 0 ; - 4 -
actual_state = STATE_CLOSING; p r i n t f ("\n " ) ; void c l o s i n g _ s t a t e ( void ) i f ( time == 0) p r i n t f ("GATE CLOSING " ) ; time++; p r i n t f ( ". " ) ; i f ( time == CLOSING_CONST) time = 0 ; actual_state = STATE_READY; p r i n t f ("\n " ) ; void hold_state ( void ) char input = 0 ; p r i n t f ("GATE OPEN in hold mode\n " ) ; p r i n t f (" I n s e r t \" c \" f o r c l o s e the gate : " ) ; f s e e k ( stdin, 0, SEEK_END) ; s c a n f ("%c ", &input ) ; i f ( input == c ) actual_state = STATE_CLOSING; e l s e p r i n t f ("Wrong i n s t r u c t i o n! \ n " ) ; - 5 -