Programmeeritavad kontrollerid
Euroopa struktuurfondide logo
Siemens LOGO! viide Automatiseerimise viide Mehhatroonikaseadmete viide Pneumoautomaatika viide
Joonis

Ü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;
Creative Commons Licence
"Programmeeritavad kontrollerid" is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License .