S7 300/400 indirekt címzés, pointerek

(jegyzet)

Mi az indirekt címzés?
Amikor egy adatterület egy olyan elemének a tartalmához akarunk hozzáférni, amelyik elem címét (sorszámát) előre nem ismerjük. A megcímzendő (írandó vagy olvasandó) elem száma futás közben pl. a technológiai folyamatok eredményei alapján, vagy a kezelő beavatkozására derül ki. Ilyen esetben a programba nem írhatjuk be az elem címét közvetlenül, mert nem ismerjük azt.
Írhatunk egy programrészt, ami a címzendő elem számának vizsgálatával egy minden lehetséges címzési kombinációt tartalmazó feltételsoron keresztülhaladva végül rátalál az előre rögzített címmel hivatkozott műveletre.
Az alábbi példa ezzel a módszerrel írt blokk részletét mutatja.

A blokk bemenete az #Index változó, a kimenetén Az "Adatok" táblázat indexben adott számú elemét adja vissza.
A blokk STL-ben (részlet):


Tehát minden index értékre meg kell írni a táblaelem címzését fix címmel. A feltételsonak ezért annyi eleme lesz, amennyi elemet a táblázat összesen tartalmaz.
Egy nagyon sok elemből álló táblázat címzését ezen a módon nem praktikus megoldani, vagy egyenesen lehetetlen.
Az indirekt címzés segít ebben. A lényege az, hogy nem a memóriaterület egy előre megadott elemére hivatkozik, hanem egy változó vagy másik memóriacella tartalma fogja meghatározni a címet.
A példa szerinti változó, ami a tömböt címzi, az #Index. Az indirekt címzést az alábbi példa pointerrel valósítja meg.
A pointer egy olyan adattípus, ami memóriaelemek címzésére használható.
A pointer pontosan azonosítja a memóriaterület byte és bit címét.





Tegyük fel, hogy a DB3 tartalma az alábbi:



A blokk "kívülről" létrában:

Az MW0 címzi tehát a DB3 tartalmát. Az MW0 tartalmával azonos sorszámú integer adatot kiolvassa a DB3-ból és a kimenetre teszi.
Az MW0 (#Index) 0-tól indul .
Ha MW0 tartalma nulla, MW2-ben 11 lesz. Ha MW0 tartalma 5, MW2-ben 16 lesz, Ha MW0 tartalma 8, MW2-ben 19 lesz, stb.

Figyelem!
Ez a néhány soros STL kód nem tartalmaz védelmet.
Ha #Index-ben olyan értéket adunk meg, amelyiknek megfelelő memóriacím nem létezik, (pl. jelen esetben 9-nél nagyobb számot), akkor a CPU area length error-al STOP-ra áll (hacsak nincs betöltve egy programming error kivédésére való hibakezelő OB, mert akkor az meghívásra kerül).
Tehát a pointeres indirekt címzés gyakorlati alkalmazásakor a pointer kiszámítása előtt az #Index értékét mindig ellenőrizni kell, hogy nem mutat-e túl a megcímzendő memóriaterület határain!

Kapcsolódó írások:

Szirty