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 ...
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