A 18. fejezet („Számlálók, élfigyelés és bistabil elemek") gyakorlatainak részletes megoldásai és a tudáspróba megoldókulcsa. Előbb dolgozd ki magad, csak utána ellenőrizz!
Gyakorlatok — megoldások
18.1. feladat — Darabszámlálás
Megoldás
VAR rtErzekelo : R_TRIG; ctuDarab : CTU; tpCsomagol : TP; END_VAR rtErzekelo(CLK := bErzekelo); ctuDarab(CU := rtErzekelo.Q, RESET := ctuDarab.Q OR bKeziNullaz, PV := 12); tpCsomagol(IN := ctuDarab.Q, PT := T#2S); bCsomagolo := tpCsomagol.Q;
A Q kimenet CV >= PV esetén igaz; ezt használjuk egyszerre az impulzus indítására és a
számláló nullázására, így a lánc önműködően újraindul. A bKeziNullaz (DI2) bármikor nulláz.
A kiegészítő kérdés: a CU bemenet maga is felfutó élre működik, tehát az érzékelő
jelét közvetlenül is rákötheted — a számlálás úgy is helyes lesz. Az explicit R_TRIG
mégis hasznos:
- ha ugyanazt az élt máshol is fel akarod használni (kijelzés, naplózás), egy helyen áll elő, és biztosan ugyanaz;
- ha a „jel” nem közvetlen bemenet, hanem számított feltétel (pl.
rSuly > 500.0), az élfigyelés teszi eseménnyé; - olvashatóság: a kódból látszik, hogy eseményt számolunk, nem állapotot.
18.2. feladat — Parkolóház
Megoldás
CTUD (fel/le számláló) kell, mert a bent lévő autók száma mindkét irányban változik:
behajtásnál nő, kihajtásnál csökken. Két külön CTU nem adna helyes eredményt.
VAR rtBe : R_TRIG; rtKi : R_TRIG; ctAutok : CTUD; END_VAR rtBe(CLK := bBehajtas); rtKi(CLK := bKihajtas); ctAutok(CU := rtBe.Q, CD := rtKi.Q, RESET := bNapiNullaz, PV := 50); bMegtelt := ctAutok.CV >= 50; bSzabad := NOT bMegtelt;
⚠ Gyakori hiba: a bSzabad és a bMegtelt egymástól függetlenül való kiszámítása.
Ha külön feltétellel írod mindkettőt, előbb-utóbb lesz olyan állapot, amelyben egyszerre
világít a két lámpa. A tagadásos megoldás ezt kizárja.
18.3. feladat — Indítás–leállítás bistabil elemmel
Megoldás
RS(reset-domináns), mert egyidejű Start és Stop esetén a motor ne induljon el — a kikapcsolt állapot a biztonságos. A névkonvenció segít: az „1” utótagú bemenet a domináns, azRS-nél ez aRESET1.- A program:
VAR fbMotor : RS; END_VAR (* bStop NC-jel: nyugalmi állapotban TRUE, gombnyomásra vagy vezetékszakadásra FALSE — ezért kell a tagadás a RESET1 ágba *) fbMotor(SET := bStart, RESET1 := NOT bStop OR bVesz); bMotor := fbMotor.Q1;
- Ugyanez önfenntartó logikával:
bMotor := (bStart OR bMotor) AND bStop AND NOT bVesz;
Összehasonlítás: az önfenntartó változat rövidebb, és a leállítási feltételek egy sorban
látszanak — viszont a „ki dominál” kérdésre csak a kifejezés elemzésével válaszol. Az RS
változat kimondja a szándékot: a nevében benne van, hogy a leállítás erősebb. Csapatmunkában
és biztonsági jellegű logikánál ez utóbbi a védhetőbb.
⚠ Ez a feladat legfontosabb pontja: a bStop bontó (NC) érintkezőről jön, ezért
nyugalmi állapotban igaz. A RESET1 ágba tehát NOT bStop kell — így a gombnyomás és a
vezetékszakadás is leállítja a motort. Ha ide bStop-ot írnál, a motor el sem indulna, és
a szakadás észrevétlen maradna (13.7).
(A vészjelzésnél ugyanez a megfontolás: valódi berendezésen a vészkör huzalozott és NC-elvű —
ott NOT bVesz állna. A 24. fejezet arról is szól, hogy a vészleállítást nem a PLC-programra
bízzuk.)
18.4. feladat — Mérés: hány ciklusig igaz a Q?
Megoldás
- Az
iCiklusokértéke gombnyomásonként pontosan eggyel nő. - Ez azt bizonyítja, hogy az
R_TRIGQkimenete egyetlen cikluson át igaz — függetlenül attól, meddig tartod nyomva a gombot. Az élfigyelő eseménnyé alakítja az állapotot. - Élfigyelő nélkül (
IF bGomb THEN …) a számláló minden ciklusban nő, amíg a gombot nyomva tartod: egy másodperces nyomás 10 ms-os tasknál kb. 100 növekedést jelent. A két szám különbsége mutatja meg, mekkora a különbség állapot és esemény között.
Ez a feladat az I függelék M2 eljárásának kicsinyített változata. Írd fel a task intervallumát, a nyomás hozzávetőleges hosszát és a kapott két számot: ebből kiszámítható a tényleges ciklusidő is. Egy jó vizsgadokumentációban az ilyen mérés többet ér, mint három oldal elmélet.
Tudáspróba — megoldókulcs
| # | Válasz | Indoklás | Szakasz |
|---|---|---|---|
| 1 | a | A program ciklikusan fut, a gomb sok cikluson át igaz — ezért kell élfigyelés. | 18.1 |
| 2 | b | Az R_TRIG bemenete CLK, kimenete Q. |
18.2 |
| 3 | c | A CTU Q kimenete akkor igaz, ha CV ≥ PV. |
18.3 |
| 4 | d | A CTD Q kimenete akkor igaz, ha CV = 0. |
18.3 |
| 5 | a | Mindkét irányban a CTUD számlál. |
18.3 |
| 6 | b | A CODESYS-ben a PV típusa WORD (a szabvány INT-et mond). |
18.4 |
| 7 | c | A WORD előjel nélküli (0…65 535), ezért INT-ből típusátváltás kell. |
18.4 |
| 8 | d | Az RS reset-domináns: egyidejű jelnél a Q1 hamis. |
18.5 |
| 9 | a | A névkonvenció szerint az „1” utótagú bemenet a domináns (RESET1, SET1). |
18.5 |
| 10 | b | Biztonsághoz kapcsolódó logikánál RS, hogy egyidejű jelnél a gép ne induljon el. |
18.5 |