Mérési útmutató Folyamatirányítás laboratórium Összeállította: Kovács Gábor gkovacs@iit.bme.hu Budapesti Műszaki és Gazdaságtudományi Egyetem Irányítástechnika és Informatika Tanszék 2016
Tartalomjegyzék Tartalomjegyzék Tartalomjegyzék... 2 1 Bevezetés... 3 2 Az IEC 61131-3 szabvány elemei... 3 2.1 Programszervezési egységek... 3 2.2 Változók deklarálása... 4 2.3 Strukturált szöveges programozás... 5 3 Mérési feladatok Gyártósor-modell irányítása... 7 2
Bevezetés 1 Bevezetés A mérés célja, hogy a hallgatók a Folyamatszabályozás tárgy során elsajátított, az IEC 61131-3 szabványnak megfelelő PLC-programozási ismereteiket a gyakorlatban is kipróbálhassák. Ennek során egy gyártósor-modell irányítását kell megvalósítaniuk egy Moeller XC-CPU 201-es típusú PLC segítségével, CoDeSys fejlesztőkörnyezetben. A fejlesztőkörnyezet egyike az IEC 61131-3 szabványnak legnagyobb mértékben megfelelő eszközöknek, így mind a programszervezési egységek, mind a szabványos funkcióblokkok és változókezelés gyakorlására lehetőséget nyújt. A környezet támogatja mind az öt szabványos nyelvet, ezek közül a mérés során a struktúrált szöveges (ST) nyelvet fogjuk használni. A mérés során felhasznált PLC az Eaton-Moeller cég moduláris PLC-családjának tagja. A CPU 256kByte RAM-mal rendelkezik, kommunikációs interfészek közül pedig a CAN-buszt és az Ethernet-et támogatja, utóbbi egyben programozói csatlakozóként is használható. Maga a CPU 8 digitális be- és 6 digitális kimenettel rendelkezik, ezt egy XIOC-16 típusú, 8 digitális be- és 8 digitális kimenetet tartalmazó modul egészíti ki. A CPU Windows CE operációs rendszert futtat és beépített webszerverrel is rendelkezik. 2 Az IEC 61131-3 szabvány elemei Ebben a fejezetben az IEC 61131-3 szabvány néhány, a mérés szempontjából kitüntetett elemét ismételjük át röviden: először a programszervezési egységeket, majd a váltózók használatát, míg végül a strukturált szöveges programozás alapjait. 2.1 Programszervezési egységek A jól strukturált, moduláris, újrafelhasználható szoftverek fejlesztését a szabvány három programszervezési egység (program organization unit, POU) definiálásával támogatja. Ezek (a komplexitás növekvő sorrendjében) a függvény (function), a funkcióblokk (function block) és a program (program). Fontos tudnivaló, hogy az egyes programszervezési egységek nem hívhatnak meg magasabb komplexitásúakat, valamint hogy a rekurzió tiltott. Ennek megfelelően egy függvény csak más típusú függvényt, egy funkcióblokk tetszőleges függvényt vagy más típusú funkcióblokkot, egy program pedig tetszőleges típusú függvényt vagy funkcióblokkot hívhat (programot semmilyen programszervezési egység nem hívhat). A függvények olyan programszervezési egységek, melyekhez nem tartozik dedikált adatterület, azaz két hívásuk között nem őriznek meg semmiféle értéket. Ennél fogva tetszőleges alkalommal hívva őket azonos bemenetek esetén azonos kimenettel térnek vissza. Jó példái a függvényeknek a különféle aritmetikai műveletek mint ismeretes, 2 2 mindig 4. A függvények egy projekten belül tetszőleges programszervezési egységből hívhatók (figyelembe véve természetesen a rekurzióra vonatkozó tilalmat) példányosítás nélkül. A funkcióblokkok már rendelkeznek dedikált memóriaterülettel, mely megőrződik a hívások között, így azonos bemeneti paraméterekkel hívva egy funkcióblokk különböző kimenettel is visszatérhet az előzmények függvényében. A PLC-programozás során gyakran használt számlálók és időzítők mindmind funkcióblokkok. Utóbbit meghívva például a kimenet nem csak a bemenetek, hanem az eltelt idő függvénye is, ami nyilván szükségessé teszi a belső számlálóregiszter értékének tárolását a hívások között. 3
Az IEC 61131-3 szabvány elemei Az objektumorientált programozási paradigmához hasonlóan egy funkcióblokkot definiálva annak típusát ( osztályát ) hozzuk létre, melyet a használathoz példányosítani kell egy típusból természetesen tetszőleges számú példányt létrehozhatunk. A példányosítás során minden egyes funkcióblokk-példányhoz hozzárendelésre kerül annak saját memóriaterülete, melyhez más programszervezési egységek (beleértve az adott típus többi példányát) nem férhet hozzá. A funkcióblokk a legszélesebb körben használt programszervezési egység, a mérésen is ezekre épül majd az irányítószoftverünk. A program a legmagasabb szintű programszervezési egység, gyakorlatilag főprogramként (vö. a C main() függvénye) használjuk, feladata a funkcióblokkok és függvények működésének koordinálása. A funkcióblokkok által biztosított lehetőségeket többek között közvetlen értékek (pl. %I0.0) használatával egészíti ki. Mindegyik programszervezési egységhez definiálhatunk helyi, illetve interfész-változókat. Helyi változókat a VAR, illetve a VAR_TEMP kulcsszavakkal bevezetve deklarálhatunk. A két típus közötti egyetlen különbség, hogy a VAR típusú változók megőrzik értéküket a hívások között (ennek következtében minden egyes funkcióblokk- vagy program-példány ilyen változóihoz statikus memóriaterület kerül lefoglalásra), míg a VAR_TEMP kulcsszóval bevezetett ideiglenes változók nem (ezekhez egy közös használatú memóriaterület egy része kerül hozzárendelésre a híváskor). Függvények esetén a VAR_TEMP kulcsszó nem használható, ellenben a VAR típusú változóik sem őrzik meg értéküket a hívások között. Az interfész típusú változók közül a bemeneti változókat a VAR_INPUT kulcsszóval vezetjük be. Ezeket a változókat a hívott programszervezési egység (amelyen belül deklaráljuk) csak olvasni tudja, míg híváskor értéküket tetszőlegesen beállíthatjuk. A VAR_OUTPUT kulcsszóval bevezetett kimeneti változókat a hívott programszervezési egység írhatja és olvashatja, ellenben a hívó csak olvasni tudja őket. A VAR_IN_OUT kulcsszóval bevezetett ki- és bemeneti változók mind a hívó-, mind a hívott programszervezési egységek számára elérhetők írásra és olvasásra. Legfőbb előnyük, hogy a be- és kimeneti változókkal ellentétben nem érték, hanem referencia szerint kerülnek átadásra, így használatuk különösen nagyméretű adatok esetén memóriaterület-megtakarítást tesz lehetővé. 2.2 Változók deklarálása A programszervezési egységekhez a fentiek szerint rendelhetünk helyi- és interfész-változókat a megfelelő kulcsszó (pl. VAR_INPUT) és az END_VAR foglalt szó között felsorolva azokat. A változók deklarálása a következő sémát követi: <szimbolikus név> [AT <cím>] : <adattípus> [:= <kezdőérték>] Itt a szimbolikus név tetszőleges, betűket, számokat illetve _ (alulvonás) karaktert tartalmazó azonosító lehet, melynek az adott programszervezési egységen belül egyedinek kell lennie. Egyetlen megkötés, hogy az azonosítónak betűvel kell kezdődnie, illetve nem végződhet két alulvonás karakterrel. A változók adattípusa lehet logikai (BOOL), bit-sztring (BYTE, WORD, DWORD, LWORD), egész (SINT, INT, DINT, LINT, USINT, UINT, UDINT, ULINT), lebegőpontos (REAL, LREAL), idő (DATE, TIME_OF_DAY, DATE_AND_TIME, TIME), vagy karakterlánc (STRING, WSTRING). Különleges, és a mérés során jól használható adattípus a felsorolás, mely közvetlenül, típusdefiníció nélkül is létrehozható: 4
Az IEC 61131-3 szabvány elemei <azonosító> : (<címke1>,<címke2>,,<címken>) A létrehozott változó adattípusát tekintve egész: az idézőjel nélkül megadott, szöveges címkékhez rendre a 0, 1, N 1 egészek kerülnek hozzárendelésre. A kódban (pl. egy CASE struktúrában) az egész számok helyett szintén használhatók ezek a szöveges címkék, így könnyen átláthatóvá tehető a programunk. Szintén érdemes itt felidézni az idő adattípus megadására szolgáló literális formátumát: t#<időtartam><egység>[<időtartam><egység> ] ahol az időtartam egy egész szám (kivéve az utolsót, amely lebegőpontos is lehet), míg az egység lehet d (nap), h (óra), m (perc), s (másodperc) illetve ms (millisecundum). Ennek megfelelően a másfél másodperces időtartam például t#1s500ms illetve t#1.5s formában is leírható. Visszatérve a változók deklarációjához, két opcionális paramétert is használhatunk. Az AT kulcsszóval fizikai címhez köthetjök a változónkat ne feledjük, hogy ezt csak programban tehetjük meg! A cím felépítése a következő: %<LocationPrefix><méret><sorszám> ahol a LocationPrefix értéke bemenetek esetén I, kimenetek esetén Q, míg memóriaváltozók esetén M. Fontos kiemelni, hogy utóbbiakat nem kötelező fizikai címhez rendelni. Sőt, ha nincs rá kifejezett szükség, akkor ellenjavalt is a fordítóra bízva a változók címhez rendelését biztosak lehetünk abban, hogy feledékenységből nem kötünk egy memóriacímhez több változót. A méret azonosítója lehet X (egyetlen bites logikai változó), B (bájt), W (szó), D (duplaszó) illetve L (hosszúszó, 64 bájt). A sorszám előjel nélküli egész, illetve hierarchikus címzés (pl. be- és kimeneti bitek, memóriabitek) esetén két, ponttal elválasztott előjel nélküli egész, pl. %IX0.1 A változókhoz opcionálisan kezdeti érték is rendelhető. Amennyiben ezt elhagyjuk, úgy a változó indításkor az üres vagy 0 értéket (az adattípusnak megfelelő bitszámon) veszi fel. 2.3 Strukturált szöveges programozás A strukturált szöveges (Structured Text, ST) programozási nyelv az IEC 61131-3 szabvány két szöveges nyelvének egyike. Magas szintű, ugyanakkor egyszerű, leginkább talán a Pascal nyelvhez hasonlító szintaxisának köszönhetően igen népszerű programozási eszköz. Használata során azonban nem szabad elfelednünk, hogy a magas szintű leírást egy PLC értelmezi, tehát a létradiagramhoz hasonlóan a teljes strukturált szöveges program lefut minden egyes PLC-ciklusban! Az alábbiakban a strukturált szöveges programozás alapjai közül a mérés szempontjából legfontosabb elemeket foglaljuk össze. Az ST nyelv a műveleteket kifejezéseken végzi el, amik lehetnek közvetlen értékek (pl. 123, TRUE), változók (pl. MyVar), vagy függvények visszatérési értékei (pl. SIN(0), NOT(MyVar)) is. A műveletek között elsőként az értékadás szerepel, melyre a := operátor használható, pl. MyVar:=4; (az összehasonlításra egyetlen egyenlőségjel szolgál). Mint az előbbi példából is látható, a műveleteket a szöveges nyelveknél megszokott módon ; zárja kivételt ez alól csak a foglalt szavakra (pl. THEN, END_IF) végződő sorok jelentenek. 5
Az IEC 61131-3 szabvány elemei A megszokott programozási struktúrák közül az IF elágazás általános alakja az alábbi: IF <BOOL expression> THEN ELSIF <BOOL expression> THEN ELSIF <BOOL expression> THEN ELSE END_IF; A feltétel mindenképpen logikai értékre kiértékelődő kifejezés (pl. egy logikai bemenet vagy MyVar=4), az egyes ágakban pedig tetszőleges számú művelet szerepelhet. Az ELSIF kulcsszóval bevezetett műveletblokk akkor fut le, ha a megelőző (IF vagy ELSIF) feltételek hamisak, de az adott ELSIF kulcsszó melletti kifejezés igazra értékelődik ki. Ilyen blokkból tetszőleges számú használható, de szerepeltetésük nem kötelező. Az ELSE ág művelet-blokkja akkor fut le, ha a megelőző ágak (akár csak az IF, akár tetszőleges számú ELSIF) kifejezései hamisra értékelődnek ki. A teljes blokkot az END_IF kulcsszó zárja le. Amennyiben egy egész számra kiértékelődő (ne feledjük, a felsorolás is ilyen!) kifejezés eredménye szerint kívánunk műveleteket végrehajtani, úgy a CASE struktúrát érdemes használni, melynek általános alakja az alábbi: CASE <INT expression> OF <value1>: <value2>,<value3>: ELSE END_CASE; Mint a fentiekből is látható, egy esetet több értékhez is hozzárendelhetünk, illetve megadható egy ELSE ág is, ami akkor értékelődik ki, ha a megelőző ágak egyike sem. Az előzőekben a kiértékelődés kifejezés használata nem véletlen: míg a létradiagram esetén minden létrasor egy logikai függvénynek felel meg, a strukturált szöveges programozás esetén pl. az IF A THEN B:=TRUE END_IF; művelet esetén ha A hamis, akkor a B-re vonatkozó művelet nem értékelődik ki, azaz nem lesz hamis, hanem megőrzi értékét, legyen az igaz vagy hamis. Ez a művelet létradiagramban egy kontaktust követő Set-tekercsnek felel meg. 6
Mérési feladatok 3 Mérési feladatok 3.1 Gyártósor-modell irányítása A feladat során használt gyártósor-modell négy futószalagból, a merőleges futószalagokat összekötő két tologatóból, valamint egy maró- és egy fúrógépből áll (ld. 1. ábra). 1. ábra - A gyártósor-modell felépítése A futószalagok mentén fotoérzékelők helyezkednek el, melyek fénysugarát az előttük elhelyezkedő munkadarab megszakítja, így annak jelenlétét az érzékelő logikai 0 szintje jelzi. A futószalagok és a szerszámgépek motorjai a PLC megfelelő kimenetét 1 értékre állítva működtethetők. A tologatók esetén a motorok ki- és bekapcsolása mellett egy másik kimenettel a mozgás iránya is megadható (1: előre, 0: hátra). A tologatók első és hátsó véghelyzetében egy-egy végálláskapcsoló helyezkedik el, ami jelez, ha a tologató az adott pozícióban tartózkodik. A gyártósor irányítása során a következő működést kell biztosítani. Az első futószalag elejére (az 1. fotoérzékelő elé) egy munkadarabot helyezve a futószalag induljon el, és továbbítsa a munkadarabot az 1. tologatóra. Ehhez a 2. fotoérzékelő jelzése után még kb. 2 másodpercig járatni kell a szalagot. A megérkezett munkadarabot a tologató tolja át a 2. futószalagra (a megfelelő működés érdekében ekkor a 2. futószalag már járjon), majd húzódjon vissza hátsó véghelyzetébe. Amint a munkadarab a marógép alá ért, a 2. futószalag álljon le, a gép pedig 3 másodpercen keresztül üzemeljen. Ezután a futószalag továbbítsa a munkadarabot a fúrógép felé, majd álljon le. Ehhez a szalagot a marás befejezése után kb. 4 másodpercig kell működtetni, és közben már a 3. futószalagot is el kell indítani. Amint a munkadarab a fúrógép alá ért, a 3. futószalag álljon le, a gép pedig 5 másodpercen keresztül üzemeljen. Ezután a futószalag továbbítsa a munkadarabot a 2. tologató felé (a fotoérzékelő elhagyása után ehhez kb. 4 másodpercig kell működtetni a szalagot). A 2. tologató tolja át a munkadarabot a 4. futószalagra (az közben már mozogjon), majd húzódjon vissza a hátsó véghelyzetbe. A 4. futószalag az 5. fotoérzékelő jelzését követően 2 másodpercig még járjon, majd álljon le. 7
Mérési feladatok Mérési feladat Implementáljanak egy olyan PLC-alkalmazást, mely biztosítja a gyártósor fent ismertetett működését! Feltételezhetik, hogy a gyártósoron egyszerre csak egyetlen munkadarab helyezkedik el. Ehhez készítsenek egy-egy funkcióblokkot a bemeneti futószalag, egy tologató, egy szerszámgép illetve a kimeneti futószalag vezérlésére, majd ezeket a főprogramban példányosítsák megfelelő beés kimenetekkel! Kiegészítő feladat Módosítsák az alkalmazást úgy, hogy a gyártósoron egyszerre több munkadarab is jelen lehessen! Feltételezhetik, hogy az első futószalagra csak akkor kerül új munkadarab, amikor az előző már elhagyta azt. Jótanácsok Az egyes gyártósori elemekhez (bemeneti futószalag, kimeneti futószalag, szerszámgépek, tologatók) készítsenek külön-külön állapotgépeket! Ezeket először tervezzék meg papíron, csak utána implementálják! Ügyeljen arra, hogy a tologatók a végálláskapcsolók jelzése után ne mozoghassanak helytelen irányba! Amennyiben bármilyen probléma (pl. túlfutott tologató) adódna, a szakaszmodellt állítsa le a vészgombbal és kérje a mérésvezető segítségét! 3.2 Manipulátor-modell irányítása A feladat során egy 3D manipulátor használatával kell munkadarabokat egy felvételi pontról a bemeneti futószalagra, valamint a kimeneti futószalagról a késztermék-tárolóba pakolni. A manipulátor egy megfogóval ellátott, 3 szabadságfokú kar, melynek vázlatát a 2. ábra mutatja be. 2. ábra - A 3D manipulátor vázlata Az 1. csukló egy rotációs csukló, mely az egész kart forgatja függőleges tengelye körül (a pozitív irány az óramutató járásával megegyező). A második csukló transzlációs, segítségével a kar 2. szegmense süllyeszthető (pozitív irány) vagy emelhető (negatív irány). A 3. tengellyel a 2. szegmens vízszintesen kitolható (pozitív irány) illetve visszahúzható (negatív irány). A megfogó a motor pozitív irányú 8
Mérési feladatok forgatásával nyitható, míg negatív forgásiránnyal zárható. Az egyes csuklókhoz, illetve a megfogóhoz két-két PLC-kimenet tartozik. Ezek közül az egyik a motort kapcsolja be vagy ki, a másik pedig a forgásirányt állítja (1: pozitív irány, 0: negatív irány). Az egyes csuklók és a megfogó nullpozícióját (a 2. csukló esetében a legmagasabb pozíciót, a 3. csukló esetén a teljesen visszahúzott pozíciót, megfogó esetén a zárt állást) végálláskapcsolók jelzik, ezek abszolút információt adnak az adott csuklók helyzetéről. A csuklók impulzusadókkal is fel vannak szerelve, melyek mozgás közben bocsátanak ki impulzusokat. Ezek irányhelyes számlálásával a csuklók nullhelyzettől mért relatív pozíciója meghatározható. A kar pozícióit ezen számlálóértékekkel (az ún. csuklókoordinátákkal) adjuk meg, azaz pl. a (30,0,20,5) koordináta azt jelenti, hogy az 1. csukló 30 impulzusnyit fordult a nullhelyzethez képest, a 2. csukló a nullhelyzetében (felső végállás) van, a harmadik csukló 20 impulzusnyival van kitolva a nullhelyzetéhez képest, a megfogó pedig 5 impulzusnyit nyílt ki. Az irányításnak a következő működést kell biztosítania. Bekapcsolás után a manipulátor helyzete nem meghatározott, így a kart kalibrálni kell, azaz minden csuklót és a megfogót is a végálláskapcsolókkal jelzett nullpozícióba kell mozgatni. Kalibrálás után a kart a felvételi pont feletti 1. pozícióba kell vezérelni, és a megfogót ki kell nyitni, majd a kart leereszteni és a megfogót zárni. A kar felemelése után a bemeneti futószalag feletti 2. pozícióba kell mozogni, ott leereszkedni, majd a megfogó nyitásával elengedni a munkadarabot. Emelés után a kimeneti futószalag fölé kell pozícionálni a kart nyitott megfogóval, majd ha van ott munkadarab (erről a fotoérzékelő jelének megváltozása szolgáltat információt), leereszteni, majd megfogás után felemelni, és a késztermék-tároló csúszdája fölé mozogva elengedni. A műveletsor végén ismért a nullpozícióba kell mozogni, ahol megtörténik az újrakalibrálás. Mérési feladat Implementáljanak olyan PLC-programot, mely biztosítja a manipulátor fent ismertetett működését! Ehhez készítsenek egy-egy funkcióblokkot, mely képes a csuklók illetve a megfogó adott célpozícióba mozgatására! Fontos, hogy zérus célpozíció esetén ne a számlálóértéket, hanem a végálláskapcsoló jelzését figyeljék, így az elkalibrálódásból adódó problémák kiküszöbölhetők. A főprogramban ezen funkcióblokkok példányosításával biztosítsák a megfelelő működést! Jótanácsok Az impulzusadók pergése miatt fogadja el célpozícióként az attól 1-1 impulzusnyira eső értékeket is! Az 1. és 3. csuklót csak abban az esetben mozgassa, ha a 2. csukló a legfelső helyzetben van! A kar képes kárt tenni saját magában, illetve a gyártócella elemeiben. Amennyiben veszélyes helyzet adódna, azonnal állítsa le a manipulátort a vészgombbal és kérje a mérésvezető segítségét! 9