S7 DB-k és módosításuk adatvesztés nélkül


Aki S7-300 vagy S7-400-as PLC programozására adja a fejét, az első kisebb programok írása után egyre összetettebb feladatok megoldására vállalkozik. Ennek során egyre jobban megismeri az S7 sajátosságait és megtanulja az adott feladat során ezeket kihasználni. Ez lesz az a pont, amikor az S7 bonyolultsága "meghálálja magát".
Szinte biztos, hogy ennek az útnak a bejárása során előbb-utóbb szükségünk lesz a DB adatblokkok használatára. A DB, mint neve is mutatja adatok tárolására szolgáló memóriaterület, ami kikapcsoláskor is megtartja tartalmát. A DB nem feltétlenül egy közönséges, homogén bit, vagy byte mező, hanem struktúra, aminek szerkezetét bizonyos szabályok alapján maga a programozó hozza létre a feladatnak megfelelően.
A DB-ket  leggyakrabban mérési adatok, beállítások tárolására használjuk. DB-ket használnak az FB funkció blokkok is, de azokkal általában nincs dolgunk, maga az FB kezeli a tartalmukat saját hatáskörében. DB-kre van szükség akkor is, ha a rendszerhez operátorpanel is tartozik. Legalábbis az OP területmutatóit célszerű DB blokkokra irányítani.

De maradjunk annál az esetnél, amikor mi magunk hozunk létre adatblokkot, hogy a berendezés bizonyos beállításainak módosítását lehetővé tegyük. Ha pedig lehetővé tesszük, valahol tárolni is kell azokat, kézenfekvő erre a DB. Rendszerint a beállítás módosítását a berendezés kezelője egy OP segítségével végzi, az OP-n megjelenő és módosított adat pedig egy DB blokk egy meghatározott címére kerül, ahonnan a program kiolvassa. A beállítás bármi lehet. Pl. időtag (timer) értéke, analóg mérés határértéke, funkciók ki és bekapcsolása, stb.

A DB-nek két nézete van Step7-ben, A deklarációs és az adat nézet. A két nézet között a View menüben válthatunk (vagy a Ctrl-4 és Ctrl-5 gombokkal).
A deklarációs nézetben hozhatunk létre új bejegyzéseket a DB-ben. Minden bejegyzésnek meg kell adnunk az adattípusát, ami alapvetően kétféle lehet:

    Elementary - elemi típusok: Bool, Byte, Word, DWord, Int, Dint, Char, Real, S5Time, Time, Date, Time_of_day
    Complex - avagy összetett típusok, adatstruktúrák: DATE_AND_TIME, String, Array, Struct, UDT

Minden bejegyzésnek van egy szimbolikus neve (Name) típusa (Type), alapértelmezés szerinti, kezdeti értéke (Initial value) és megjegyzése (Comment) amit nem kötelező kitölteni, de a többit igen. A név megválasztására ugyanazok a szabályok vonatkoznak, mint más szimbólum névre (lásd szimbólum tábla). Nem kezdődhet számmal, nem lehetnek benne speciális karakterek, és egy DB-n belül nem lehet két azonos nevű bejegyzés.



Ha egyszerű típust hozunk létre egy DB-ben (a fenti képen ilyenek láthatók) akkor az Initial value oszlopban az adatnak adhatunk egy alapértéket. Amikor a DB-t először a PLC-be töltjük, ez az érték lesz beállítva.
Amikor a program blokkokat és az adatblokkokat először a PLC-re töltjük, az adatblokkok innentől "önálló életet élnek", ami azt jelenti, hogy tartalmuk a berendezés működése során megváltozik, hiszen a beállításokat a kezelő módosítja, új technológiai adatok kerülnek az adatgyűjtésre szánt blokkokba, stb. Ettől kezdve tehát a PC-n (Step7-ben) tárolt változat DB-inek tartalma és a PLC-ben lévő DB-k tartalma el fog térni egymástól.
Ez természetes dolog, de okoz egy kis problémát. Ha Step7-ben módosítjuk a PLC-n már futó programot, ami mondjuk azzal jár, hogy újabb beállításokat adunk a beállításokat tartalmazó DB-hez, vagy megváltoztatjuk annak felépítését - tehát olyan műveletet végzünk, ami miatt a DB blokkot újra a PLC-re kell tölteni - akkor az újratöltés során elvesznek a PLC-ben lévő DB-ben tárolt adatok és felülíródnak azokkal, amiket a DB létrehozásakor írtunk az Initial value oszlopba.
Gépfüggő, de ha erre nem gondolunk, az ilyesmiből komoly botrány és anyagi kár keletkezhet. Gondoljunk csak arra, hogy ha egy gyártósor pl. többféle termék előállítására is beállítható és az adott termékre vonatkozó technológiai beállításokat ilyen módon megsemmisítjük egy működő gépben, tönkremehet az összes termék ami a gépben van épp.
A jobbik esetben mindez csak bosszúságot okoz, mert újra be kell pötyögni az összes beállítást, ami eltér az említett kezdeti értéktől. A dolog tehát káros.

Többféle mód is kínálkozik az elkerülésére. Az egyik, hogy soha nem módosítjuk a programot, de minden programozó tudja, hogy nincs az a program amit soha nem módosítanak (kivéve talán a "Helló world"-öt :). Vagy mindig úgy módosítjuk a programot, hogy ha pl. új beállításokra van szükség, azokat mindig új DB-ben hozzuk létre, így nem kell a meglévőhöz hozzányúlni, így feltölteni sem. Ez nem túl elegáns megoldás, de működik. Azonban senkinek nem ajánlom, mert  ha sokszor kell ilyet tenni egy programmal, akkor jelentősen növeljük vele a káoszt, amit néha enélkül is komoly erőfeszítés elkerülni. A legjobb módszer talán az, ha a módosítás előtt a PLC-ben lévő adatblokkot a letöltjük a PC-re és a módosítást azon végezzük el, majd visszatöltjük.

DB letöltése a PLC-ről

DB-t ugyanúgy lehet a PLC-ről letölteni, mint bármelyik program blokkot, de ennek is több módja van, íme az egyik:
Miután összekötöttük a PC-t a PLC-vel, kattintsunk a Simatic manager eszköztárában az Online ikonra:



Vagy válasszuk a View menüből az Online pontot. Kis idő elteltével megnyílik egy online ablak a Simatic managerben (az ablak online mivoltát a fejlécben jelzi). Az itt látható blokk lista a PLC pillanatnyi tartalma. keressük ki a letöltendő DB blokkot, jelöljük ki (akár többet is) és jobb gombbal kattintva az előbukkanó menüből válasszuk a Copy pontot, vagy nyomjuk meg a Ctrl-C gombokat.



Váltsunk át az offline ablakra (Ctrl-TAB) a blokk listában jobb katt, előbukkanó menüben Paste vagy nyomjuk meg a Ctrl-V gombot. Tehát a jó öreg copy/paste itt is működik.
Ha nem csak az az egy project van megnyitva a Simatic managerben, akkor nagyon figyeljünk oda arra melyik projectbe illesztjük bele az online blokkot, mert határincidensek lehetnek!
Ezután jön a kérdés, hogy felülírhatja-e a blokkot, válaszoljunk igennel. Most már az online ablakot bezárhatjuk.
Ha most megnyitjuk az offline projectben az imént áttöltött blokkot, első ránézésre semmi változást nem fogunk észrevenni (ha mégis, akkor baj van), mivel megnyitáskor csak az initial value értékei láthatók, amik nem változtak meg az áttöltés során.
Ha azonban a View menüben átváltjuk a nézetet data view-re, akkor megjelenik egy új oszlop, az Actual value.



Ez tehát a PLC-ről letöltött DB, ami a PLC-ben lévő összes aktuális adatot tartalmazza. Ez látható az Actual value oszlopban. Az Initial value továbbra is változatlanul az, amit kezdetben megadtunk.
Ha most módosítjuk a DB-t, akkor a korábbi adatok, amikhez nem nyúlunk hozzá, frissek lesznek visszatöltéskor (ugyanaz töltődik vissza, ami a PLC-ben van, vagyis nem változik, nem vész el). Az új bejegyzések tartalma pedig az Initial value értéket veszi fel.

Ha az offline blokk és az online blokk szerkezete eltér és letöltjük a blokkot a PLC-ről, akkor a blokk szimbólum információi elvesznek, ami felettébb kellemetlen. Ha megnyitjuk a blokkot, a következő üzenet fog megjelenni:



Majd a blokk megnyílik, de nem lesznek benne a változó nevek és a megjegyzések:



Mivel  névnek mindenképpen lennie kell, a rendszer elnevez minden bejegyzést STAT0, STAT1, stb nevekkel.
A DB a PLC-ben lévő adatokat fogja tartalmazni ilyenkor is. Ha szimbolikus címzést használunk, akkor ez az eset használhatatlanná teszi a blokkot. Ha abszolút címzéssel dolgozunk - amikor a DB tartalmára a bejegyzések címeivel hivatkozunk és nem a neveivel - a program működését a nevek elvesztése nem befolyásolja, a program áttekinthetőségét azonban rontja.
A nevek akkor sem jelennek meg, amikor a blokkot már módosítottuk, de még nem töltöttük a PLC-re, és megnyitjuk online-ban a PLC-ben lévő blokkot.
Ekkor az adatok még nem vesztek el, ezért még marad lehetőségünk azokat kézzel egyenként átírni az offline blokkba még áttöltés előtt. Ha a DB túl nagy, akkor ez nagyon munkaigényes dolog.

Az aktuális adatok visszanyerése a DB forrásából

A fentiekből kitűnik, hogy ha a DB szerkezetét a blokk azon változatán hajtjuk végre amely nem a gépben lévő aktuális adatokat tartalmazza, akkor komoly problémába ütközünk amikor áttöltjük a DB-t a PLC-be, mivel a PLC-ben lévő adatokat felülírjuk a régiekkel.
Sajnos sok esetben nincs mód arra, hogy a módosítást az aktuális adatokat tartalmazó DB-n végezzük pl. azért, mert a működő rendszer telephelyünktől távol van és nincs lehetőség a DB letöltésére a módosítás előtt. Alternatíva lehet az is, ha a módosítást nem végezzül el előre, csak majd a helyszínen, amikor már letölthetjük a PLC-ből az adatblokkot. Ez azonban azt jelenti, hogy a gép mellett kell megoldani olyan feladatokat, amit előre is el lehetett volna végezni.
Ha egyik sem kivitelezhető, akkor még mindig marad három lehetőségünk:
  1. Egyszerűen nem foglalkozunk a DB tartalmával és rábízzuk a gép üzemeltetőire hogy újra mindent beállítsanak
  2. Ha az adatok valamilyen módon a rendelkezésünkre állnak, azokat a módosított DB-be kézzel beírkáljuk utólag
  3. A módosított és a PLC-ben lévő DB-ből forrásprogramot generálunk és az aktuális adatokat a forrás szintjén átrakjuk az új blokkba
Az első két módszerre nem érdemes túl sok szót fecsérelni, de a harmadik módszer még beválhat.
A DB adatainak ily módon történő átmentésének módszere Murin Ákos ötlete, köszönet érte!

Készítsünk egy másolatot a project könyvtárról szőröstül-bőröstül, mielőtt bármit módosítanánk. Fontos, hogy ezt a project olyan változatával tegyük, ami teljesen azonos azzal, ami a PLC-ben is működik. Az, hogy a DB-k tartalma nem aktuális, az nem baj, de a program és adatblokkok szerkezete legyen azonos.
Készítsük el a módosítást, egyelőre ekkor még ne törődjünk az adatok aktualitásával.

A következő lépés, hogy a módosítás előtt lementett project DB blokkjának tartalmát aktualizáljuk.
Ehhez a helyszinen (miután rácsatlakoztunka  PLC-re) nyissuk meg az elmentett (tehát a módosítás előtti) projectet. Váltsunk át az online ablakra a Simatic managerben
Az online ablakból a blokkot másoljuk át az offline ablakba. Zárjuk be az online ablakot.
Érdemes megtartani ezt a másolatot már csak abból a megfontolásból is, ha a módosítással valami gond lenne, ezt visszatöltve visszaállíthatjuk a módosítás előtti állapotot. Ha a projectünkben több olyan adatblokk is van amiben fontos adatok vannak és az offline változat esetleg elavult, azokat is érdemes átmásolni, hogy a mentés teljes legyen.
Most tehát van egy olyan mentésünk a módosítás előtti rendszerről, ami teljes mértékben a PLC-ben lévő változat másolata.

A következő lépés, hogy a szóbanforgó adatblokkból forrást generáljunk.
Indítsuk el a program editort ha még nem fut (STL/LAD/FBD editor, amiben a programot és adatblokkot lehet szerkeszteni). Ha meg van nyitva az adatblokk, akkor zárjuk le.
A program editor file menüjéből válasszuk a Generate source menüpontot. A megjelenő dialógusba írjuk be a blokk nevét az Object name után:



Célszerű a blokk forrása számára olyan nevet választani, amiből később is tudni fogjuk, hogy ez a PLC-ben lévő eredeti DB blokk.
A következő ablakban lehet beállítani, hogy mely blokkokról akarunk forrást készíteni. Ez két listát tartalmaz, kezdetben a bal oldalon a projectünkben szereplő összes blokk fel van sorolva. A blokkokat a nyilakkal átrakhatjuk a jobb oldali listába. A jobb oldali listában szereplő összes blokkról készít STL forrást:



Nekünk most csak a DB1-ről kell.
A művelet eredményeképpen a project struktúra Source elemében keletkezett egy DB1_eredeti nevű forrásprogram, amiben benne van az összes adat is, amit a PLC-ből töltöttünk át:



Most nyissuk meg a módosított DB-t tartalmazó projectet is. A fentihez hasonló módon a módosított blokkról is generáljunk forrást, aminek adjuk a DB1_uj nevet.
A két projectben most van két forrásunk. A DB1_eredeti tartalmazza a módosítás előtti adatblokkot, de eredeti, aktuális adatokkal. A másikban egy DB1_uj forrás van, amiben a módosított DB van, de régi adatokkal.
Át kell tehát rakni a régi blokkból az aktuális adatokat az új blokkba,
Nyissuk meg mindkét forrást és a DB1_eredeti forrásból jelöljük ki a BEGIN és END_DATA_BLOCK közötti részt és helyezzük a vágólapra (Ctrl-C).



Váltsunk át a DB1_uj forrására és a BEGIN utáni sorba másoljuk be a vágólap tartalmát (Ctrl-V). Most töröljük azokat a sorokat amelyek változónevei azonosak azzal amit bemásoltunk.
Minden változó csak egyszer szerepeljen az értékadásnál!



Természetesen a két DB nem azonos, hiszen a DB1_uj forrásában benne vannak az új bejegyzések. Ezeket benne kell hagyni.
Hogy pontosan mit hova kell másolnunk, az nagyban függ attól hogy a DB-n milyen módosításokat követtünk el. A fenti példában a DB1 úgy változott meg, hogy egy Uj1 nevű integer változó került a végére.
Ha a változás nem csupán annyiból áll, hogy a DB-t további változókkal bővítettük ki, hanem meglévőket írtunk át, vagy valahova a belülre, vagy az elejére tettünk újakat, esetleg ezeket össze-vissza, akkor az aktuális adatok bemásolásával is sokkal nehezebb dolgunk lesz. De a DB-k ilyen jellegű módosítása nem gyakori. További változók felvétele a jellemző változás.
Amikor az aktuális adatokat bemásoltuk az új DB-be, fordítsuk le a forrást a program editor file menüjéből kiválasztott Compile (Ctrl-B) menüponttal. Ha minden jól ment, akkor a következő üzenetnek kell megjelennie:
Compiler result: 0 Error(s), 0 Warning(s)
Ezzel létrejött a módosított adatblokk, ami a PLC-ben lévő aktuális adatokat tartalmazza (természetesen ez csak azokra a DB változókra igaz, amelyeket a DB a módosítás előtt is tartalmazott).
Most már nincs más dolgunk, mint ezt a DB-t áttölteni a PLC-be.


Szirty