27.12.2014 Views

Siemens PLC-k alkalmazástechnikája és programozása - Budapesti ...

Siemens PLC-k alkalmazástechnikája és programozása - Budapesti ...

Siemens PLC-k alkalmazástechnikája és programozása - Budapesti ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Budapesti</strong> Műszaki és Gazdaságtudományi Egyetem<br />

Irányítástechnika és Informatika Tanszék<br />

<strong>Siemens</strong> <strong>PLC</strong>-k<br />

alkalmazástechnikája és<br />

programozása<br />

Félév végi beszámoló az önálló laboratórium tárgy keretében, a<br />

Gamma Digital Kft-nél végzett munkáról<br />

Készítette:<br />

Konzulensek:<br />

Németh Zoltán (ANYZ72),<br />

a 2012/2013-as tanév tavaszi félévében<br />

Nagy László<br />

Dr. Kiss Bálint


1. Bevezető, motivációk<br />

Bár az egyetemre úgy érkeztem, hogy nem volt egyértelmű számomra, hogy milyen<br />

irányba fejlődjek a villamosmérnöki szakmán belül, az ötödik félévre már<br />

körvonalazódott bennem, hogy mit csinálnék szívesen. Egyáltalán nem idegenkedek a<br />

programozástól, szívesen foglalkozok logikai feladatokkal, algoritmusokkal, folyamatok<br />

leírásával, részfolyamatok, események egymásra épülésével, ok-okozati viszonyaival.<br />

Szeretem az olyan feladatokat, amik nem elvontak, könnyen el lehet képzelni, hogy az<br />

adott mechanizmus hogy működik. Motivál, ha a munkám eredményét látom a<br />

gyakorlatban működni, összességében közelebb áll hozzám a gyakorlat, mint az elmélet.<br />

Igaz, hogy az önálló laboratóriumi témám kiválasztása előtt semmi kapcsolatom nem volt<br />

a <strong>PLC</strong>-kel, és nem is tudtam róluk túl sok mindent, éreztem, hogy az ipari<br />

irányítástechnikával, automatizálással nem nagyon nyúlhatok mellé. Így esett a<br />

választásom a Gamma Digital Kft.-nél (továbbiakban: cég) végezhető önálló<br />

laboratóriumra. Most a féléves munka után úgy gondolom, nem is választhattam volna<br />

ennél jobban.<br />

2. A <strong>PLC</strong> és a LAD nyelv bemutatása<br />

Napjainkra az ipari automatizálás alapvető eszközévé a <strong>PLC</strong> (Programmable Logic<br />

Controller) vált. Térhódítása a 70-es években kezdődött, a General Motors ekkor írt ki<br />

pályázatot egy programozható vezérlőberendezés fejlesztésére. A pályázatban szereplő<br />

feltételek egy mai <strong>PLC</strong>-nek is alapvető jellemzői:<br />

nagy megbízhatóság,<br />

nem tartalmaz mozgó alkatrészt, ezért hosszú az élettartama,<br />

a be- és kimenetek galvanikusan leválasztottak,<br />

egyszerű felépítés,<br />

kis méret,<br />

könnyű programozhatóság,<br />

valós idejű működés.<br />

Ezek a tulajdonságok képessé teszik a <strong>PLC</strong>-t, hogy megfeleljen az ipari környezet<br />

elvárásainak. A vezérlési és folyamatirányítási feladatokat tárolt programmal valósítják<br />

meg, és képesek a technológiai folyamatok közvetlen irányítására. A <strong>PLC</strong>-re a ciklikus<br />

programvégrehajtás jellemző. Felépítésüket tekintve megkülönböztetünk moduláris,<br />

illetve kompakt <strong>PLC</strong>-ket. A kompakt <strong>PLC</strong>-k kisméretűek, de hardver struktúrájuk nem<br />

módosítható. A moduláris <strong>PLC</strong>-k különböző modulokból épülnek fel, ezek mindegyike<br />

egy meghatározott speciális funkciót lát el, pl. CPU egység, kommunikációs egység. A<br />

modulokat egy ún. rack-be (tartó, sín) dugaszolhatjuk, így a hardverkonfigurációt<br />

sokféleképp lehet összerakni (lásd: 1. ábra). A rack-et természetesen megfelelően védett<br />

műszerszekrénybe kell elhelyezni. A SIEMENS Simatic S7 család, aminek a<br />

programozásával a félév folyamán foglalkoztam, a moduláris <strong>PLC</strong>-k közé tartozik. A<br />

<strong>PLC</strong>-k hardvere univerzális, központi feldolgozóegységük egy általános célú<br />

mikroprocesszor. A fentiek alapján a <strong>PLC</strong>-ket a következő módon definiálhatjuk: „A <strong>PLC</strong><br />

olyan ipari számítógépnek tekinthető, amely speciális hardveregységei és felhasználói


programja révén a technológiai folyamatok tárolt programú irányítására és intelligens<br />

kommunikációs felülete révén hierarchikus és/vagy osztott folyamatirányító rendszerek<br />

létrehozására alkalmas.” 1<br />

A <strong>PLC</strong>-k biztonsági szempontból is több kategóriába sorolhatók, eszerint vannak az<br />

„alap” <strong>PLC</strong>-k, valamint az Ex, F, H, FH, besorolásúak. Utóbbiak ára sokkal magasabb az<br />

alap <strong>PLC</strong>-k áránál. Az Ex robbanásbiztos berendezéseket jelöl, jellemzően csak a<br />

hardverkövetelmények szintjét emeli, a programmal szemben nem támaszt extra<br />

elvárásokat. Az F a hibatűrő rendszereket jelöli (fail-safety), fontos tulajdonságuk, hogy a<br />

SIL norma szerinti öt SIL szint közül melyiknek felelnek meg. A besorolást hatásanalízis<br />

előzi meg, magasabb szinteken csak független külső szakértő bevonásával állapítható meg<br />

a biztonsági szint. A H redundáns rendszereket jelöl, ez lehet szoftveres, vagy hardveres<br />

is.<br />

A SIEMES <strong>PLC</strong>-k közül jellemzően a Simatic S7<br />

család S7-300-as és 400-as tagjait alkalmazzák. A<br />

leggyakoribb a 300-as, a 400-as általában a nagy<br />

üzembiztonságot igénylő rendszereket szolgálja<br />

ki. A moduláris felépítés miatt az egységeket a<br />

sínre lehet feltenni, sorrendjük valamennyire<br />

kötött. A feltöltött program a belső memóriába<br />

kerül, ez lehet többek között integrált RAM, vagy<br />

csatlakoztatható memóriakártya. A CPU-ba<br />

integrálva található a rendszermemória. Ide<br />

kerülnek a merkerek, timerek, számlálók, a hívott<br />

funkciók lokális adatai. Innen kerülnek<br />

1. ábra: Simatic S7 <strong>PLC</strong>-k<br />

továbbításra a beolvasott bemenetek és a<br />

kimenetek. Akkumulátor használata esetén<br />

árammentes helyzetben is megőrzi az adatokat. A munkamemória is a CPU-ba van<br />

integrálva, a felhasználói program és a hozzá kapcsolódó DB-k innen kerülnek<br />

meghívásra. A rendszermemória és a munkamemória nem bővíthető. A <strong>PLC</strong>-n található<br />

kulcs kapcsoló állásai megtalálhatók a szimulációs programban is (lásd később),<br />

jelentésük a következő:<br />

RUN-P: futtatás programozói módban, menet közben módosítható a program,<br />

RUN: futtatás védett módban: a program nem módosítható,<br />

STOP: a program leállítása,<br />

MRES: teljes törlés.<br />

Ezen kívül a CPU-n vannak LED-ek (pl. különböző módok jelzésére), különféle<br />

csatlakozók típustól függően (pl. MPI, profinet). A CPU-n kívül sokféle Simatic S7<br />

modul létezik, különféle I/O kártyák és funkciós kártyák (pl. számláló, pozicionáló,<br />

szabályzó).<br />

A <strong>PLC</strong> működéséhez azonban nyilván nemcsak hardverre, hanem megfelelő programra is<br />

szükség van. A <strong>PLC</strong> programnyelvek más elveken alapulnak, mint a magas szintű<br />

programnyelvek. A <strong>PLC</strong> programok teljesen szekvenciálisan futnak, a futásuknak<br />

1 Lásd 2. forrás, 13. oldal


szintideje van. Az eseményvezéreltség nem értelmezhető a program futásánál,<br />

megszakításokat is csak egyedi megszorításokkal lehet alkalmazni. Jellemző, hogy egy<br />

adott gyártó eszközére írt program nem vihető át egy másik gyártóéra. A <strong>PLC</strong>-k<br />

hasonlóságából fakadóan azonban hasonlítanak egymásra. A következőkben a programok<br />

szerkezeti elemeiről, és a félév során használt LAD nyelvről szerzett ismereteket foglalom<br />

össze.<br />

A program néhány alap építőelemből (német: Baustein, angol: block, továbbiakban blokk)<br />

épül fel:<br />

OB: szervező blokk (Organisation Baustein), a főprogramot tartalmazza, innen<br />

hívjuk meg a program többi részét (pl.: FB, FC), legfontosabb az OB1,<br />

DB: kötetlen struktúrájú adatokat tartalmaz, az instanz DB-k egy FB-hez vannak<br />

hozzárendelve, míg a global DB-k adataihoz minden blokk hozzáfér,<br />

FC: paraméterekkel hívható funkcióblokk, FB-ből vagy OB-ból hívható, tárolt<br />

adatai minden híváskor újrainicializálódnak,<br />

FB: az FC-hez hasonló, de lehet értéktartó változója, a hozzárendelt DB-nek<br />

köszönhetően,<br />

SFC: zárolt rendszer FC, meghívható, de a kódja nem tekinthető meg,<br />

SFB: SFC-hez hasonló, de egy instanz DB-t kell hozzárendelni,<br />

UDT: felhasználó által definiált változó,<br />

VAT: változók követésére, állítására alkalmas, (további ismertetés a 3. és 4. fejezet<br />

egyes részeiben található).<br />

A félév során kapott feladatokat LAD (ladder diagram) nyelven oldottam meg, ez a<br />

grafikus rendszerű nyelvek közé tartozik. A létradiagram az áramúttervből alakult ki,<br />

szükségességét a relés hálózatok tervezéséhez értő szakemberek könnyebb átképzése<br />

indokolta. Az áramútterven a tápfeszültség párhuzamos vezetékei közé rajzoljuk a<br />

kapcsolást alkotó elemeket, ezek soros vagy párhuzamos kombinációit. A vezérelt és<br />

vezérlő elemek (pl. relé) nem feltétlenül egymás mellett helyezkednek el, inkább a<br />

működési sorrendben. Ezek a tulajdonságok a létradiagramra is igazak, de ez utóbbi csak<br />

logikai egyenletek leírására szolgál. Főbb elemcsoportjai: logikai, összehasonlító,<br />

számlálási, időzítési, számítási, ugrási vagy egyéb műveleteket megvalósító elemek.<br />

Létradiagram esetén az áramutakat (a „létra fokait”) két függőleges egyenes között<br />

ábrázoljuk vízszintesen, a bal oldali vezetékre csak logikai feltételen keresztül<br />

csatlakozhatunk. A LAD programozás lépései: bemeneti-kimeneti összerendelési táblázat<br />

készítése, logikai egyenletek meghatározása, létradiagram létrehozása, szimuláció.<br />

3. A fejlesztőkörnyezet ismertetése<br />

A félév során a cégnél kapott fejlesztőkörnyezetet használtam. Ehhez szükség volt egy<br />

virtuális gép telepítésére, amin Windows XP operációs rendszer fut. A virtuális gépre<br />

telepített fejlesztőkörnyezetet tulajdonképpen három program alkotja: SIMATIC<br />

Manager, S7-<strong>PLC</strong>SIM és SIMATIC WinCC flexible 2008. Ezeket lehet használni a<br />

SIEMENS <strong>PLC</strong>-kre való fejlesztéshez.<br />

A SIMATIC Manager-ben folyik a program megírása. Itt a File/New gombra kattintva<br />

készíthetünk új projektet, ami a név megadása után létre is jön. Következő lépés a hardver


kiválasztása. Jobb kattintás a projektre, majd Insert New Object/SIMATIC 300 Station.<br />

Más lehetőségek is vannak, pl. S 400 Station, de a félévi munkához a 300-as bőven<br />

elegendő. Miután megjelenik a hardverünk, a menüjében meg kell határozni a<br />

konfigurációt. Elsőként a SIMATIC 300/Rack-300-ból a Rail elemre van szükségünk, ami<br />

a korábban említett sínnek felel meg moduláris <strong>PLC</strong>-k esetén. A félév során egyetlen<br />

modult használtam, a CPU egységet (CPU 315-2 PN/DP). További beállításokra nem volt<br />

szükség. A SIMATIC Manager oldalsávjában már láthatjuk a projekten belül a hardvert,<br />

valamint a programot (S7 Program), ezen belül a külső forrásokat (Sources) és a<br />

blokkjainkat (Blocks). A fejlesztés során gyakran használandó szimbólumtábla az S7<br />

Programon belül érhető el. A szimbólumok használata sok előnnyel jár. Felvehetünk ide<br />

változókat, a nevükkel, címükkel, típusukkal, és kommentezhetjük őket. A<br />

szimbólumtáblában szereplő változókat bármikor használhatjuk a nevükkel. Ha<br />

szeretnénk, a LAD nyelvű programban a használt változóknak láthatjuk a nevét, címét, és<br />

a hozzájuk fűzött megjegyzéseket (beállítható, hogy pl. csak a nevük látszódjon). A<br />

szimbólumtáblában a létrehozott DB-k és VAT-táblák is megjelennek. Egy megfelelően<br />

elkészített szimbólumtábla nagyban növeli a program áttekinthetőségét, valamint a<br />

fejlesztést is megkönnyíti. A Blocks-on belül jobb kattintással hozhatunk létre új blokkot<br />

(Insert New Object, majd a típus kiválasztása, pl. Function Block). A félév során a LAD<br />

nyelvet használtam ez az új blokk létrehozásánál beállítható. Egy blokkot megnyitva<br />

láthatóvá válik a LAD program, az oldalsávból kiválaszthatjuk az elemeket és dupla<br />

kattintással vagy húzással elhelyezhetjük őket. Egy elemre kattintva az F1 gomb<br />

megnyomásával használható segítséghez jutunk. A legalapvetőbb feladatokat kivéve, egy<br />

blokkban több hálózatot (Network) is létrehozunk, ezeket elnevezhetjük,<br />

kommentezhetjük. Amint kész vagyunk a programmal, következhet az ellenőrzés,<br />

hibakeresés, ehhez szimulációra van szükség, amit a SIMATIC Managerből indítható<br />

S7-<strong>PLC</strong>SIM szimulációs programmal végezhetünk.<br />

A szimulációs program indulásakor ki kell választani a kapcsolat típusát (pl. MPI(1) addr:<br />

2). Ezt követően a SIMATIC Managerben a <strong>PLC</strong>/Download segítségével letölthetjük a<br />

programunkat a szimulált eszközre. (Gyorsgomb az eszköztáron: ). A felugró<br />

üzenetekre értelemszerűen kell válaszolni, pl. tartalom felülírása a virtuális <strong>PLC</strong>-n. A<br />

futást a RUN-P-vel indíthatjuk. Amint fut a szimuláció, többféleképpen is<br />

monitorozhatjuk a működést a változóinkon keresztül. Egyrészt a szimulációs program is<br />

használható a változóink megfigyelésére, illetve futás közbeni módosítására. Van egy<br />

használhatóbb eszköz is, a VAT-tábla. A VAT-táblát a blokkokhoz hasonlóan hozhatjuk<br />

létre. Itt megadhatjuk, melyik változókat szeretnénk látni, vagy éppen azt, hogy értéküket<br />

milyen formátumban lássuk. A VAT-tábla használatára az első feladat leírásánál láthatunk<br />

példát. A félévi munka során a szimulációs program, illetve a VAT-tábla által nyújtott<br />

ellenőrzési lehetőségeket keveset használtam, ugyanis minden feladathoz készítettem<br />

HMI felületet is, ami még átláthatóbbá tette a programok működését, és könnyebbé az<br />

ellenőrzést.<br />

A SIMATIC WinCC flexible 2008 programmal HMI (human-machine interface) felületet<br />

készíthetünk a programhoz. Ez mind ellenőrzéshez, mind szemléltetéshez sokkal<br />

hasznosabb, mint a VAT tábla, vagy a szimulátor lehetőségei. Természetesen a<br />

szimulátornak futtatnia kell a programunkat, miközben a működést a HMI felületen<br />

ellenőrizzük. A WinCC-ben a Project/New gombbal hozhatunk létre új projektet. Ki kell<br />

választanunk az eszközt, pl. Multi Panels/270/MP 270 10" Touch. Amint ez megtörtént,


megjelenik a HMI felület alapja, valamint a Tools és a Project oldalsáv. A Project sávban<br />

először a Connections segítségével beállítjuk a kapcsolatot. Itt megadhatjuk a kapcsolat<br />

nevét, és be kell állítani a hardver felépítését (pl. azt, hogy a CPU a tartó (rack) melyik<br />

slotjában van). Ezt követően a Tags táblázatába fel kell vennünk azokat a változókat,<br />

amikre szükségünk van a HMI felület létrehozásához, bővítésre később is van lehetőség.<br />

Ezzel létrehoztunk minden szükséges kapcsolatot, beállítottuk az eszközöket, felvettük a<br />

változókat, felépíthetjük magát a HMI felületet. Az elemeket a Tools menüből<br />

választhatjuk ki. Az elemek tulajdonságait sokféleképp változtathatjuk, vannak elemtől<br />

függő speciális lehetőségek is, pl. input mezők. Többek között kiválaszthatjuk a színt,<br />

méretet, orientációt, láthatóságot, elhelyezési szintet (Layer, használatát lásd az utolsó<br />

feladatnál). Vannak változóhoz kapcsolható tulajdonságok, ilyen a szín megváltoztatása, a<br />

villogás, vagy épp az érték kijelzése. A beállítások megtétele egyszerű, nem igényel külön<br />

magyarázatot.<br />

A félévi munka során –mivel a hangsúlyt a LAD nyelv, és a HMI felület lehetőségeinek<br />

minél jobb megismerése kapta– nem tértünk ki a különböző kapcsolatok, eszközök<br />

részletes megismerésére, optimális kiválasztására. Ezeket a céges konzulensem javaslatát<br />

követve határoztam meg.<br />

4. Első feladat: shiftelés<br />

A <strong>PLC</strong>-kel, és a fejlesztőkörnyezettel való megismerkedés után kaptam egy egyszerű<br />

feladatot, ezt a többi évfolyamtársamnak is meg kellett csinálni, akik a cégnél végezték az<br />

önálló laboratóriumot. A feladat az volt, hogy kétbájtnyi területet töltsünk fel 15 db<br />

nullával és egy db egyessel. Egy gombnyomás hatására egyel el kellett shiftelni az egyest,<br />

és a pozícióját kijelezni egy hétszegmenses számjegy segítségével. Ennek a vezérlését<br />

szegmensenként kellett megoldanunk. Egyéb kikötés nem volt, a saját ötleteink<br />

segítségével kellett megvalósítani a feladatot. A kész feladathoz VAT táblát, és HMI<br />

felületet is kellet csinálni, hogy a megfelelő működést ellenőrizni lehessen.<br />

Az új ismereteim alapján gyorsan eldöntöttem, hogy a program szerkezete milyen legyen.<br />

Az OB1-ből hívok egy FB-t (FB1) és a hozzá rendelt DB (DB1) tartalmazza a 16 bitet,<br />

amit egy wordben tárolok. A word típusú, 15 db nullát és egy db egyest tartalmazó<br />

változót bitsornak neveztem (továbbiakban így hivatkozok rá). A bitsor kezdőértéke:<br />

00…01. Egyrészt a word típus mérete megfelelő, másrészt könnyű<br />

shiftelni. Ehhez egy beépített elemet, a „Shift Left Word” (SHL_W)<br />

blokkot lehet használni. Ez lényegében N-nel balra shifteli a kapott<br />

word bitjeit. Az alsó biteket pedig nullákkal tölti fel, ez kisebb<br />

problémát okoz, megoldását alább bemutatom. Az egység<br />

2. ábra: SHL_W<br />

blokk<br />

megismeréséhez a beépített helpet használtam. A nyomógomb<br />

felfutó éle engedélyezi a shiftelést, N-re egy konstans 1-et kötöttem,<br />

mert mindig csak egyel shiftelek, az IN és OUT lábakra pedig a<br />

bitsort. Ezt még egy MOVE blokk követi, ami még megvalósít egy<br />

word-int konverziót, erre később a CMP blokknál lesz szükség. Ezzel tulajdonképpen<br />

elkészült a feladat első része, gombnyomásra shiftelhetjük a bitsort, aminek az értéke int<br />

típusú változóban is tárolódik (intsor), így könnyen felhasználható lesz a kijelzéshez.


Következő lépés a hétszegmenses kijelző vezérlése. Az ábrázolás tervezésénél megfordult<br />

a fejemben, hogy a 9-nél nagyobb számok esetén csak a kisebb helyiértéket írom ki, és a<br />

pontot használom a megkülönböztetésre. Végül azonban a hexadecimális ábrázolás<br />

mellett döntöttem, tehát az 1 értékű bit pozícióját a 0-F tartomány elemei adják. A kijelző<br />

vezérléséhez összesen 8 bitre lesz szükségünk, ezt egy byte típusú<br />

változóba (vez) írom be, az egyes helyétől függően. A vez bitjei<br />

egy-egy szegmensnek felenek meg (lásd 3. ábra). Az egyes<br />

helyének meghatározását a következőképpen oldottam meg. A<br />

bitsort már előzetesen átmásoltam az intsorba, így rendelkezésre<br />

áll int típusban is. Ennek lehetséges értékei pedig épp kettő<br />

hatványai, hiszen csak egy db egyest tartalmaz. A 16 lehetséges<br />

érték miatt 16 összehasonlító (CMP) blokkot alkalmaztam. Az IN1<br />

bemenetükre az intsort, az IN2 bementekre pedig 2 megfelelő<br />

hatványát írtam (1-től 16384-ig, és az int definíciója<br />

3. ábra: szegmens<br />

felosztás<br />

miatt -32768-at). Ha valamelyik CMP blokk kimenete igaz lesz, engedélyeződik az adott<br />

MOVE egység, és egy előre meghatározott konstanst ír a vez változóba. Ezt a konstanst<br />

az alapján határoztam meg, hogy mit szerettem volna látni a kijelzőn. Pl. ha az intsor<br />

kettővel egyenlő, ez azt jelenti, hogy a bitsor egyese az 1. helyen van (a számozás nullától<br />

indul!), ezért egy egyest kell mutatnia a kijelzőnek. Ehhez a vez értéke binárisan<br />

00000110, ami decimálisan 6, tehát ez kerül a vez változóba. Végül meg kellett oldanom<br />

azt, hogy az 10…00 shiftelése után a bitsorban csupa nulla lesz. Így az ehhez tartozó<br />

gombnyomásra egy csupa 0 helyzet jön létre. Sikerült úgy megoldanom a problémát,<br />

hogy az F érték utáni gombnyomásra rögtön a 0 érték jöjjön. Ehhez szükség volt még egy<br />

CMP egységre, ami a nullával való egyenlőséget vizsgálja. Ennek hatására (ha logikai 1<br />

lesz a kimenete) a bitsorba egyet írunk, a vez-be pedig az ennek megfelelő vezérlést.<br />

Nincs tehát érvénytelen, csak nullákból álló bitsor egyik ciklus végén sem.<br />

Miután elkészültem a programmal, a helyes működést először egy VAT-tábla segítségével<br />

ellenőriztem le. Természtesen ennek készítése párhuzamosan folyt a program<br />

4. ábra: a kijelző vezérlésének részlete<br />

készítésével, hiszen segítségével követhető a működés, és kiszűrhetők az esetleges hibák.<br />

Mivel a HMI felülethez képest kevésbé szemléletes, a továbbiakban csak a hibakeresés<br />

egyik módjaként használtam, és nem feltétlenül hoztam teljesen kész állapotba, mikor<br />

elkészült a program. A VAT-tábla létrehozását a 3. fejezetben ismertettem. Egy változó<br />

felvételéhez csak be kell írni a táblázat következő sorába a változó címét, vagy nevét,<br />

majd a monitor value-vel (szemüveg rajz az eszköztáron) monitorozhatjuk a változót,<br />

valamint az is látszik, hogy fut a <strong>PLC</strong>. Új értéket a modify value oszlopba írhatunk,<br />

érvényesítéséhez a modify variable gombra kell kattintani. A gomb megnyomását például


úgy tudjuk szimulálni, hogy a nyomva sorában az utolsó oszlopba egyet írunk, és a<br />

modify variable gombra megyünk.<br />

5. ábra: VAT-tábla használata<br />

Végül a HMI felület készítését és működését ismertetem. A kapcsolat létrehozása után<br />

felvettem a bitsor, nyomva, és kimenet tageket, a kapcsolat és a cím megfelelő<br />

beállításával. A gombhoz egy Button elemet használtam, felirata: „Shiftelj!”. Az event<br />

menüben pedig a Press eseményre SetBit: ’nyomva’ következik, Release-re pedig<br />

ResetBit: ’nyomva’. Tehát a gomb lenyomásával egybe, elengedésével nullába állítjuk a<br />

’nyomva’ változó értékét. Ezenkívül létrehoztam 16 db majdnem azonos tulajdonságú kis<br />

négyzetet. Ezek akkor lesznek zöldek, ha a bitsor hozzájuk rendelt bitje 1. Sorba rakva<br />

őket, láthatjuk az 1 db egyes mozgását a bitsorban. A digitális számot egyenesekből<br />

hoztam létre. Piros színűek, a láthatóságuk függ a ’vez’ megfelelő bitjének értékétől. A<br />

HMI összerakása után az eszköztár Start Runtime System gombbal próbálható ki a<br />

működés. A shiftelős feladat leírását néhány HMI képpel zárom.


6. ábra: A shiftelés HMI felülete<br />

5. Második feladat: folyadékkeverés<br />

A shiftelős feladat befejezése után mindenki különböző feladatokat kapott. Nekem egy<br />

szakaszos üzemű folyadékkeverő berendezés vezérlését kell megoldani, a technológiai<br />

feladat két különböző folyadék összeelegyítése, és adott hőmérsékletre melegítése. A<br />

feladat illusztrálására a 7. ábra szolgál, ami a későbbi HMI felület részlete. Az összes<br />

többi, félév során megoldott feladat erre épül. Most csak az alapfeladatot ismertetem, a<br />

további bővítéseket a következő fejezetek feladatleírásai tartalmazzák. Az alapfeladat a<br />

következő: A berendezés szakaszos üzemben működik. Alapállapotban a tartály üres, a<br />

szelepek zárva vannak. A START nyomógomb megnyomására az MSZ1 nevű<br />

mágnesszelep nyit, az első folyadék beáramlik a tartályba. Ha az S2 szintérzékelő jelez,<br />

az MSZ1 szelep bezár, az MSZ2 szelep kinyit. Ekkor bekapcsol a keverés is, tehát már<br />

keverünk, miközben a 2. folyadék beáramlik. Ha megtelik a tartály (az S3 jelez), bezár az<br />

MSZ2, a keverés mellé pedig a fűtés is bekapcsol. Ha a tartályban lévő folyadék<br />

hőmérséklete elérte a kívánt értéket, jelez az S4 hőmérsékletérzékelő. Leáll a keverés és a<br />

fűtés, és kinyit az alsó mágnesszelep (MSZ3). Ha a tartályból kiürült a felmelegített


keverék, a START jelre elölről indulhat a<br />

folyamat. A kijelzőn található négy LED, amik azt<br />

jelzik, hogy épp melyik szakaszban van a<br />

folyamat. Látható, hogy a feladat már komolyabb<br />

logikát igényel, valamint a valósághoz is közelebb<br />

áll, mint az első feladat, és a félév során ez egyre<br />

inkább igaz lett, ahogy a működést fejlesztettem.<br />

A feladat megoldását egy szimbólumtábla<br />

létrehozásával kezdtem. A feladattal együtt a<br />

változók címét, logikai összerendelését is<br />

megkaptuk. Ahogy haladtam a feladat bővítésével,<br />

ugyan néhányat ezek közül nem, vagy módosított<br />

működéssel használtam fel, mindenesetre a<br />

nagyrészüket beleírtam a szimbólumtáblába. A<br />

szimbólumtáblát úgy tudom ismertetni a 7. ábra: a folyadékkeverő illusztrálása<br />

legegyszerűbben, ha megmutatom, továbbá fűzök<br />

hozzá néhány magyarázatot. A Symbol oszlop a szimbólumok nevét, az Address a<br />

címüket, a Data Type pedig a típusukat tartalmazza. A Commentbe megjegyzéseket írtam,<br />

néhányat részletesebben is kifejtek itt. A 6-19. sor tartalmazza a feladat által specifikált<br />

változókat, amiket az alapfeladat igényel. A FUT a fűtés, a KEV a keverés irányítására<br />

szolgál, a LEPn változók a kezelőfelületen található négy LED-et vezérlik, az MSZn<br />

változók pedig a mágnesszelepeket. A bekapcsoláshoz, illetve szelepnyitáshoz 1-et kell<br />

írni a címükre. Az S1, S2, S3 szintérzékelőktől, az S4 pedig a hőmérsékletérzékelőtől<br />

érkező jelek bemenetei. Az S1 akkor 1 értékű, ha üres a tartály, az S2 és S3 akkor, ha a<br />

folyadék elérte őket (a tartály félig, ill. tele van). Az S4 értéke pedig, akkor 1, ha<br />

felmelegedett a folyadék.<br />

8. ábra: Szimbólumtábla a folyadékkeveréses alapfeladathoz


A feladatok megoldásához belső változókat is felvettem, amik szintén megtalálhatók a<br />

szimbólumtáblában (AA, BB, CC, DD, EE). Értékük 1, ha épp az adott állapotban<br />

vagyunk, egyébként 0. AA állapotban a tartály üres és minden szelep be van zárva. BBben<br />

az MSZ1 nyitva van, az első folyadék folyik be. CC-ben csak az MSZ2 van nyitva a<br />

szelepek közül, a keverést is bekapcsoljuk. DD-ben melegítjük a keveréket, EE-ben pedig<br />

leengedjük. Láthatjuk, hogy ha egymást követik ezek az állapotok a működés során, akkor<br />

megvalósul a feladatkiírás szerinti működés.<br />

A programot az OB1 tartalmazza. Ahogy elindítjuk a futást, elvileg minden változó<br />

logikai 0-ban van. Ez azonban nem megfelelő, mert AA, és S1 logikai 1 kell, hogy<br />

legyen. Ezt mégy egy kezdeti 0 ellenőrzéssel is összekötöttem, tehát ha minden változó<br />

értéke 0 (bekapcsolás után), az AA-t és S1-et 1-be állítom. A program szerkezete a<br />

következő: Az első szakaszban (Network 2-6)<br />

az állapotátmeneteket valósítom meg (pl. lásd<br />

9. ábra). Az új állapotot mindig 1-be állítom, a<br />

régit 0-ba. AA állapotból a START<br />

megnyomására kerülünk BB-be. CC-be az S2<br />

jelzésére jutunk, mivel ha a tartály félig<br />

megtelt, akkor engedhetjük a második<br />

folyadékot. S3 jelére, ha a tartály megtelt, DD<br />

9. ábra: AA-BB állapotátmenet<br />

állapotba jutunk, S4 jelére pedig EE-be. Végül<br />

ha kiürült a tartály, S1=1-re kerülünk vissza az<br />

AA alapállapotba. A második szakaszban (Network 7-11) az aktuális állapotnak<br />

megfelelő működés valósul meg. A korábban ismertetett működésnek megfelelően itt<br />

történik a szelepek, a fűtés, keverés és a LED-ek vezérlése, BB-LED1, CC-LED2,<br />

DD-LED3, EE-LED4 párosítással. Például a BB állapotnál egy BB=1 feltétel után az<br />

MSZ1-et és a LED1-et 1-be állítom.<br />

A működés ellenőrzéséhez –valódi érzékelő jelek hiányában– nekünk kell az S1-S4<br />

változókat futás közben állítgatni ahhoz, hogy egyik állapotból a másikba jussunk. (Erre a<br />

következő fejezet kínál megoldást). Ehhez a feladathoz is készítettem HMI felületet. Ez<br />

tartalmazza az elrendezés vázlatát, a felhasználó által látható felületet (4 LED és START<br />

gomb), valamint az ellenőrzéshez szükséges állapotjelzéseket, és az érzékelők<br />

értékbeállításának lehetőségét. A tartály, a szelepek, a fűtőtest és a keverőberendezés<br />

elemeit a Symbol Library-ből illesztettem be, a többi elem megtalálható Simple Object<br />

menüben. A szelepeket a nekik megfelelő bit vezérli, zárt állapotban pirosak, nyitottban<br />

zöldek. A keverő és fűtő berendezések kikapcsolt állapotban szürkék, a keverés<br />

bekapcsolva zöld, a fűtés pedig piros. Az érzékelőket úgy oldottam meg, mintha a<br />

tartályon kémlelőnyílások lennének, ennek megfelelően kékek, ha van folyadék a<br />

szintjükön. Ez az S1 esetén 0-t jelent (hiszen akkor 1, ha üres a tartály), S2 és S3 esetén<br />

1-et. Az S4 világoskék, ha nem jelez („hideg”), és piros, ha jelez. A LED-ek és<br />

állapotvisszajelzések, valamint a START gomb működése magától értetődik. Az<br />

állapotok beállítására pedig switcheket használtam, működésük szintén egyszerű.


10. ábra: részletek a működésből (HMI)<br />

6. Harmadik feladat: szimuláció<br />

Az előző feladat programjának futtatásakor elég kényelmetlen volt, hogy az érzékelőket<br />

kézzel kellett állítgatni. A folyadékkeverős feladat első kiegészítéseként ezért írtam egy<br />

szimulációs modult. A cél az volt, a START gomb lenyomására egy üzemi ciklus minden<br />

további beavatkozás nélkül végigfusson. Ezen kívül a korábbi kézi lehetőséget<br />

fenntartottam, így ki/bekapcsolható szimulációt hoztam létre.<br />

Első lépésként végiggondoltam, hogy mi történik egy valós elrendezésnél.<br />

Tulajdonképpen egy olyan idődiagram létrehozása volt a célom, ami jól tükrözi a valódi


érzékelőjelek beérkezésének sorrendjét. Ezt követően már „csak” egy FC-t kell létrehozni,<br />

ami ezt megvalósítja. Először az S1 vált nullába (a tartály nem üres), majd az S2 1-be, ezt<br />

követően pedig az S3, így „telítődik a tartály”. Ezután „felmelegszik a folyadék”, S4=1<br />

lesz. A leengedéskor a hőmérő elhelyezkedését figyelembe véve először S3, majd S2, S4,<br />

és végül S1 vált vissza. A pontos idődiagramot a 11. ábra mutatja, egy osztás egy<br />

másodpercnek felel meg.<br />

11. ábra: A szimuláció idődiagramja<br />

Annak érdekében, hogy a szimulációt szétválasszam a program működésétől, egy külön<br />

FC-ben valósítottam meg, amit az OB1-ből hívok. A további fejlesztési fázisokban is<br />

ügyeltem arra, hogy az érzékelők jeleit csak az FC állítsa, maga a program (az OB1) ne<br />

férjen hozzájuk. A szimuláció vezérlésére felvettem egy új szimbólumot (SZIM), ennek 1<br />

értéke engedélyezi a szimulációt, ez a feltétele az FC meghívásának. A START<br />

megnyomására a szimuláció automatikusan elindul. Az FC-t két network alkotja. A<br />

Network 1 a telítődést, és<br />

melegedést szimulálja, a<br />

Network 2 pedig a leeresztést.<br />

Mindkét network négy timer<br />

egymás után kapcsolásából áll.<br />

Több timer típus is<br />

rendelkezésünkre áll, én az<br />

S_ODTS típusút választottam.<br />

Működését az F1<br />

12. ábra: Hívási szerkezet<br />

megnyomására megjelenő<br />

Help menü ismerteti. Ha az S<br />

bemenetén 0-1 átmenet<br />

következik be, elindul a<br />

számlálás, és egy (szintén a<br />

bemeneten megadható) idő<br />

múlva 1-be vált a kimenet. Ez egy késleltetést jelent, ami megfelelő a feladathoz, hiszen<br />

az érzékelők egymás után váltanak (lásd. 11. ábra). Van egy reset bemenet is, ha itt 0-1<br />

átmenet következik be, a kimenet nullába vált. A késleltetés értékét a TV bemeneten<br />

állíthatjuk be, ez S5Time típusú értéket vár. Ezt szintén megismerhetjük a Help menü<br />

segítségével, 1 másodpercet ’S5T#1s’ alakban állíthatunk be. A hívási szerkezet (12.<br />

ábra) alapján látható, hogy a program minden ciklusban belép az FC-be. Ha az egyik


timer számlálása elindul, a futás nem várja meg, hogy ez befejeződjön, hanem minden<br />

ciklusban „ránéz” a timerre, hogy lejárt-e a megadott idő. Az idődiagram<br />

megvalósításának részletét a 13. ábra mutatja. Ha a START jelre AA-ból BB-be jutottunk,<br />

telítődik a tartály: 1s múlva S1 nulla lesz (már nem üres), további 4s múlva S2 1-be vált,<br />

stb., mindig azt az időt adtam meg, aminek az egyik váltástól a másikig el kell telnie. A<br />

változásokat az OB1 dolgozza fel. S1 váltására épp nem történik semmi, azonban ahogy<br />

az S2 egy lesz, átkerülünk a CC állapotba. A Network1-ben az utolsó váltás a S4 egybe<br />

kapcsolása („felmelegedett” a keverék). Ennek hatására EE-be kerül a rendszer, és<br />

kezdődik a leeresztés, amit a Network2 szimulál. Az EE hatására a Network1 minden<br />

timere resetelődik. A leeresztés érzékelőjeleinek generálása hasonlóan működik, itt AA<br />

reseteli a timereket. Amint visszaérünk AA-ba, az érzékelők is alapállapotban vannak, a<br />

START megnyomására indul az újabb üzemi ciklus.<br />

13. ábra: A szimulációs FC részlete<br />

A HMI felületen is végeztem módosításokat, megjelent a SZIM-hez tartozó switch, így ki<br />

lehet kapcsolni, és akár kézzel is állíthatjuk az érzékelőket, mint az előző feladatnál. Ezen<br />

kívül az állapotkijelzők mellé egy újabb kijelző került, ami a SZIM aktuális állapotáról ad<br />

információt. Ezek persze nem tartoznak az előírt felhasználói felülethez, hiszen a program<br />

belső működésével kapcsolatosak, a működés ellenőrzéséhez, befolyásolásához<br />

szükségesek. Egyéb változtatást nem igényelt a feladat.<br />

14. ábra: A szimulációs feladat HMI-je


A feladat megoldása közben gyakoroltam az FC hívást, megismertem több timer<br />

működését is (ahhoz, hogy a megfelelőt kiválaszthassam), és létrehoztam egy szimulációt,<br />

aminek hatására a programom már „külső” érzékelő jeleket kezel.<br />

7. Negyedik feladat: Hibakezelés I.<br />

A folyadékkeverős feladat eddigi lépéseiben nem foglalkoztam azzal, hogy milyen hibák<br />

fordulhatnak elő működés közben, és ezeknek milyen hatása lesz a program futására. Egy<br />

ipari berendezésnél azonban fontos a hibák megfelelő kezelése, hiszen egy érzékelő<br />

elromlása nem okozhatja a rendszer összeomlását. A valóságban gyakran sérülésveszély,<br />

akár robbanásveszély is fennáll hibás működés esetén, a hibatűrő képesség<br />

meghatározására normákat hoztak létre, ezek meghatározzák, a rendszerrel szemben<br />

támasztott követelményeket.<br />

Első lépésként végiggondoltam, hogy a folyadékkeverés esetén milyen hibák léphetnek<br />

fel. Ezeket több típusba lehet sorolni, a program képes megkülönböztetni őket, a<br />

továbbiakban részhibaként hivatkozok rájuk. A szimbólumtáblában új változókat vettem<br />

fel minden részhibához, értékük akkor egy, ha fennáll az adott hiba, elnevezésüket (csupa<br />

nagybetűvel) és leírásukat a fejezet következő része tartalmazza. A szintérzékelők<br />

meghibásodása folytán láthatunk fizikailag nem létező szintállapotokat, pl. az S3 (felső)<br />

érzékelő jelez, az S2 (középső) nem. Az ilyen típusú hibákat SZINTHIBA-nak neveztem<br />

el, bármely hibás szintjelzés esetén ez a hibatípus lesz aktív. Vizsgálom azt is, hogy a<br />

folyamat megfelelő ütemben zajlik-e. Ennek részeként ellenőrizni kell, hogy a szelepeket<br />

sikerült-e kinyitni, vagy nem dugultak-e el a csövek. Ezt úgy tehetjük meg, hogy<br />

megadunk egy időkeretet, amin belül jeleznie kell a szintérzékelőknek. Így három újabb<br />

részhibát kapunk: MSZ1HIBA van ha S1, vagy S2 nem jelez adott időn belül,<br />

MSZ2HIBA, ha S3 nem jelez, és MSZ3HIBA, ha S1 nem lesz elég hamar újra 1 értékű<br />

(üres a tartály). Végül az S4-hez is kapcsolódhatnak hibák. Egyrészt hibát okoz, ha S4<br />

magas hőmérsékletet jelez AA, BB és CC állapotokban, hiszen ekkor még be sem<br />

kapcsolt a fűtés (S4HIBA). FUTESHIBA-t kapunk, ha a fűtés bekapcsolása után S4 nem<br />

jelez adott időn belül. Ha a leengedéskor a meleg folyadék elhagyja az S4 érzékelőt,<br />

ennek le kell hűlnie, ha ez nem történik meg elég gyorsan, HULESHIBA-t okoz. Tehát<br />

összességében 7 db részhibát különböztettem meg.<br />

Ami a program működését illeti, ennél a feladatnál a szimulációs FC-t változatlanul<br />

hagytam. Hívásán pedig annyit változtattam, hogy a SZIM kikapcsolódik, ha végigért egy<br />

üzemi ciklus. Szimulációra tehát továbbra is van lehetőségünk, azonban hibák esetén még<br />

nem működik megfelelően, ezt az utolsó feladatban oldottam meg (következő fejezet.).<br />

Továbbá létrehoztam egy globális DB blokkot. Ennek szerepét és az OB1 módosításait a<br />

következő bekezdések tartalmazzák.<br />

Bármelyik részhiba 1 értéke esetén bekapcsolódik<br />

a HIBA állapot (értéke 1, ha van hiba). Ez<br />

általánosságban jelzi a hibát, mellette azonban a<br />

hiba bekövetkeztekor fennálló állapot továbbra is<br />

fennáll. A korábbi programszerkezetet 15. ábra: Biztonsági kiegészítés<br />

kiegészítettem biztonsági feltételekkel. Ezek<br />

szerint egyik állapotból csak akkor léphetünk egy másikba, ha nincs hiba (a normál


feltételen túl persze). Valamint az adott állapot csak akkor vezérelhet bármit, ha nincs<br />

hiba, pl. DD-ben a fűtés bekapcsolása. Hiba esetén –szintén biztonsági okból– minden<br />

szelep lezár, a keverés és a fűtés kikapcsol. A SZINTHIBA-k és S4HIBA-k vizsgálata<br />

egyszerű logikával megoldható. Nem ilyen magától értetődők azok a hibák, ahol egy<br />

maximális időn belül be kell következnie egy eseménynek. Ezt egy példán keresztül<br />

mutatom be, az összes többi fent ismertetett, időkerethez kapcsolódó részhiba figyelését<br />

hasonló módon oldottam meg.<br />

Vegyük a FUTESHIBA-t! Ez akkor lép fel, ha a DD-be kerülés (a fűtés bekapcsolása)<br />

után egy adott idő leteltével sem kapunk jelzést az S4-től. A korábban ismertett S_ODTS<br />

timert a DD=1 esemény indítja, ha lejár a megadott idő, és még mindig nem jelzett az S4,<br />

fűtéshiba van. Ha ez fellép, vagy sikeresen továbbjutottunk az EE-be, lenullázzuk az<br />

időzítő kimenetét. Látható, hogy a TV bemenetre most nem egy konstans érték került. A<br />

kapott feladat szerint ugyanis minden egyes<br />

időtartamnak paraméterként megadhatónak kellett<br />

lennie. Ennek érdekében létrehoztam egy global<br />

DB-t, ami megfelelő számú, S5Time típusú adatot<br />

tartalmaz. Ezeket az alapján neveztem el, hogy<br />

melyik időzítő paramétereként szolgálnak (pl.<br />

T12_param). Rendelkeznek egy inicializálási<br />

értékkel, aminek értékét úgy választottam meg,<br />

hogy nagyobb legyen, mint a szimuláció által<br />

16. ábra: FUTESHIBA vizsgálata<br />

időzítővel<br />

használt időzítések. Például a szimuláció szerint az<br />

MSZ1 nyitása után 5 másodperc múlva jelez az S2,<br />

ezért az MSZ1HIBA-nál 10 másodperc az időkeret. Így a szimuláció alapállásban hiba<br />

nélkül végig tud futni. Az inicializált kezdőértékhez a View/Data view, majd ezt követően<br />

az Edit/Initialize Data Block beállításokat meg kell tenni. Az OB-ben az időzítő számára a<br />

képen látható formátumban érhetők el a paramérek: "DB1".T13_param. Ezzel<br />

rendelkezésre állnak az állítható időkeretek. Teszteléskor ezeket elég kicsi értékre<br />

átállítva könnyedén generálhatjuk bármelyik időkeretre alapuló részhibát.<br />

Végül meg kellett oldani, hogy hiba<br />

esetén valahogyan tovább működhessen<br />

a<br />

a rendszer. Erre ideiglenes<br />

megoldásként a TOVABB gombot<br />

használom. A probléma komolyabb<br />

megoldását a következő fejezet<br />

tartalmazza. A gombnak csak akkor van<br />

szerepe, ha hiba áll fenn, és nem az<br />

alapállapotban<br />

vagyunk. 17. ábra: A TOVABB működésének részlete<br />

Tulajdonképpen egy kényszerített<br />

továbblépést valósít meg. Szerepe az, hogy hiba esetén vissza tudjunk térni az<br />

alapállapotba, hogy újabb üzemi ciklust kezdjünk a hiba elmúltával. Felfutó élére, ha hiba<br />

van a következő állapotba lépünk. Az állapottal járó dolgok azonban nem valósulnak<br />

meg, mert hiba van (pl. nem fog bekapcsolni a keverés, ha így jutunk CC-be). Amikor az<br />

EE állapotból váltunk AA-ba, akkor pedig minden hibajelet (a részhibákat is)<br />

megszünteti.


A HMI felületet is továbbfejlesztettem. A részhibákkal együtt már nagyon zavarossá<br />

váltak a kapcsolók, illetve visszajelzők, ezért keretekkel három részre tagoltam a felületet:<br />

a technológiai elrendezés modelljére, a felhasználó által látott felületre, illetve a<br />

teszteléshez szükséges, belső állapotokat is visszajelző felületre. Nem tudtam megoldani<br />

az S5Time típus megfelelő kijelzését, decimális értékként írattam ki, „dekódolását” az<br />

input mezők melletti szöveg segíti. Hiba esetén a HIBA és a megfelelő részhiba pirosan<br />

világít. Ezen kívül természetesen még egy nyomógombot is elhelyeztem a TOVABB<br />

számára. Az első HMI képen a normál működés részlete látható, bekapcsolt szimuláció<br />

mellett. A második képen egy MSZ1HIBA látható, amit úgy lehetett létrehozni, hogy az<br />

s2max paramétert átírtam a 3 másodpercnek megfelelő 768-ra, ami kisebb mint a<br />

szimulációs 5 másodperc, így az S2 nem váltott az időkeretén belül, ami hibát okozott. A<br />

harmadik képen pedig egyszerűen átálítottam az S3-at, így lehetetlen szintjelzés alakult<br />

ki.


18. ábra: HMI képek a hibakezelés első verziójához<br />

A hibakezelés első verziójának készítése közben végig az a gondolat vezérelt, hogy hiba<br />

esetén jussunk biztonságos állapotba. A hibát követően ne kapcsolhassunk be semmit,<br />

csak tudjunk eljutni az alapállapotba, ahol javítjuk a hibát, és ezt követően új ciklust<br />

kezdünk. Ez egyfajta védekező mechanizmus, ennél hatékonyabb hibakezelést ismertet a<br />

következő fejezet.<br />

8. Ötödik feladat: Hibakezelés II.<br />

Bár az előző feladat már tudta kezelni a hibákat egy bizonyos szinten, még sok<br />

kisebb-nagyobb javításra szorult. Ezek közül a legfőbb dolog a nyugtázás bevezetése. Ez<br />

már közelebb áll a valósághoz. Általánosságban, ha hiba keletkezik, nyugtázni kell.<br />

Előfordulhat, hogy a hiba megszűnik, ekkor nyugtázásra folytatódhat a folyamat. Ha a<br />

hiba nyugtázás után is fennáll, nyugtázott hiba lesz, a javítást követően újra nyugtáznunk<br />

kell a folytatáshoz.<br />

19. ábra: Nyugtázás folyamata<br />

Ami a programot illeti, az előző verzió hiányossága volt még a szimuláció viselkedése.<br />

Megoldásra vár, hogy hibakezelés után folytatható legyen a szimuláció is.


A feladat megoldását ismét a szimbólumtábla felülvizsgálatával kezdtem. Felvettem a<br />

NYUGTAGOMB nevű bemenetet, a SZIMFOLYT változót, aminek értéke 0, ha meg kell<br />

szakítani a szimulációt. Valamint még két változót, amire szükségem volt a megoldáshoz,<br />

ezek a NYUGTAKELL és az NYHIBA. A program a következő módon működik.<br />

Bármely részhiba esetén logikai 1-be kerül a HIBA és a NYUGTAKELL. A<br />

NYUGTAKELL az a változó, ami a továbbfutást gátolja, ez mindaddig 1 értékű, amíg<br />

nem futhat tovább a program. Ha a HIBA megszűnik, a NYUGTAKELL továbbra is<br />

fennáll. Ezért addig, amíg nem nyugtázzuk azt, hogy egy ideig hiba állt fenn, nem<br />

folytatódhat a program. A NYUGTAGOMB megnyomása után ebben az esetben meg is<br />

oldottuk a hiba kezelését. Ha azonban látjuk, hogy hiba lépett fel és a nyugtázáskor ez<br />

még fennáll, nyugtázott hibánk lesz (NYHIBA). Ekkor a HIBA, NYUGTAKELL és<br />

NYHIBA érétke is 1. Ha a hibát megszüntetjük (HIBA=0, NYHIBA=1), majd<br />

nyugtázunk, folytatódhat a futás. Ahhoz, hogy ez a megoldás működjön, és a szimuláció<br />

is megszakítható majd folytatható legyen, számos kisebb változtatást kellett végeznem.<br />

20. ábra: A nyugtázás megvalósításának részlete (ha a hiba megszűnik az első nyugta előtt)<br />

A hibakezelés kivitelezését szolgáló kisebb módosítások az OB1-ben:<br />

a SZIMFOLYT változó kezdőértékét 1-be kellett állítani, hiszen a 0 értéke jelenti a<br />

szimuláció szüneteltetését,<br />

a szimuláció nem indul el automatikusan a START gombra,<br />

az állapotátmenetek feltételéhez bekerült a NYUGTAKELL=0 feltétel, hiszen most<br />

már előfordulhat olyan, hogy nincs HIBA (csak NYHIBA), de a folytatás előtt<br />

szükség van egy nyugtázásra,<br />

az időkereten alapuló részhibák időzítői csak akkor indulnak el, ha nincs szükség<br />

nyugtázásra. Ez kicsi, de fontos változtatás, hiszen egyébként az időkeret letelne,<br />

mialatt a nyugtázásra vár a program, és a folytatáskor azonnal újabb hiba<br />

keletkezne,<br />

ezen időzítők paramétereinek kezdőértékét egységesen 60 másodpercre állítottam,<br />

hogy kikapcsolt szimuláció mellett, a jelek kézi állítgatásánál ne kelljen kapkodni.<br />

(Az előző tapasztalatok alapján.),<br />

a HIBA állapot a részhibák felfutó élére kapcsol be (és nem a logikai 1 szintjükre,<br />

mint eddig). Ennek a HMI-nél lesz szerepe. Ha nyugtázott hiba van, akkor is<br />

szeretnénk látni, melyik részhiba okozta. Így nyugodtan hagyhatjuk őket<br />

bekapcsolva, a HIBA nem fog újra jelezni miattuk,<br />

a részhibák összegzésénél a HIBA-val párhuzamosan a NYUGTAKELL is<br />

bekapcsol,


a biztonsági állapotot (minden szelep zárva, fűtés, keverés kikapcsol) most a<br />

NYUGTAKELL kapcsolja be, a HIBA helyett,<br />

a tovább szerepe megszűnt, sehol sem használom (kikerült a szimbólumok közül<br />

is),<br />

ha folytatódhat a program, a részhibák kikapcsolnak.<br />

Módosítani kellett az FC-t is. Minden<br />

időzítő bemenetére további feltételként<br />

bekerült a SZIMFOLYT vizsgálata. Már<br />

említettem, hogy ennek kezdőértéke 1, ha a<br />

NYUGTAKELL 1 értékű, akkor a<br />

SZIMFOLYT 0 lesz, és akkor veszi fel újra<br />

az 1 érétket, ha a NYUGTAKELL 0-ba<br />

vált. Röviden a hiba megszűntével a<br />

szimuláció is folytatódik. Módosítottam a<br />

timerek resetelésén is a NETWORk 1-nél,<br />

korábban itt mindent az EE állapot resetelt,<br />

most pedig az n. timert tulajdonképpen az<br />

(n+1). reseteli.<br />

21. ábra: SZIMFOLYT használata az FC-ben<br />

A HMI felületen is sok változtatásra volt szükség. Az előző feladatnál a gombok körüli<br />

keretet egyenesekkel oldottam meg, ugyanis, ha egy átlátszó négyzetet helyeztem föléjük,<br />

akkor nem lehetett lenyomni a gombokat. Ezt a layerek használatával lehet megoldani.<br />

Ezek egyfajta rétegek, minden elemhez lehet rendelni egy layer szintet a beállításoknál. A<br />

kisebb szint alacsonyabb réteget jelent. A fenti problémához tehát nem kellett mást<br />

tennem, mint a gombokhoz nagyobb szintet rendelni, mint a keretet adó átlátszó<br />

téglalaphoz. A tovább gombot átírtam nyugtára. Ami a valódi gyakorlathoz való közelítést<br />

illeti, talán a legfontosabb módosítás az ábrán a színeknek a kicserélése volt. A piros színt<br />

a hiba jelzésére szokás használni. A korábbi HMI-ken viszont eddig pirossal jelöltem a<br />

zárt szelepeket, valamint az 1 értékű (meleg) S4-et és a bekapcsolt fűtőtestet. Az új<br />

színek: a zárt szelepek feketék, az S4 és a fűtőtest pedig narancssárga piros helyett. Az<br />

időzítőparaméterek tagjeinek típusát Timerre állítva, decimális számként kijelezve<br />

sikerült megjeleníteni őket úgy, hogy ténylegesen a másodperc értéket jelezzék ki. Végül<br />

a hibajelzést változtattam meg úgy, hogy nyugtázatlan hiba esetén piros-sárgán villog,<br />

nyugtázott hiba esetén pedig pirosan világít a HIBA feliratú LED. Ezt layerek<br />

segítségével oldottam meg, legalul egy HIBA esetén villogó elem van, felette egy olyan,<br />

ami csak akkor látható, ha NYHIBA van (piros), legfelül pedig szürke, ami akkor látható,<br />

ha nincs szükség nyugtázásra.<br />

A következő két képen a HMI felület szerepel, nyugtázott, illetve nyugtázatlan hiba<br />

esetén. A 22. ábrán látszik, hogy a HULmax értékét 1 másodpercre csökkentettem. Így<br />

egy HULESHIBA-t idéztem elő, mert EE-ben az S4 jelzése nem szűnt meg egy<br />

másodpercen belül. A 23. ábrán hasonló módon MSZ2HIBA-t hoztam létre, ekkor a<br />

HIBA feliratú jelzés piros-sárga színnel villog.


22. ábra: Nyugtázott HULESHIBA<br />

23. ábra: Nyugtázatlan MSZ2HIBA


9. Tapasztalatok, köszönetnyilvánítás<br />

A félév során számos, a <strong>PLC</strong>-kel és LAD nyelvvel kapcsolatos ismeretet szereztem.<br />

Ebben részben a Programozható irányítóberendezések és szenzorrendszerek tantárgy és<br />

laboratórium is szerepet játszott, de főként a féléves önálló laboratóriumi munkának<br />

köszönhető. Az egyetemi órák és a cégnél tapasztaltak alapján látom, hogy ez egy<br />

szerteágazó téma, aminek még csak az elején vagyok, de a jövőben is szívesen<br />

foglalkoznék vele. Az, hogy a témát külső cégnél csináltam, további hasznos<br />

tapasztalatokhoz juttatott. Végül ezúton is szeretném megköszönni a féléves segítséget<br />

Nagy Lászlónak, a céges konzulensemnek, aki sok hasznos tanáccsal látott el, és segített<br />

megoldani a felmerülő problémákat.<br />

Felhasznált források:<br />

1) Dr. Ajtonyi István, Dr. Gyuricza István: Programozható irányítóberendezések,<br />

hálózatok és rendszerek (Műszaki Kiadó, Budapest)<br />

2) Ajtonyi István: <strong>PLC</strong> és Scada-HMI rendszerek I. (AUT-INFO Kft., Miskolc,<br />

2007.)<br />

3) A www.ob121.com weboldalon található, témához kapcsolódó anyagok:<br />

http://www.ob121.com/plc_basic.html, http://www.ob121.com/soft_basic.html,<br />

http://www.ob121.com/hard_s7.html<br />

4) A 12. ábra forrása: http://szirty.uw.hu/misc/S7-300_programozas.pdf

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!