Az S7 PLC programozása (2. rész)


Az első rész itt olvasható

Az FB blokkok

Abban térnek el az FC blokkoktól, hogy az FB-khez adattároló is tartozik, egy DB (adat blokk) formájában. Minden FB hívásakor kötelezően meg kell adni a hozzá tartozó adatblokk számát (vagy nevét) is. Az FB-hez tartozó blokkot "instance" blokknak nevezi a Siemens doksi.
Az FB-hez tartozó instance DB-ben az FB paraméterei és belső, lokális változói tárolódnak el. Ezért az FB-ben már nem vész el a lokális változók tartalma amikor a blokk végrehajtása befejeződik, ahogy az FC-nél.
A következő híváskor az FB-beli belső változók őrzik a tartalmukat. A következő ciklusban mindent ugyanúgy találunk, ahogy az előző ciklusban hagytuk. Kivételt képeznek ez alól a TEMP csoporthoz rendelt változók, amik tartalma továbbra is elvész. Lásd alább.
Az instance DB belső szerkezete (felépítése) a fentiek miatt természetesen kötött és hozzáférése elvileg kizárólagos (bár meg lehet kerülni ha nagyon kell). Ez azt jelenti, hogy egy FB-hez rendelt DB (vagyis instance DB) tartalmához csak az az FB blokk férhet hozzá, amelyikhez tartozik, "kívülről" más blokkból a DB tartalma nem érhető el.

Az FB blokkokba ugyanúgy írhatunk programot mint az FC blokkokba. Apró különbség a lokális változók körül van. Ha megnézzük a blokk interfész részét (változó deklarációs részt), a különbség látható lesz:


Egy újabb csoport jelent meg, a STAT.
A STAT, IN, OUT, IN_OUT-ban létrehozott változók értékét elmenti az instance DB-be. A TEMP-ben létrehozott változókat nem. Azok tehát továbbra is elvesznek a blokk kilépésekor.

Az FB-hez tartozó instance DB blokk létrehozása
A legegyszerűbb, ha az instance DB létrehozását a rendszerre bízzuk.
Írjuk meg az FB-t. Amikor készen van, tegyünk le egy hívást (CALL utasítást) ami ezt az FB-t hívja meg:

Az FB blokk fölött látható kérdőjelekhez kell beírni a hozzá tartozó adatblokk számát. Írjunk ide egy olyan DB-t, ami még nem létezik. A Step7 feldob egy ablakot, amiben figyelmeztet, hogy a megadott blokk nem létezik, majd megkérdezi hogy létrehozza-e:


Válaszoljunk igennel.
Így létrejön a blokk (a példa szerint a DB11).
Más, közönséges (osztott elérésű [shared]) blokkot itt nem adhatunk meg, a rendszer nem fogadja el.

Más módszer is van az instance DB létrehozására:
A Simatic manager ablak blokk listájában kattintsunk jobb egérgombbal. A menüből válasszuk az Insert New Object pontot, majd a Data Block pontot::

     

A megjelenő Properties - Data block ablak Name and type részénél állítsuk be a létrehozandó adatblokkot (DB11-et)  Instance DB típusúra és adjuk meg hivatkozásként a funkció blokkunkat (a példa szerint az FB1-et). Az FB megadására azért van szükség, hogy a Step7 tudja melyik funkció blokkhoz kell létrehozni az adat blokkot. Ezért mindig csak létező FB-hez tudunk instance blokkot generálni.

Az instance DB felépítése
A fentiekből tehát kitűnik, hogy az FB-hez ragasztott DB blokk szerkezete egyedi és az FB változó deklarációs interface részének szerkezetétől függ.
Ha például az FB1 említett része ilyen:


És DB11-et adjuk meg instance blokknak, akkor annak szerkezete az alábbi lesz:



A DB11 felépítése tehát teljesen azonos lesz az FB változódeklarációs részével azt leszámítva, hogy a DB nem veszi fel a TEMP változókat!
Az FB blokkon belül minden lokális változóba való írás a hozzá tartozó instance DB azonos nevű és című elemébe ír, a változó olvasása onnan olvas.

A változók elérése
Ezekre a változókra ugyanúgy a nevükkel lehet hivatkozni, mint egy FC-ben. Szimbolikus címzésnél mindegy hogy a változó bemeneti, kimeneti, paraméter STAT vagy TEMP csoportba tartozó változó.
Ha azonban közvetlenül, abszolút módon akarjuk címezni ezeket a változókat, már más a helyzet mint az FC-ben.
Azok eléréséhez, amelyek lényegében az instance DB-ben vannak eltárolva (IN, OUT, IN_OUT, STAT) az adatblokk megfelelő címére kell hivatkozni. De nem mint DB, hanem mint DI.
Lássunk néhány példát:
Példa szimbolikus elérésre Abszolút címzés
L #Be L DIW 0
T #Ki T DIW 2
L #STAT1 L DIW 4
A #SBool1 A DIX 6.0

Az instance DB-re tehát külön címzésmód van: 
DIX x.y x című byte y. bitje
DIB n n című byte
DIW n című word
DID n című doubleword
Az FB TEMP változóit az FC blokknál megismert módon címezhetjük közvetlenül: L x.y, LB n, LW n, LD n

Mire jó az FB?

Az FB a hozzá tartozó adatblokk révén a hívás után is megőrzi belső változóinak tartalmát, tehát a blokk belső állapota tárolódik.
Elvileg minden feladat megolodható az FB-k használata nélkül is, vannak azonban olyan részfeladatok, amiket FB-vel könnyebb megoldani és hordozhatóvá tenni.

Az FC blokkok belső változói megsemmisülnek minden ciklusban (minden hívás után). Bizonyos funkciók elvégzéséhez azonban elengedhetetlen az adatok tárolása, mert pl. az adat nem szerezhető meg bármikor, hanem csak bizonyos feltételek teljesülésekor, vagy a művelet elvégzéséhez az előző futás eredményére is szükség van, stb.
Ha az ilyen blokkot FC-ben írjuk meg, akkor az említett adatokat "kívül", globális változókban pl. egy közönséges adatblokkban kell tárolnunk. A funkciót végző FC-n belül pedig két lehetőségünk van az adatok elérésére:
Közvetlenül olvassuk a kiszemelt DB megfelelő adatait, tehát "bele betonozzuk" a címzést a blokkba. Ennek két hátránya is van. Az egyik, hogy azt az FC nem hívhatjuk meg újra hogy ugyanazt a feladatot más adatokkal is elvégezze. A másik hátrány, hogy ezt a blokkot csak fokozott körültekintéssel használhatjuk fel később másik programban, mert figyelni kell rá milyen címeket használ a blokk belül, hogy azt a program más részeiben ne használjuk fel, különben a blokk adatai felülíródhatnak, ami hibás működést eredményez.
A globális adatok elérésének másik lehetősége, ha nem betonozzuk be a címeket a blokkba, hanem kívülről adjuk meg azt az adatterületet, amit felhasználhat a saját céljaira. Így már több, párhuzamos feladatot is adhatunk a blokknak, mert lehetőségünk lesz minden hívásnál más-más adatterületet kijelölni a számára. A blokk hordozhatósága is javul. Bonyolultabbá válik azonban a blokkon belüli program a többlet paraméter átadás miatt és még így is nekünk kell előkészíteni a DB-ket hozzá.
Az FB ezeket a problémákat oldja meg. Zárt, belső tárolóval rendelkezik, amiket más blokk nem használhat. A blokkon belül a saját instance DB adatterületének címzése nem igényel többlet kódot, mivel a belső változókra hivatkozva érhetjük el az adatokat. Az instance DB-ket nem nekünk kell előkészíteni, a Step7 automatikusan előállítja azokat.

Példával szolgálhat az FB használatára az "Analóg késleltetővonal SIMATIC S7-300/400-ra" c. cikkben szereplő FB5 funkció blokk, ami a késleltetést végzi.
Nagy vonalakban a működésének lényege az, hogy a blokk "órajel" bemenetét stimulálva minden felfutó élnél vesz egy mintát a "Bemenet"-ről és eltárolja azt. A "Hossz" paraméterben megadott számú "Orajel" impulzus után a tárolt adatokat a "Kimenet"-re küldi. (A blokk működését részletesebben lásd a cikkben).
Látható tehát, hogy ennek a funkciónak kell egy adatterület, ahol a beolvasott adatokat a kimenetre küldésig tárolhatja. A példa kedvéért ezt az FB5-öt használjuk arra, hogy analóg bemenetekről érkező méréseket késleltetünk vele. Használjuk ugyanezt a blokkot egyszerre több mérés késleltetésére!

Mivel minden mérésnél a feladat teljesen ugyanaz, mindannyiszor az FB5 késleltető blokkot használjuk fel. De mivel eltérő adatokkal dolgozik, más és más instance blokkot párosítunk hozzá.
A mérések az MD2, MD6 és MD120 duplaszavakban érkezik.




 Vissza a főoldalra




Szirty