Impulzusok előállítása

Meghatározott idejű impulzusokat időzítőkkel, számlálókkal tudunk előállítani. Vagy használhatjuk az impulzusok időalapjául a CPU Clock memory biteket, ami 8 különböző, fix sebességű 50%-os kitöltésű, folyamatos impulzus sorozatot szolgáltat. De írhatunk saját blokkot is impulzusok előállítására.
Azokkal az impulzusokkal, amikről itt lesz szó, élvezérlést valósíthatunk meg.

Mi az az élvezérlés?
Amikor egy logikai jel megváltozásakor (és csak akkor) szeretnénk valamilyen műveletet végrehajtani. Ilyenkor nem a jel állapota érdekel, hanem az állapot megváltozása (jelváltás).



Egyszerű példa az ilyen esetre az, amikor pl. hozzá akarunk adni egy értéket egy másikhoz, majd az eredményt eltárolni ugyanabban a változóban, amelyikhez hozzáadtuk (érték növelése). Az egyszerűség kedvéért legyen egy nyomógomb az, amivel az értéket növelni akarjuk.
Ha így csináljuk:


Akkor az történik, hogy amikor a gomb meg van nyomva és a program végrehajtása az ADD_DI utasításra fut, akkor az MW200-hoz hozzáad 10-et. Ez első látásra jónak tűnik, de ha kipróbáljuk azt fogjuk tapasztalni, hogy amikor a gombot megnyomják, akkor az MW200-ban az érték pörögni kezd és rövid idő alatt hihetetlenül nagyra nő. Ez azért történik, mert a PLC programja ciklikusn újra és újra végrehajtódik néhány vagy néhányszor tíz ezredmásodpercenként. Amíg a gombot nyomják, az alatt az idő alatt a program sokszor lefut és mindannyiszor növeli MW200 értékét  (hiszen éppen ezt mondtuk neki).
Itt hasznos az élvezérlés. Az ADD_I utasítást tehát nem akkor kell meghívni, amikor a gomb meg van nyomva, hanem amikor a gomb jele FALSE állapotból TRUE állapotúra változik.

Hogyan?
Az él figyelés tulajdonképpen olyan impulzus létrehozása, amelyik csak egyetlen PLC ciklus ideig aktív. Az ilyen impulzus egyszer, de csakis egyszer a teljes program bármely pontján vizsgálva TRUE (1) állapotban van.

Az elv a következő:
Szükség van egy átmeneti változóra, amiben eltárolhatjuk a nyomógomb állapotát. Ez legyen célszerűen egy merker bit.
Figyelni kell a gomb állapotát, és azt össze kell hasonlítani az átmeneti változó állapotával. Ha a gomb állapota TRUE és az átmeneti változó állapota FALSE, akkor felfutó él van, végrehajtjuk a szükséges műveletet, majd utána az átmeneti változóba másoljuk a gomb állapotát (jelen esetben a TRUE állapotot).

Példa:

A módosított példaprogram már csak akkor növeli MW200-at, amikor a gomb állapota 0-1 átmenetet produkál, vagyis minden megnyomáskor egyszer. Az átmeneti változó szerepét, ami a gomb korábbi állapotának tárolását végzi, az M1.5 merker bit játsza.
Természetesen ezt az M1.5-öt már nem használhatjuk fel a programban máshol más célra (nem szabad írni), mert az megzavarja az él figyelést és hamis impulzusokat generálhat!
Ilyen módszerrel még sem szoktunk élvezérlést csinálni, mert az él detektálására van utasítás, aminek a használata egyszerűbbé teszi a dolgot.

--(P)-- Pozitív és ---(N)-- negatív RLO él figyelés
--(P)-- utasítás használható felfutó él érzékelésére, --(N)-- lefutó él vezérlésére.
A nyomógombos példa ezzel az utasítással a következőképpen néz ki:


Az átmeneti változóra (M1.5) itt is szükség van, de nem nekünk kell a tartalmát aktualizálni, azt elvégzi a --(P)-- utasítás.



Az "A" pontban a nyomógombról érkező állapot olvasható le, a --(P)-- utasítás ezt figyeli. A "B" pontban egy impulzus jön létre, aminek az ideje megfelel a PLC ciklus idejének (Scan time), amennyiben a szóban forgó programrész minden PLC ciklusban lefut ( és nem egy feltételesen hívott blokkban van). Az ADD_I utasítás előtti "B" pontban tehát csak egyszer lesz TRUE állapot, minden gombnyomáskor.

--(N)-- utasítás annyiban tér el a --(P)-- utasítástól, hogy a lefutó élet figyeli.
A nyomógombos példára alkalmazva a számláló a gomb felengedésének pillanatában fog lépni.




Összefoglalva:
A --(P)-- és az --(N)-- az RLO bit változását figyeli és az RLO állapotát menti el az átmeneti változóba. Az RLO bit egy S7 status bit, ami a végrehajtás alatt lévő logikai utasítások eredményét tartalmazza (Result of Logic Operation).
Ebből az következik, hogy a --(P)-- és --(N)-- előtt és mögött komplexebb logikai műveleteket is alkalmazhatunk:
Erre egy példa:

Az impulzust mindig a --(P)-- és az --(N)-- utasítás előtti feltételek eredményéből képzi. A --(P)-- és az --(N)-- utáni feltételek pedig korlátozzák az impulzus "terjedését".

POS pozitív és NEG negatív él figyelés
A --(P)-- és --(N)-- utasítástól alapvetően abban tér el, hogy nem az RLO-t vizsgálja, hanem egy címet, amit közvetlenül paraméterként adunk meg az utasításnak.

NEG (Address Negative Edge Detection)



Összehasonlítja <address1> jel állapotát az előző futáskor aktuális állapotával, amit <address2> tartalmaz. Ha az <address1> aktuális állapota "0" és az előző állapot "1"  volt, a Q kimenetet 1-be állítja, majd <address1>-et <address2>-be másolja (lefutó él).
Az impulzus tehát a Q kimeneten jön létre, <address1> jel TRUE->FALSE  átmenetekor.

POS (Address Positive Edge Detection)



Összehasonlítja <address1> jel állapotát az előző futáskor aktuális állapotával, amit <address2> tartalmaz. Ha a <address1> aktuális állapota "1" és az előző állapot "0"  volt, a Q kimnetet 1-be állítja , majd <address1>-et <address2>-be másolja (felfutó él).
Az impulzus itt is a Q kimeneten jön létre.
A POS és NEG utasítások felső "bemenete" engedélyező jelként viselkedik. Vagyis ha az utasítás előtti feltételsor nem teljesül, akkor nem hoz létre impulzust. Hatása ugyanaz, mint a -(P)- vagy -(N)- utasítás után elhelyezett feltételek hatása.

A Step7 v5.4 help-je és a "STEP 7 - Ladder Logic for S7-300 and S7-400" című PDF dokumentum hibásan írja le a NEG utasítást (ugyanaz a magyarázó szöveg szerepel a NEG-nél mint a POS-nál).

Továbbra is a nyomógombos példánál maradva, a POS utasítással a 4-es ábrán látható funkció az alábbi lesz:

 
Nem tehetünk tehát további feltételeket a "gomb" mellé, ez csak a nyomógomb állapotváltozását fogja figyelni. Tehetünk azonban feltételeket az utasítás elé. Ha a feltételsor FALSE eredményt ad, akkor a POS / NEG utasítást hatástalan lesz (nem történik él figyelés a gombon).

Ha jobban megnézzük, a --(P)-- és --(N)--, valamint a POS és NEG is ugyanarra az FP és FN STL utasításra fordul le.

Az impulzus hossza
A fel és lefutó él hatására keletkező impulzus hossza, ami a 6-os és 8-as ábrán "1 Scan time" feliratot kapott, egy PLC ciklus hosszú lesz. ha az a blokk, amelyikben az él figyelése van, minden ciklusban lefut.

De mi van, ha nem?
Mivel már tudjuk azt, hogy a változást az előző lefutáskor az átmeneti változóban eltárolt és a pillanatnyi állapot összehasonlításával érzékeli, nem nehéz kitalálni, hogy mi történik, ha az él figyelését végző blokkot csak másodpercenként egyszer futtatjuk le.Két dolog fog megváltozni:
  1. Az impulzus hossza 1 másodperc lesz
  2. Nem garantálható, hogy a változást észleli, ha a figyelt bit 1 másodpercnél rövidebb ideig változik meg
Amennyiben a hívások üteme nem rendszeres, tehát két hívás között nem mindig kb. ugyanakkora idő teli el (mert mondjuk a hívást feltételekhez kötöttük) akkor a keletkező impulzus olyan hosszú lesz, amennyi idő eltelik az él észlelését követően az él figyelés kivetkező lefutásáig.
Éppen ez    ért nem szoktuk az ilyen él figyelést olyan blokkban elhelyezni, amelyik nem fut le rendszeresen (kivéve ha éppen a fent említett hatást szeretnénk elérni).

Mire kell vigyázni?
Arra, hogy az él figyelés által használt átmeneti tároló globális változó legyen és arra, hogy ennek a változónak az értékét ne változtassuk meg a program más részeiben.
Egy FC vagy FB blokkban tehát a TEMP változók alkalmatlanok ez él figyelés átmeneti változójának szerepére.



A képen látható megoldás tehát hibás!
Miért?
Mert az #IMP_TMP lokális (TEMP) változó ezért értéke elvész, amikor a blokk végrehajtása befejeződik. Így amikor a következő körben újra az impulzus figyelésre kerül a vezérlés, az #IMP_TMP tartalma határozatlan lesz. Az impulzus figyelés ezért hibásan fog működni.
Érdekes azonban, hogy ha a fenti programot valaki kipróbálja, akkor azt fogja tapasztalni, hogy kifogástalanul működik.
Ennek az az oka, hogy csak ezt az FC2 blokkot használtuk amelyikben lokális változók vannak.Ezért az #IMP_TMP értéke megmarad két hívás között is. Egészen más lesz a helyzet, ha más blokkok is használnak lokális változókat. Akkor az FC2 #IMP_TMP-je is felülíródik, mert minden blokk ugyanazt a memóriaterületet használja a lokális változók tárolására. 
Átmeneti változó legyen egy merker bit, vagy egy bit valamelyik adatblokkban. Ha egy általánnos célú blokkban kell impulzus figyelést megvalósítani és nem akarjuk fixen beleírni az átmeneti változó címét (ilyenkor ez nem is tanácsos) akkor adjuk át a blokknak IN_OUT paraméterként.
Erre egy példa:


Ilyenkor a blokk hívásnál mondjuk meg neki hova tegye az átmeneti változót:


Mire jó?
Sokmindenre használható, olykor nélkülözhetetlen.
Pl. biztonsági megoldásokhoz. Természetesen itt nem munkabiztonságról, hanem főleg üzembiztonságról van szó.
Például egy berendezés nyomógombos indításánál használható arra, hogy a rendszer csak a gomb megnyomásakor indulhasson el, akkor ne ha a gombot kitámasztották vagy leragasztották és a gombtól független indítási feltételek teljesülnek.

Vagy ha a működés szempontjából valahol kiemelten fontos az, hogy a gép egy része biztosan egy adott helyzetbe kerüljön, amit egy bemenetre kötött végállás érzékel, akkor amellett hogy a működés feltételei közé beillesztjük az adott bemenetet, él figyelés felhasználásával készíthetünk egy olyan programrészt, amelyik csak akkor ad engedélyező jelzést, ha az illető végállás felszabadult majd ismét meg lett nyomva,
Ezzel elkerülhető a hibás működés, ami akkor következik be ha a végálláskapcsolót kitámasztják, vagy úgy megy tönkre hogy folyamatosan aktív jelet ad (mint ha meg lenne nyomva).

Használhatjuk forgásimpulzusok kezelésére, ahol a forgó alkatrész minden fordulat során impulzusokat ad,. A programban pedig figyelni kell hogy a forgó rész valóban forog-e. Az él figyelés lehetővé teszi, hogy a forgó alkatrész leállását a program akkor is észlelje, ha az éppen a jeladónál vagy mellette áll le.
Persze nem csak forgás, de bármilyen impulzus sorozat leállásának (vagy az impulzus idő megnövekedésének) detektálására felhasználható.


Kapcsolódó írások:
Blokk hívás, változók és paraméter átadás
S7 300/400 időzítők és számlálók
Impulzus sorozatok egyszerűen
Forgásfigyelő
Fel és lefutó él detektálása
Impulzus adó

Felhasznált irodalom:
STEP 7 - Ladder Logic for S7-300 and S7-400



Szirty