Ülesanne: Testimismoodul 1
Ülesande püstitus
On vaja koostada programm modulaarse töötusliini moodulile, mis tegeleb toorikute analüüsimisega.
- Seadme käivitamisel on kõik täiturid mitteaktiivsed, põleb RESET tuli.
 - RESET nuppu vajutades läheb moodul algolekusse, RESET tuli vilgub kuni algolek on saavutatud.
 - Kui algolek on saavutatud kustub RESET tuli ja süttib START tuli.
 - Kui START nuppu vajutada peab moodul olema valmis toorikuid vastu võtma ning peab sellest teavitama eelnevat moodulit. START tuli peab vilkuma, RESET tuli peab kustunud olema.
 - Kui toorik asetatakse võtmiskohta ja eelmise mooduli haarats on eest ära liikunud, siis viiakse toorik üles, tuleb eelmisele moodulile hõivatusest teada anda.
 - Kui toorik on madal ja võti on AUTO asendis, siis viiakse toorik alumise kaldtee peale.
 - Kui toorik on kõrge või võti on MAN asendis, siis viiakse toorik ülemise õhktee kaudu järgmisesse moodulisse kui järgmine moodul on valmis toorikuid vastu võtma.
 - Kui edastatav toorik on punane või hõbedane, siis õhkteel liikumise ajal põleb paneeli indikaator Q1.
 - Kui edastatav toorik on must, siis õhkteel edastamisel ajal põleb indikaator Q2.
 - Kui toorik on edastatud üks kõik kummale kaldteele, siis jääb moodul ootama uut toorikut.
 - Kui alumine kaldtee saab täis, siis hakkavad vilkuma indikaatorid Q1 ja Q2 ning jaama töö seiskub kuni uue käivitustsüklini.
 - STOP nupu vajutamine katkestab mooduli töö mistahes ajal koheselt ja kõik täiturid naasevad mitteaktiivsesse seisu.
 
Programm
Sümbolite nimekiri
| Nimi | Andmetüüp | Aadress | Kommentaar | |
|---|---|---|---|---|
| part_av | BOOL | %I0.0 | Toorik saadaval | |
| not_black | BOOL | %I0.1 | Toorik ei ole must (opt andur) | |
| light_barrier | 
                            BOOL | %I0.2 | Infrapuna valgusbarjäär | |
| comp_height_correct | BOOL | %I0.3 | analoogkomparaator: kõrgus OK (ei kasutata selles ÜL) | |
| lift_iup | BOOL | %I0.4 | Tõstja on üleval | |
| lift_idown | BOOL | %I0.5 | Tõstja on all | |
| ej_retd | BOOL | %I0.6 | Väljalükkaja sees | |
| dow_free | BOOL | %I0.7 | Järgmine moodul on vaba | |
| start_btn | BOOL | %I2.0 | Startnupp paneelil | |
| stop_btn | BOOL | %I2.1 | Stoppnupp paneelil (inverteeritud) | |
| key_man | BOOL | %I2.2 | Võtme asend: MAN | |
| reset_btn | BOOL | %I2.3 | Reset nupp paneelil | |
| Height | UInt | %IW64 | Kõrgusandur (analoog) | |
| lift_down | BOOL | %Q0.0 | Tõstja alla | |
| lift_up | BOOL | %Q0.1 | Tõstja üles | |
| ej_ext | BOOL | %Q0.2 | Väljalükkaja välja | |
| slide | BOOL | %Q0.3 | Õhktee sisse | |
| st_occupied | BOOL | %Q0.7 | Moodul hõivatud | |
| startled | BOOL | %Q2.0 | Start tuli | |
| resetled | BOOL | %Q2.1 | Reset tuli | |
| Q1 | BOOL | %Q2.2 | Indikaator Q1 | |
| Q2 | BOOL | %Q2.3 | Indikaator Q2 | |
| QW0 | Word | %QW0 | Mooduli väljundid | |
| QB2 | Byte | %QB2 | Paneeli väljundid | |
| STEP | USInt | %MB5 | Peaprogrammi sammuloend | |
| WorkSTEP | USInt | %MB2 | Tööprogrammi sammuloend | |
| wp_mv_down | BOOL | %M4.0 | Toorik läheb alumise tee peale | |
| WP_count | USInt | %MB6 | Toorikute arv alumisel kaldteel | |
| blink_startled | BOOL | %M4.1 | vilguta start tuld | |
| blink_resetled | BOOL | %M4.2 | vilguta reset tuld | |
| blink_q1 | BOOL | %M4.3 | vilguta q1 | |
| blink_q2 | BOOL | %M4.4 | vilguta q2 | |
| blink | BOOL | %M4.5 | bitt, mida taimer "vilgutab" | 
Programm: Main [OB1]
                        CASE "STEP" OF
                        
                          0:// algväärtuste määramine
                            "QW0":=0; // Lülitame kõik tööväljundid välja
                            "QB2":=0; // Lülitame kõik paneeliväljundid välja
                            "st_occupied":=1; // märgime jaama hõivatuks
                            "resetled":=1; // Lülitame RESET nupu tule sisse
                            "WorkSTEP":=0;
                            "blink_resetled":=0;
                            "blink_startled":=0;
                            "blink_q1":=0;
                            "blink_q2":=0;
                            "WP_count":=0;
                            
                            IF "reset_btn" THEN
                              "blink_resetled":=1;
                              "INC"("STEP");
                            END_IF;
                        
                          1..3: // Kutsume välja funktsiooni, mis peab viima stendi algseisu, 
                          // kui algseis on saavutatud, siis
                          // lõpetame reset LED-i vilgutamise, kustutame reset led-i
                            IF "reset"() THEN
                              "blink_resetled":=0;
                              "resetled":=0;
                              "INC"("STEP");
                            END_IF;
                        
                            IF NOT "stop_btn" THEN "STEP":=0; END_IF;
                        
                          4: // Süütame start led-i ja kui start nupp on vajutatud, 
                          // siis paneme selle vilkuma ning jätkame
                            "startled":=1;
                            IF "start_btn" THEN
                              "blink_startled":=1;
                              "INC"("STEP");
                            END_IF;
                            IF NOT "stop_btn" THEN "STEP":=0; END_IF;
                        
                          5:  // Kuni me siin oleme, siis kutsume alati välja "Process" funktsiooni,
                          //  mis peaksmeie stendi põhitegevust juhtima. Selle sisendisse anname sammu 
                          // numbri, kust see jätkama peaks. Kui keegi stop nuppu vajutab, 
                          // siis hüppame algusesse.
                            "Process"("WorkSTEP");
                            IF NOT "stop_btn" THEN "STEP":=0; END_IF;
                        ELSE
                          "STEP":=0;
                        END_CASE;
                        
                        // Tulede vilgutamine
                        IF "blink_timer".Q THEN "blink":= NOT "blink"; END_IF;
                        IF "blink_startled" THEN "startled":= "blink"; END_IF;
                        IF "blink_resetled" THEN "resetled":= "blink"; END_IF;
                        IF "blink_q1" THEN "Q1":= "blink"; END_IF;
                        IF "blink_q2" THEN "Q2":= "blink"; END_IF;
                        
                        // Tulede vilgutamise taimer
                        "blink_timer".TON(IN:=NOT "blink_timer".Q,PT:=T#0.4s);
                    
                    
                    Funktsioon: reset [FC2]
| Nimi | Andmetüüp | Kommentaar | |
|---|---|---|---|
| ▼Return | |||
| ■ Ret_Val | Bool | 
                        "lift_up":=0; // tühistame käsu tõstjal üles liikuda
                        "lift_down":=1; // anname käsu tõstjal alla liikuda
                        #reset:=0;
                        
                        // Kontrollime, kas oleme algpositsiooni saavutanud
                        IF "lift_idown" AND "ej_retd"  THEN
                          #reset:=1; // kui oleme, anname teada, et võime edasi minna
                        END_IF;
                    
                    
                    Funktsioon: process [FC3]
| Nimi | Andmetüüp | Kommentaar | |
|---|---|---|---|
| ▼InOut | |||
| ■ STEP | USInt | ||
| ▼Return | |||
| ■ Ret_Val | Void | 
                        // SAMMUD ALGAVAD
                        CASE #STEP OF
                        
                          0: // Kui toorik on olemas ja kui haarats on valgusbariääri ees ning kui
                            // tõstemoodul on all
                            IF "part_av" AND "ej_retd" AND "light_barrier" AND "lift_down" THEN
                              "st_occupied":=1; // Märgime mooduli hõivatuks
                              "INC"(#STEP);       // Läheme järgmise sammu juurde
                            ELSE
                              "st_occupied":=0; // Kui toorik puudub märgime mooduli vabaks
                            END_IF;
                        
                          1: // Kui haarats on bariääri eest ära liikunud ja toorik on endiselt olemas...
                            IF NOT "light_barrier" AND "part_av" AND "not_black" THEN
                              "Q1":=1;
                              "INC"(#STEP);     // ja läheme edasi järgmise sammu juurde
                            ELSIF NOT "light_barrier" AND "part_av" AND NOT "not_black" THEN
                              "Q2":=1;
                              "INC"(#STEP);     // ja läheme edasi järgmise sammu juurde
                            ELSIF NOT "light_barrier" AND  NOT "part_av" THEN   // Kui toorikut pole...
                              #STEP:=0;         // ..peame seda veaks ja läheme algusesse
                            END_IF;
                        
                          2: // Viide enne üles tõusmist, et haarats saaks eest ära liikuda
                            "Delay_timer1".TON(IN:=1,PT:=T#0.4s);
                            IF "Delay_timer1".Q THEN
                              "lift_down":=0;   // .. siis viime lifti üles
                              "lift_up":=1;
                              "Delay_timer1".TON(IN:=0,PT:=T#0s);
                              "INC"(#STEP);
                            END_IF;
                        
                          3: // Kui tõstja on üles jõudnud, käivitame taimeri
                            IF "lift_iup" THEN
                              "Delay_timer1".TON(IN:=1,PT:=T#0.3s);
                            END_IF;
                        
                            // Kui taimeri aeg on täis saanud, siis  kontrollime kõrgust
                            IF "Delay_timer1".Q THEN
                              IF ((18800 < "Height") AND ("Height" < 19200)) OR "key_man" THEN
                                "ej_ext":=1;
                                "slide":=1;
                                "INC"(#STEP);
                              ELSE
                                "wp_mv_down":=1; // liigutame pärast tooriku alumise kaldtee peale
                                "INC"(#STEP);
                              END_IF;
                              "Delay_timer1".TON(IN:=0,PT:=T#0s);
                            END_IF;
                        
                          4: // Kui lükkaja on väljas, siis tõmbame selle tagasi, liigume alla
                            "Delay_timer1".TON(IN:=1,PT:=T#1s);
                            IF (NOT "ej_retd" AND "Delay_timer1".Q) OR "wp_mv_down" THEN
                              "ej_ext":=0;
                              "slide":=0;
                              "lift_up":=0;
                              "lift_down":=1;
                              "Q1":=0;
                              "Q2":=0;
                              "Delay_timer1".TON(IN:=0,PT:=T#0s);
                              "INC"(#STEP);
                            END_IF;
                        
                          5: // Kui toorik läks üles, siis jätkame algusest
                            IF "lift_idown" AND NOT "wp_mv_down" THEN
                              #STEP:=0;
                            ELSIF "lift_idown" AND "wp_mv_down" THEN
                              "wp_mv_down":=0;
                              "ej_ext":=1;
                              "INC"(#STEP);
                            END_IF;
                        
                          6: // Kui toorik läks alla, siis tõmbame lükkaja tagasi ja läheme algusesse
                            "Delay_timer1".TON(IN:=1,PT:=T#0.3s);
                            IF NOT "ej_retd" AND "Delay_timer1".Q THEN
                              "ej_ext":=0;
                              "WP_count":="WP_count"+1; // märgime, et on üks toorik rohkem
                              "Delay_timer1".TON(IN:=0,PT:=T#0s);
                              #STEP:=0;
                            END_IF;
                        
                            IF "WP_count" > 4 THEN #STEP:= 101; END_IF;
                        
                          101: // Kui toorikud saavad täis, siis vilgutame tulesid
                            "QW0":=0;
                            "blink_q1":=1;
                            "blink_q2":=1;
                        END_CASE;
                    
                    
                    Funktsioon: INC [FC100]
| Nimi | Andmetüüp | Kommentaar | |
|---|---|---|---|
| ▼InOut | |||
| ■ var | Byte | ||
| ▼Return | |||
| ■ Ret_Val | Void | 
                    #var:=#var+1; 
                    
                    
            		
               	   
                   
                   
                   
                   