Ü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;