Professional Documents
Culture Documents
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 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.
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.
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:
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:
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
Kapcsolódó témák:
S7-300/400 címtartományok, adattípusok
Szirty