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:
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ő.
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.
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
RTRIGInst : R_TRIG; RTRIGInst(CLK := VarBOOL1); VarBOOL2 := RTRIGInst.Q;
FTRIGInst : F_TRIG ; FTRIGInst(CLK := VarBOOL1); VarBOOL2 := FTRIGInst.Q;
A darabszámlálás helyes megoldása tehát:
PROGRAM PLC_PRG VAR fbEl : R_TRIG; iDarab : INT; END_VAR fbEl(CLK := bGomb); IF fbEl.Q THEN iDarab := iDarab + 1; END_IF
A funkcióblokk kimenete közvetlenül is felhasználható a hívás után:
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.
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.
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ó 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
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 |
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 forPVin CODESYS, does not match the IEC standard, which forPVdefines datatypeINT.”
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:
- Típusátváltás kell. Ha a
PVértékétINTtí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. - A
CVsem lehet negatív. EgyCTDvagyCTUDnulláról lefelé számlálva nem megy negatívba; aWORDalsó határa a 0. - Hordozhatóság. Egy más gyártó rendszerében írt program, amely
INT-tel dolgozik, átvételkor típushibát adhat.
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 é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ő) |
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:
(* 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
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
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!)
Egy parkolóházban 50 hely van. A DI1 a behajtást, a DI2 a kihajtást érzékeli. Készíts programot, amely:
- nyilvántartja a bent lévő autók számát;
- a DO1-en „SZABAD” jelzést ad, amíg van hely;
- a DO2-n „MEGTELT” jelzést ad, ha elérte az 50-et;
- a DI3 gombbal a számláló nullázható (napi nyitás).
Melyik számlálót használod, és miért?
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.
- Melyik bistabil elemet választod, és miért?
- Írd meg a programot ST nyelven.
- Írd meg ugyanezt önfenntartó logikával is, és hasonlítsd össze a kettőt olvashatóság szempontjából.
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:
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.
- Mennyi az eredmény?
- Mit bizonyít ez az élfigyelő működéséről?
- 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
- Miért nem működik a
IF bGomb THEN iDarab := iDarab + 1; END_IFszerkezet? - Mit érzékel az
R_TRIGés mit azF_TRIG? Mi a bemenetük és a kimenetük neve? - Milyen szavak utalnak arra egy feladatleírásban, hogy élfigyelés kell?
- Mikor lesz igaz a
CTUés mikor aCTDblokkQkimenete? - Melyik számlálót használnád parkolóház-nyilvántartásra, és miért?
- Milyen típusú a
PVa CODESYS-ben, és milyen a szabvány szerint? Mi ennek a három következménye? - Mit jelent, hogy egy bistabil elem set- vagy reset-domináns?
- Melyik bemenet a domináns az
SR-nél és melyik azRS-nél? Mi a névkonvenció? - Miért reset-domináns logikát használunk biztonsághoz kapcsolódó feladatnál?
- 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
-
CODESYS Standard Library Documentation. CODESYS GmbH, v3.5.22.0. (2026-07-29) ↩↩
-
CODESYS Standard Library: CTUD (FB). A
PVtípusára vonatkozó megjegyzés a gyártó saját dokumentációjából. (2026-07-29) ↩↩↩↩↩↩↩↩↩ -
Phoenix Contact: PLCnext Engineer online help — RS (bistabil funkcióblokk). (2026-07-29) Az
SRblokk 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. ↩↩