Miért nem elég az „állapot”, hogyan számolunk darabokat, és melyik logika mellett dönt a biztonság — a Standard könyvtár többi építőeleme.

Az előző fejezet az idővel foglalkozott. Ez a fejezet három olyan építőelemet mutat be, amelyek nélkül szinte egyetlen valódi vezérlés sem működik: az élfigyelést, a számlálókat és a bistabil elemeket.

A fejezet egyik megállapítása vizsgakérdés és üzemi buktató is egyben: a CODESYS számlálóinál a beállított érték típusa eltér a szabványtól, és ezt maga a gyártó jelzi.

18.1 Miért kell élfigyelés?

Kezdjük egy feladattal, amely elsőre triviálisnak tűnik: „minden gombnyomásra növeld eggyel a darabszámot”.

A naiv megoldás:

ST
IF bGomb THEN
    iDarab := iDarab + 1;
END_IF

Ez nem működik. A 2. fejezetből tudod, hogy a program ciklikusan fut. Ha a ciklusidő 10 ms, és a kezelő fél másodpercig tartja lenyomva a gombot, akkor a feltétel 50 cikluson át igaz — a számláló pedig 1 helyett 50-nel nő.

📗 Élfigyelés (edge detection)

Olyan funkcióblokk, amely a bemeneti jel állapotváltozását ismeri fel, nem az állapotát. A kimenete akkor lesz igaz, amikor a jel hamisról igazra (felfutó él) vagy igazról hamisra (lefutó él) vált.

Miért kell élfigyelés? — R_TRIG és F_TRIG ← egy-egy PLC-ciklus → CLK (nyomógomb) 8 cikluson át igaz R_TRIG.Q egyetlen ciklus F_TRIG.Q egyetlen ciklus A gomb sok cikluson át igaz — ha „egyszeri” hatást akarunk, az élre van szükség, nem az állapotra.
18.1. ábra. Az élfigyelés működése. A gomb sok cikluson át igaz, az élfigyelő kimenete viszont csak a váltás pillanatában.
⚠️ Ez a ciklikus működés egyenes következménye

Az élfigyelés nem „extra kényelmi funkció”, hanem a PLC alapvető működéséből fakadó szükségszerűség. Amikor egy feladatban ez a szó szerepel — „megnyomásra”, „érkezéskor”, „minden alkalommal”, „egyszer” —, ott szinte biztosan élfigyelés kell.

18.2 R_TRIG és F_TRIG

Blokk Bemenet Kimenet Mit érzékel?
R_TRIG CLK (BOOL) — „Boolean signal to be checked” Q (BOOL) — „TRUE: Rising edge detected” felfutó él5
F_TRIG CLK (BOOL) Q (BOOL) — „TRUE: Falling edge detected” lefutó él6

Hívás ST nyelven (gyártói példák):5 6

ST
RTRIGInst : R_TRIG;
RTRIGInst(CLK := VarBOOL1);
VarBOOL2 := RTRIGInst.Q;
ST
FTRIGInst : F_TRIG ;
FTRIGInst(CLK := VarBOOL1);
VarBOOL2 := FTRIGInst.Q;

A darabszámlálás helyes megoldása tehát:

ST
PROGRAM PLC_PRG
VAR
    fbEl    : R_TRIG;
    iDarab  : INT;
END_VAR

fbEl(CLK := bGomb);

IF fbEl.Q THEN
    iDarab := iDarab + 1;
END_IF
💡 Rövidebb írásmód

A funkcióblokk kimenete közvetlenül is felhasználható a hívás után:

ST
fbEl(CLK := bGomb);
IF fbEl.Q THEN ... END_IF

Sok programozó egyetlen sorban is megírja, de a kétsoros forma olvashatóbb, és hibakeresésnél könnyebb monitorozni.

⚠️ Mennyi ideig igaz a `Q`?

A gyakorlat azt mutatja, hogy az élfigyelő kimenete egyetlen ciklusig marad igaz. A gyártói dokumentáció ezt nem mondja ki szó szerint, ezért a könyv nem állítja gyártói tényként.

Ellenőrizd magad! A 18.4. gyakorlat pontosan ezt méri meg: egy számlálóval megszámoljuk, hány cikluson át igaz a Q. Ez egyben remek bevezetés a 23. fejezet mérési szemléletébe.

💡 Az élfigyelőnek is saját példány kell

Ugyanaz a szabály, mint az időzítőknél (17. fejezet): az R_TRIG állapotos funkcióblokk — a saját példányában tárolja a jel előző értékét. Két különböző jelhez két külön példány kell.

18.3 Számlálók

A Standard könyvtár három számlálót tartalmaz.1

CTU — felfelé számláló

Változó Típus Leírás
CU BOOL felfutó él: növeli a CV-t eggyel2
RESET BOOL igaz: a CV-t nullázza2
PV WORD felső határ a számláláshoz2
Q BOOL igaz, ha CV ≥ PV2
CV WORD az aktuális számlálóérték2
CTU — felfelé számláló (PV = 3) CU CV 012 340 Q Q igaz, mert CV ≥ PV RESET A CU minden felfutó éle növeli a CV-t. A Q igaz marad, amíg a RESET nem nullázza a számlálót.
18.2. ábra. A CTU felfelé számláló működése PV = 3 beállítással.

CTD — lefelé számláló

Változó Típus Leírás
CD BOOL felfutó él: csökkenti a CV-t eggyel3
LOAD BOOL igaz: a CV-t a PV kezdőértékre állítja3
PV WORD a lefelé számlálás kezdőértéke3
Q BOOL igaz, ha CV = 03
CV WORD az aktuális számlálóérték3

Hívás ST nyelven:3

ST
CTDInst : CTD;
CTDInst(CD:= VarBOOL1, LOAD:=VarBOOL2, PV:= VarWORD1);
VarBOOL3 := CTDInst.Q;
VarWORD2 := CTDInst.CV;

CTUD — fel/le számláló

Változó Típus Leírás
CU BOOL felfutó él: növeli a CV-t4
CD BOOL felfutó él: csökkenti a CV-t4
RESET BOOL igaz: a CV-t nullázza4
LOAD BOOL igaz: a CV-t a PV kezdőértékre állítja4
PV WORD kezdőérték lefelé / felső határ felfelé4
QU BOOL igaz, ha CV ≥ PV4
QD BOOL igaz, ha CV = 04
CV WORD az aktuális számlálóérték4
💡 Mikor melyiket?
  • CTU: darabszámlálás, adagolás („minden 12. után csomagolj”).
  • CTD: hátralévő darabszám, készletfogyás, visszaszámlálás.
  • CTUD: raktárkészlet, parkolóház szabad helyei, tartályba be- és kilépő adagok — bármi, ahol két irányban változik a mennyiség.

18.4 KIEMELT: a PV típusa eltér a szabványtól

Ez a fejezet legfontosabb szakmai megállapítása — és a gyártó maga jelzi:4

„Datatype WORD, which is used for PV in CODESYS, does not match the IEC standard, which for PV defines datatype INT.”

⚠️ Mit jelent ez a gyakorlatban?

A 4. fejezetből tudod a különbséget:

Típus Értékkészlet Előjel
WORD (CODESYS) 0 … 65 535 nincs
INT (szabvány) −32 768 … 32 767 van

Három következménye van:

  1. Típusátváltás kell. Ha a PV értékét INT típusú változóból akarod megadni (például a HMI-ről érkezik), akkor konverzió szükséges — enélkül fordítási hibát kapsz.
  2. A CV sem lehet negatív. Egy CTD vagy CTUD nulláról lefelé számlálva nem megy negatívba; a WORD alsó határa a 0.
  3. Hordozhatóság. Egy más gyártó rendszerében írt program, amely INT-tel dolgozik, átvételkor típushibát adhat.
💡 Miért érdemes ezt megjegyezni?

Két okból. Vizsgán: ez pontosan az a fajta részlet, amely megkülönbözteti a „megtanultam a blokk nevét” szintet a „értem, mi történik” szinttől. Gyakorlatban: ez a tipikus rejtélyes fordítási hiba, amit a kezdő nem ért, mert a dokumentáció szerint „PV-t kell megadni”, de a saját INT változóját nem fogadja el a fordító.

És van egy általánosabb tanulság is: a gyártói megvalósítás nem mindig azonos a szabvánnyal. Ezért olvasunk mindig adatlapot — ahogy a 7. fejezetben a bemeneti jelszinteknél is láttuk.

18.5 Bistabil elemek: SR és RS

A bistabil elem („flip-flop”) megjegyez egy állapotot: egy jelre bekapcsol, egy másikra kikapcsol, és a két esemény között megőrzi az értékét.

A Standard könyvtár két bistabil elemet tartalmaz: SR és RS.1

SR — set-domináns RS — reset-domináns SRRS SET1RESET Q1 SETRESET1 Q1 Ha mindkét bemenet igaz: Q1 = igaz (a SET1 dominál) Ha mindkét bemenet igaz: Q1 = hamis (a RESET1 dominál) A névben az „1” utótagot viselő bemenet a domináns.
18.3. ábra. Az SR és az RS bistabil elem. A névben az „1” utótagot viselő bemenet a domináns.

Az RS (reset-domináns) interfésze:7

Változó Típus Leírás
SET BOOL „If TRUE, Q1 is set.”
RESET1 BOOL „If TRUE, Q1 is reset dominant.”
Q1 BOOL „Output value.”

A döntő szabály:7

„If SET and RESET1 are TRUE, the RESET1 input has priority.”

A névkonvenció, amit érdemes megjegyezni: a „1” utótagot viselő bemenet a domináns. Az RS-nél a RESET1, az SR-nél ennek megfelelően a SET1.

Blokk Domináns bemenet Ha mindkettő igaz Mikor használjuk?
SR SET1 Q1 = igaz ha a „bekapcsolt” a biztonságos állapot (ritka)
RS RESET1 Q1 = hamis ha a „kikapcsolt” a biztonságos állapot (jellemző)
⚠️ Melyiket válaszd? — a biztonsági gondolkodás első lépése

Vészleállítás, védőburkolat-figyelés, és minden olyan feladat, ahol a kikapcsolt állapot a biztonságos — ott reset-domináns (RS) logika kell. Így egyidejű indítási és leállítási jel esetén a berendezés nem indul el.

Ez a könyv egyik központi elve, és a 24. fejezetben ugyanez tér vissza hardveresen: a biztonsági relé is csak akkor engedi az újraindulást, ha a veszélyt jelző bemenet szabad, a mágneskapcsolók fizikailag nyitottak, és a kezelő megnyomja a nyugtázó gombot.

Fontos azonban: a szoftveres RS nem helyettesíti a hardveres biztonsági megoldást — csak ugyanazt az elvet követi. Erről a 24. fejezet szól részletesen.

Bistabil elem vagy önfenntartás?

Ugyanez a viselkedés megírható „kézzel” is, önfenntartó logikával:

ST
(* bistabil elemmel *)
fbAllapot(SET := bStart, RESET1 := bStop OR bVesz);
bMotor := fbAllapot.Q1;

(* önfenntartással, ugyanaz az eredmény *)
IF bStart THEN
    bMotor := TRUE;
END_IF
IF bStop OR bVesz THEN
    bMotor := FALSE;
END_IF
💡 Melyik a jobb?

A bistabil elem előnye, hogy a dominancia egyértelmű és dokumentált — ránézésre látszik, melyik jel győz. Az önfenntartó megoldásnál a sorrend dönt: ha a RESET ágat írod másodiknak, az lesz domináns. Ez működik, de kevésbé olvasható, és módosításkor könnyű elrontani.

A könyv ajánlása: biztonsághoz kapcsolódó logikánál használj RS blokkot, mert ott a szándék egyértelmű.

18.6 Összefoglaló táblázat

Elem Mit csinál? Kulcskimenet
R_TRIG felfutó élt érzékel Q — a váltás pillanatában igaz
F_TRIG lefutó élt érzékel Q — a váltás pillanatában igaz
CTU felfelé számlál Q — igaz, ha CV ≥ PV
CTD lefelé számlál Q — igaz, ha CV = 0
CTUD fel és le is számlál QU (CV ≥ PV), QD (CV = 0)
SR set-domináns tárolás Q1 — egyidejűségnél igaz
RS reset-domináns tárolás Q1 — egyidejűségnél hamis

Gyakorlatok

🛠️ 18.1. feladat — Darabszámlálás

A DI1-re kötött érzékelő minden áthaladó terméknél jelet ad. Készíts programot, amely minden 12. termék után 2 másodperces impulzust ad a DO1 kimenetre (a csomagoló indítására), majd a számláló nullázódik. A DI2 gombbal a számláló kézzel is nullázható legyen.

Segítség: kell hozzá R_TRIG, CTU és TP.

Kiegészítő kérdés: miért nem elég, ha az érzékelő jelét közvetlenül a CU bemenetre kötöd? (Gondold végig — a CU maga is élre működik!)

🛠️ 18.2. feladat — Parkolóház

Egy parkolóházban 50 hely van. A DI1 a behajtást, a DI2 a kihajtást érzékeli. Készíts programot, amely:

  1. nyilvántartja a bent lévő autók számát;
  2. a DO1-en „SZABAD” jelzést ad, amíg van hely;
  3. a DO2-n „MEGTELT” jelzést ad, ha elérte az 50-et;
  4. a DI3 gombbal a számláló nullázható (napi nyitás).

Melyik számlálót használod, és miért?

🛠️ 18.3. feladat — Indítás–leállítás bistabil elemmel

Készíts motorvezérlést az alábbi feltételekkel:

  • DI1 = Start (záró), DI2 = Stop (bontó!), DI3 = vészjelzés;
  • a motor a Start gombra induljon, a Stop gombra vagy vészjelzésre álljon le;
  • egyidejű Start és Stop esetén a motor ne induljon el.
  1. Melyik bistabil elemet választod, és miért?
  2. Írd meg a programot ST nyelven.
  3. Írd meg ugyanezt önfenntartó logikával is, és hasonlítsd össze a kettőt olvashatóság szempontjából.
🛠️ 18.4. feladat — Mérés: hány ciklusig igaz a `Q`?

Ez a feladat a saját mérés szemléletét vezeti be.

Készíts programot, amely megszámolja, hány cikluson át igaz egy R_TRIG blokk Q kimenete — a számlálóváltozó minden olyan ciklusban nő eggyel, amelyben a Q igaz:

ST
fbEl(CLK := bGomb);
IF fbEl.Q THEN
    iCiklusok := iCiklusok + 1;
END_IF

Nyomd meg egyszer a gombot, és nézd meg online monitorozásban, mennyi lett az iCiklusok értéke.

  1. Mennyi az eredmény?
  2. Mit bizonyít ez az élfigyelő működéséről?
  3. Mi történne, ha nem használnál élfigyelőt, hanem közvetlenül a bGomb-ot vizsgálnád? Próbáld ki, és hasonlítsd össze a két számot!

Összefoglalás

Az élfigyelés a ciklikus működés egyenes következménye: egy nyomógomb sok cikluson át igaz, ezért „egyszeri” hatáshoz az állapotváltozást kell figyelni, nem az állapotot. Az R_TRIG a felfutó, az F_TRIG a lefutó élt érzékeli.

A számlálók közül a CTU felfelé, a CTD lefelé, a CTUD mindkét irányban számlál. A CTU kimenete akkor igaz, ha CV ≥ PV; a CTD-é akkor, ha CV = 0.

Kiemelt megállapítás: a CODESYS-ben a PV típusa WORD, ami — a gyártó saját megjegyzése szerint — nem egyezik a szabvánnyal, ahol INT. Ez azt jelenti, hogy a PV előjel nélküli (0…65 535), és INT típusú változóból csak típusátváltással adható meg.

A bistabil elemek megjegyzik az állapotot. Az SR set-domináns, az RS reset-domináns — a névben az „1” utótagot viselő bemenet a domináns. Biztonsághoz kapcsolódó logikánál RS-t használunk, hogy egyidejű indítási és leállítási jelnél a berendezés ne induljon el.

Az élfigyelőknek és a számlálóknak — akárcsak az időzítőknek — saját példány kell.

Ellenőrző kérdések

  1. Miért nem működik a IF bGomb THEN iDarab := iDarab + 1; END_IF szerkezet?
  2. Mit érzékel az R_TRIG és mit az F_TRIG? Mi a bemenetük és a kimenetük neve?
  3. Milyen szavak utalnak arra egy feladatleírásban, hogy élfigyelés kell?
  4. Mikor lesz igaz a CTU és mikor a CTD blokk Q kimenete?
  5. Melyik számlálót használnád parkolóház-nyilvántartásra, és miért?
  6. Milyen típusú a PV a CODESYS-ben, és milyen a szabvány szerint? Mi ennek a három következménye?
  7. Mit jelent, hogy egy bistabil elem set- vagy reset-domináns?
  8. Melyik bemenet a domináns az SR-nél és melyik az RS-nél? Mi a névkonvenció?
  9. Miért reset-domináns logikát használunk biztonsághoz kapcsolódó feladatnál?
  10. Mi az önfenntartó megoldás hátránya a bistabil elemmel szemben?

Tudáspróba

Válaszd ki az egyetlen helyes választ!

1. Miért kell élfigyelés a gombnyomások számlálásához? a) mert a program ciklikusan fut, és a gomb sok cikluson át igaz; b) mert a gomb jele zajos; c) mert a számláló csak élre működik; d) mert a szabvány előírja.

2. Az R_TRIG blokk bemenete és kimenete: a) IN és Q b) CLK és Q c) CU és CV d) SET és Q1

3. A CTU blokk Q kimenete akkor igaz, ha: a) CV = 0 b) CV < PV c) CV ≥ PV d) a RESET igaz

4. A CTD blokk Q kimenete akkor igaz, ha: a) CV > 0 b) CV ≥ PV c) a LOAD igaz d) CV = 0

5. Melyik számláló képes mindkét irányban számlálni? a) CTUD b) CTD c) CTU d) CTR

6. A PV típusa a CODESYS-ben: a) INT b) WORD c) DINT d) REAL

7. Miért fontos a PV típusának eltérése a szabványtól? a) mert lassítja a programot; b) mert a számláló nem működik helyesen; c) mert a WORD előjel nélküli (0…65 535), ezért INT-ből típusátváltás kell; d) mert a szabvány tiltja a WORD használatát.

8. Az RS bistabil elemnél, ha a SET és a RESET1 is igaz: a) a Q1 igaz lesz; b) hibaüzenet keletkezik; c) a Q1 értéke megmarad; d) a Q1 hamis lesz.

9. A bistabil elemek névkonvenciója szerint a domináns bemenet: a) amelyik nevében „1” utótag szerepel; b) mindig a RESET; c) mindig a SET; d) amelyiket előbb hívjuk meg.

10. Biztonsághoz kapcsolódó indítás–leállítás logikánál melyik elemet választjuk? a) SR, mert az indítás fontosabb; b) RS, hogy egyidejű jelnél a berendezés ne induljon el; c) mindegy, mert a program sorrendje dönt; d) egyiket sem, csak önfenntartást.

A megoldókulcs a B függelékben található.

A fejezet forrásai


  1. CODESYS Standard Library Documentation. CODESYS GmbH, v3.5.22.0. (2026-07-29) ↩↩

  2. CODESYS Standard Library: CTU (FB). (2026-07-29) ↩↩↩↩↩

  3. CODESYS Standard Library: CTD (FB). (2026-07-29) ↩↩↩↩↩↩

  4. CODESYS Standard Library: CTUD (FB). A PV típusára vonatkozó megjegyzés a gyártó saját dokumentációjából. (2026-07-29) ↩↩↩↩↩↩↩↩↩

  5. CODESYS Standard Library: R_TRIG (FB). (2026-07-29) ↩↩

  6. CODESYS Standard Library: F_TRIG (FB). (2026-07-29) ↩↩

  7. Phoenix Contact: PLCnext Engineer online help — RS (bistabil funkcióblokk). (2026-07-29) Az SR blokk pontos interfészét a CODESYS objektumböngészőjéből kell ellenőrizni; a set-dominancia a névkonvencióból következik. ↩↩

Mennyire volt hasznos ez a fejezet?

Még nincs értékelés.