Az S7 PLC programozása

Néhány alapgondolat.

S7-300, S7-400 PLC-k programja ún. blokkokban van. A PLC programot a blokkok logikailag elkülönülő részekre osztják. A program funkcionálisan elkülönülő részeit külön blokkba írva a program strukturáltsága és áttekinthetősége is javul. Az S7 3 féle program blokkot különböztet meg.
FC (Function)
A felhasználói programot és függvényeket megvalósító program rutinokat tartalmaz
FB (Function Block)
Általában a felhasználói program részfeladatait ellátó olyan függvényeket tartalmaz, amelyekhez kizárólagos hozzáférésű adatterület is tartozik
OB (Organization Block)
"Szervező" program blokk. Speciális program blokkok. melyek funkciója gyárilag szigorúan meghatározott.

Vannak még az adat blokkok, mikben adatokat tárolhatunk. Beállításokat, mérési eredményeket, stb.
Az adatblokkok szerkezete tetszőleges, azokat mi hozzuk létre. A hozzáférést tekintve kétféle adatblokk van, az általános, minden programblokk által elérhető és a kizárólagos, amiket funkció blokkok használnak.

A blokkokat számokkal és nevekkel (Symbolic name) különbözteti meg egymástól a rendszer. Egy blokkra a számával és a nevével is hivatkozhatunk
Ez a blokkos szerveződés azonnal szembetűnik, ha belenézünk egy S7 programba:




FC blokkok

Általában a PLC-s rendszer feladatait ellátó főprogramot, vagy annak funkcionálisan egybe tartozó részét végző programrészeket tartalmaznak, amiket az OB1-ből vagy másik FC blokkból hívunk meg.
Az FC blokkoknak paramétereket is át lehet adni. Ez lehetővé teszi, hogy olyan feladatokat, függvényeket írjunk FC-kben, amivel a programunk még strukturáltabbá válik. Az FC-t többféle programozási nyelven is elkészíthetjük (STL, LAD, FBD, SCL, stb). Mindig válasszuk azt a programozási nyelvet, amelyikkel az adott feladatot a leghatékonyabban tudjuk leprogramozni.

Egy FC-n belül az S7 ben rendelkezésre álló globális címterületeket tetszőlegesen címezhetjük. I (bemenetek), Q (kimenetek), M (merkerek), T (időtagok),  C (számlálók), DB (adatblokkok), PI (periféria bemenetek), PQ (periféria kimenetek).
Minden FC blokknak van egy saját, lokális címterülete is (lokális változó terület, L) ahol olyan változókat deklarálhatunk, amelyekhez csak az FC blokkon belül léteznek. Amikor a CPU befejezi a blokk végrehajtását (kilép a blokkból) ezek a változók tartalmukkal együtt megsemmisülnek!
A lokális változók közé sorolhatjuk a blokk számára kívülről átadott paramétereket és a blokk által a hívó blokk számára visszaadott eredményeket tároló változókat is.
A lokális változó területet a programszerkesztőben deklarálhatjuk, ahol az FC blokk programját írjuk (LAD/FBD/STL editor). A szerkesztő ablak két részre van osztva. Ha az elválasztó vonalat egérrel lejjebb húzzuk láthatóvá válik a lokális változók definíciója, ami kezdetben üres váz, nincsenek változók benne):



A képen egy paraméterekkel rendelkező FC blokk bemeneti változói láthatók.
A lokális változók öt csoportra vannak osztva funkciójuk szerint:
A lokális változókat a blokkon belül ugyanúgy kezelhetjük és ugyanúgy hivatkozhatunk rájuk, mint a közönséges globális címterületekre.
A változók deklarálásakor meg kell adnunk a változó nevét, adattípusát és írhatunk hozzá egy megjegyzést. Hasonlóan, mint amikor a szimbólum táblába készítünk bejegyzést globális változók számára.
Ha a blokkunkban nem akarunk paraméter átadást megvalósítani és átmeneti változókra sincs szükség, akkor a lokális változókkal nem kell törődni.

Nézzünk egy egyszerű példát paraméter átadással.
A példában egy csillag-delta átkapcsolást valósítunk meg külön FC blokkban (FC7).





Az FC7-es blokk egyáltalán nem tartalmaz globális cím hivatkozásokat, minden információ a ki és bemeneti paramétereken keresztül áramlik. Ezért többször fel tudjuk használni. Az ilyen blokk hívásoknak pedig éppen ez a lényege.
Látható, hogy ha a blokkon belüli lokális változókra azok nevével hivatkozunk, akkor kettős keresztet kell a név elé tenni. (Lehetséges a változókra a címükkel is hivatkozni, lásd később)
Ha egy rendszerben sok-sok csillag-delta indítás van, akkor érdemes erre egy ilyesmi blokkot írni, majd a megfelelő helyen paraméterezni és meghívni.

Az FC7 hívása létradiagramban:




Ugyanaz az FC7 különböző csillag-delta motorokat más-más időkésleltetéssel képes kapcsolni. Természetesen a blokknak más-más paramétereket kell adnunk.
Ha valamelyik FC használja pl. a T1 timert (illetve bármilyen globális változót), akkor azt a programban máshol már nem használhatjuk fel, másik FC-ben sem!

A TEMP változókat a blokkon belül szabadon használhatjuk pl. számítások részeredményeinek ideiglenes tárolására.
A TEMP tartalmát azonban fel kell használni mielőtt a blokk lefut (kilép) mert értéke akkor elvész.
Példa:



A képen egy valós programból kiragadott részlet látható sok TEMP változóval. Az alábbi kód az #ul változón mutatja be a TEMP változók használatát.


Itt most nem fontos mit csinál a fenti kód. A példából látható, hogy az #ul egy dint típusú változó, ami egy művelet eredményét tárolja. Az #ul-t néhány további művelet után betölti és felhasználja.

A lokális változókat a nevük mellett a címükkel is elérhetjük (abszolút címzés). A blokk interface mezőjében, ahol a definíciók vannak, van egy Address mező.
Ez a változók byte és bit címét mutatja:


Abszolút hivatkozások a fenti TEMP változókra STL-ben:


A lokális területre a következőképpen lehet hivatkozni:
L x.y  -  x. byte y bitje
LB n  - n. byte
LW n - n. című word
LD n  - n. című double word

Az abszolút hivatkozásokkal óvatosan kell bánni! Ha új változókat hozunk létre pl. az #int1 előtt, akkor annak címe is megváltozik! Ha #int1-re abszolút hivatkozás van valahol, (pl.: L  LW2) akkor az új változó beszúrása miatt eltolódó címek következtében az LW2 címen már nem az #int1 változónk lesz!
Fontos hogy ha a blokkot nem STL-ben írjuk, hanem LAD/FBD-ben, akkor a rendszer is használ lokális változókat. Pl. T branch (T elágazás) programozásakor:



A fenti programrészlet STL az alábbi:

Látható, hogy használja a 8-as local byte 0-és bitjét (L8.0) az elágazási pont logikai állapotának átmeneti eltárolásához.
Természetesen a rendszer nem használja fel az általunk már deklarált változókkal lefoglalt lokális területet.
Ha azonban STL nézetben utólag be akarunk rakni egy új változót, akkor ebből lehetnek problémák, amire a változó berakásakor a Step7 figyelmeztet is:



Mivel a lokális változók csak a blokkon belül tartják meg értéküket, csak a blokkon belül léteznek, más blokkokban használhatjuk ugyanazokat a változóneveket, de tartalmuk "nem jut át" a másik blokkba.
Ha a blokk végén értéket adunk egy local változónak, annak értéke a blokk elején határozatlan lesz, mivel a blokk elejére csak a következőhíváskor kerül a vezérlés. Kivéve persze ha a blokk elhagyása előtt valahonnan az elejére ugrunk egy ugró utasítással, hiszen olyankor ez még a blokk elhagyása előtt fog megtörténni, a változó tartalma ezért nem vész el.
Soha ne olvassuk vagy használjuk fel egy lokális változó tartalmát mielőtt annak a blokkon belül értéket adnánk!



Az OB blokkok

Az FC-khez hasonló programblokkok, de speciális, előre meghatározott funkciójuk van és a rendszer hívja meg őket, nem a felhasználói program. Fontos szerepet kapnak a rendszer közeli teendők elvégzésében, mint pl. programhiba kezelés, kommunikációs hibák kezelése, megszakítások, stb).
Az OB-k funkciója az alábbi:

OB1 Fő ciklus. Az OB1-et a PLC operációs rendszere minden PLC programciklusban meghívja
OB10-OB17 Time of day interrupt
Előre meghatározott időpontban egyszer végrehajtódó megszakítás, vagy az adott időpontban minden alkalommal (percenként, óránként, naponta, hetente, stb)
OB20-OB23 Időre késleltetett megszakítás OB-k.
A program egy részének (blokk(ok)) késleltetett végrehajtását tesz lehetővé. Az OB-t a rendszer meghívja az SFC32 rendszerhívással beállított (SRT_DINT) idő elteltével.
OB30-OB38 Ciklikus megszakítások
A HW konfigban, a CPU tulajdonságainál beállítható időközönként rendszeresen végrehajtódó program blokk.
OB40-OB47 Hardver megszakítások
Jelfeldolgozó modulok (SM), kommunikációs modulok (CP) és funkció modulok (FM) állíthatók be hardver megszakítás kérésére egy bizonyos esemény bekövetkezésekor (pl. amikor egy digitális bemenet 0-ból 1-re vált). Ilyen megszakítás hatására hívja meg a rendszer ezeket a blokkokat.
DB55-DB57 DP V1 megszakítások.
Profibusz DP V1 slave eszközök kérhetnek ilyen megszakításokat.
OB55 DP V1 Status interrupt
Ilyen megszakítást DPV1 eszközök generálnak a működési állapotuk megváltozásakor. Pl. futás módból STOP módba váltáskor.
OB56 DPV1 update interrupt
Az eszköz újrakonfigurálásakor keletkező megszakítás. Részletesen lásd a DPV1 eszköz leírásában
OB57 DPV1 Manufacturer specific interrupt
Gyártóspecifikus megszakítás. Eszközfüggő. Az adott DPV1 slave leírásából kell kinyerni a megfelelő infókat ezzel kapocslatban
OB60 Multicomputing
Párhuzamos feldolgozással kapcsolatos megszakítás, több CPU-t tartalmazó rendszerekben
OB61-OB64 Synchronous cycle interrupt
Állandó reakció idő biztosítása Profibus DP eszközök számára
OB70, OB72 OB70 I/O Redundancy Error
OB72 CPU Redundancy Error
Csak H sorozatú dupla rendszereknél
OB80 Time Error
A rendszer akkor hívja meg ezt a blokkot, amikor a ciklus idő meghaladja a maximumot, vagy a "time of day" megszakítás kimarad a rendszer óra előre állítása következtében, vagy a késleltetés túl nagy a priority class feldolgozásakor
OB81 Power Supply Error
A blokkot a rendszer meghívja tápegység hibánál, a memóriát tápláló elem lemerülésénél. A blokk a hiba keletkezésekor és megszűnésekor is meghívásra kerül egyszer.
OB82 Diagnostic Interrupt
A blokk lefut, amikor diagnosztikai megszakítás következik be.
A diagnosztikai megszakítást a bővítő modulok kérhetnek, amelyik erre alkalmas (HW config-ban állítható be)
OB83 Insert/Remove Module Interrupt
Bővítő modul leválását és visszacsatlakozását jelző megszakítás
OB84 CPU Hardware Fault
Hardver hibát jelző megszakítás
OB85 Program Sequence Error
A rendszer meghívja, ha egy megszakítást bekonfiguráltunk, de nem töltöttük fel a hozzá tartozó OB-t és a megszakítás bekövetkezik, vagy rendszerfunkció blokk instance adatblokkjához való hozzáférésnél hiba keletkezik, vagy hiba keletkezik a "process image table" frissítésekor
OB86 Rack Failure
Hiányzó vagy meghibásodott interfész modul, külső DP periféria tápegység hiba DP slave hiba az L2DP buszon
OB87 Communication Error
Ha kommunikációs funkcióblokkokkal kezdeményezett adatcsere közben hiba keletkezik
OB90 Background cycle
Amikor a CPU hardver konfigjában minimum ciklus időt állítunk be, akkor az oprendszer meghívja ezt a blokkot a holt időben
OB100-OB102 Restart
Újrainduláskor egyszer lefut
OB121 Programming error
Lefut, ha a megcímzett időzítő nem létezik, vagy a program olyan blokkot hív meg, amelyik nem létezik (nincs betöltve).
OB122 I/O Access Error
Lefut, ha egy utasítás olyan modult próbál írni vagy olvasni amelyik nem létezik

Az OB-k részletes leírása megtalálható a Step7 helpben.
Nem kötelező ezeket az OB-kat használni. A legtöbb esetben nincs is mindegyikre szükség egyszerre, ám a legfontosabb OB, az OB1-et használnunk kell. Ez az OB fut le minden PLC ciklusban. vagyis ebből hívhatjuk meg az FC programblokkjainkat amiket megírtunk.
Az OB-k is tartalmaznak lokális változó területeket. De az FC-kkel és FB-kkel ellentétben egy OB létrehozása után ez a terület nem üres, hanem az OB funkciójára jellemző, gyárilag előre definiált változókat tartalmaznak. Ezek a változók a rendszertől értéket kapnak amikor a rendszer meghívja az OB-t. Az OB-k TEMP változóiból információkat kapunk a rendszertől. Ezeknek a változókban a jelentése az adott OB blokk leírásában megtalálható.

Lássuk pl. sz OB1-et:


Megtaláljuk itt pl. a ciklusidő hosszát ms-ban, prioritást, dátumot, stb.
Az OB-k TEMP területén is hozhatunk létre saját lokális változókat a gyárilag deklaráltak után.
Soha ne töröljünk előre definiált lokális változót OB-ból, ellenkező esetben a blokk futásképtelen lesz, mert a rendszer írni akar ezekbe még akkor is ha nem használjuk fel a benne lévő adatokat. Ha nincs szükségünk ezekre, hagyjuk figyelmen kívül a jelenlétüket, de ne töröljük őket.
A hibakezelést végző OB-k lokális változóiból lehet kiolvasni az OB meghívásának okára vonatkozó információkat. Pl. Rack failure OB86 változóiból megtudhatjuk melyik modul és azon belül melyik rack problémás.

A 2. rész itt olvasható
Vissza a főoldalra

Kapcsolódó témák:
S7-300/400 címtartományok, adattípusok




Szirty