Az ANY paramétertípus


Az ANY egy univerzális paramétertípus, ami képes leírni az S7 PLC többféle memóriaterületét és címzésmódját.
Általában olyan funkció meghívásakor használatos, amelyik univerzális, sokféle adattípussal tud dolgozni. Ilyen pl. az SFC20 BLKMOV (blokk másolás), vagy az SFC21 FILL (terület feltöltése) rendszerhívás is.

Az any formátuma adattípus esetén:

Az any paramétertípus 10 byte-os leíróval rendelkezik. Felépítése az alábbi:


Byte 0: Értéke mindig 10h

Byte 1: Adattípus.
Az adattípus határozza meg, hogy az any milyen típusú adatra mutat:

Az adattípus kód:

Hexadecimális kód
Típus
Leírás
b#16#00
NIL
Null pointer
b#16#01
BOOL
Bitek
b#16#02
BYTE
Byte-ok (8 bit)
b#16#03
CHAR
Karakterek (8 bit)
b#16#04
WORD
Word-ök (16 bit)
b#16#05
INT
Egészek (16 bit)
b#16#06
DWORD
Dupla word-ök (32 bit)
b#16#07
DINT
Dupla egészek (32 bits)
b#16#08
REAL
Lebegőpontos számok (32 bits)
b#16#09
DATE
Dátum
b#16#0A
TIME_OF_DAY (TOD)
Time of day
b#16#0B
TIME
Idő
b#16#0C
S5TIME
S5TIME, időzítő érték
b#16#0E
DATE_AND_TIME (DT)
Dátum és idő (64 bits)
b#16#13
STRING
Karakterlánc

Byte 2 és 3: Ismétlési faktor.
Az any által leírt adatterület mérete. A terület byte-ban kifejezett mérete függ az adattípustól. Az ismétlési faktor a típussal meghatározott adatok számát adja meg.
Ha az adattípus (Byte 1) értéke 02, és az ismétlési faktor (Byte 2 és 3) értéke 10, akkor az any típus 10 word-öt ír le (20 byte-ot).

Byte 4 és 5: DB száma.
Ha az any adatblokkra hivatkozik, akkor ide kerül az adatblokk száma, egyébként nulla.

Byte 6: Memóriaterület
Ez mondja meg, hogy az any a PLC milyen memóriaterületére hivatkozik. A területekhez tartozó azonosító kódok az alábbiak:

Memóriaterületek kódjai

Hexadecimális kód
Terület
Leírás
b#16#81
I
Bemenet
b#16#82
Q
Kimenet
b#16#83
M
Bit memória (merker)
b#16#84
DB
Adatblokk
b#16#85
DI
Instance adatblokk
b#16#86
L
Lokális változó (L stack)
b#16#87
V
Előző lokális változó
Byte 7, 8 és 9: Cím
Ez a három byte írja le a címet, a következőképpen:
A 7-es byte 03. a 8-as byte összes bitje, és a 4-7 bitjeiből összeálló 16 bit adja a byte címet, a 9-es byte 0-3 bitje pedig a bit címet.



Az any formátuma paramétertípus esetén:


Ezt a formátumot a Step7 rendszer akkor használja, amikor időtag, számláló, vagy adatblokk számát kell paraméterben átadni.

Az adattípus-kódok:

Hexadecimális kód
típus
Leírás
b#16#17
BLOCK_FB
FB
b#16#18
BLOCK_FC
FC
b#16#19
BLOCK_DB
DB
b#16#1A
BLOCK_SDB
SDB
b#16#1C
COUNTER
Számláló
b#16#1D
TIMER
Időtag

Példák any típusra:
Any
Leírás
p# M 50.0 BYTE 10
10 byte meerker területen MB50-től MB59-ig
p# DB10.DBX5.0 S5TIME 3
3 egymást követő S5TIME típusú időzítő adatot specifikál a DB10-ben DBB5-től DBB10-ig
p# Q 10.0 BOOL 4
4 kimeneti bitet ír le Q10.0-tól Q10.3-ig


Példaprogram az ANY típus használatára.

Tegyük fel, hogy a PLC méréseket végez, és a PLC egy már megírt programrésze a mérési adatokat óránként elhelyezi egy adatblokkban.
Tehát minden órában keletkezik egy REAL típusú adat, ami bekerül a DB22-es adatblokk elején deklarált 24 elemű tömbbe. A tömb minden eleme egy óra mérési adatát rögzíti.
Azzal a programrésszel nem foglalkozunk a példában, amelyik ezt, a blokk elején évő 24 elemű tömböt feltölti.
A feladat az, hogy minden nap végén az adatokkal teleírt 24 elemű tömböt átmásoljuk (elmentsük) egy másik adatterületre, méghozzá minden nap másikba.
A napi adatokat is a DB22-es adatblokk tartalmazza, az aktuális napi adatok tömbje után azzal azonos méretű, másik 31 db 24 elemű adattömb formájában. A DB22 deklarációs része a fentiek szerint így fest:


Természetesen a sor folytatódik egészen  Nap31-ig:



A példa egy funkcióblokkot mutat be, amelyik feladata az aktuális nap adatait egy paraméterben megadott sorszámú rekeszbe másolni.
A másolást az SFC20 (BLKMOV) beépített blokk másolás rendszerfunkcióval valósítja meg.
A programblokk a BLKMOV számára "felépít" egy any típusú paramétert, ami a másolás céterületére mutat.

A blokk hívása létrában:


Két bemenő paramétere van:
Index -  itt kell megadni, hogy a lehetséges 31 rekesz (nap) melyikébe másolja a napi adatokat.
Copy - Ezen a boolean típusú bemeneten érkező felfutó él hatására történik meg a másolás

A blokk Ok kimenete jelzést ad a másolás sikerességével kapcsolatban. True lesz, ha Sikerült, és False ha nem.
A blokk FB típusú, így szükséges egy adatblokk is neki, amit belső  munkaterületnek használ.
Erre csak az Copy bemeneten érkező felfutó él detektálása miatt van szükség. Az FB3 átírható FC blokkba is, ha a Copy átmeneti állapotát tároló munkaváltozót kívülről (egy paraméterben) biztosítjuk neki. Illetve az él figyelés eltávolítható, stb.

Az FB3 változódeklarációs része az alábbi:


A blokk STL forráskódja:



A blokk működésének leírása:

Miután az FP utasítással a #Copy bemenet állapotváltozásának felfutó éléből impulzust csinál, megvizsgálja az #Index értékét.
Erre azért van szükség, mert egy any pointeren keresztül ennek értéke alapján adja meg a BLKMOV funkciónak a cél blokk kezdőcímét.
Ha az #Index értéke negatív, vagy túl nagy, lenne, akkor a számított cím a blokk határain kívülre mutatna, aminek egy szép kövér area length error lenne a jutalma. Megfelelő intézkedések nélkül ez STOP-ba teszi a CPU-t.
Ennek elkerülése érdekében tehát amennyiben #Index értéke negatív, nullát rak bele, ha pedig nagyobb 31-nél, akkor nem fut le a másolás és az #Ok kimenetet is törli, jelezve ezt a tényt.
A blokk lényeges része a cél kiszámításával kezdődik.
Az oldal tetején látható ábra szerint az ANY mutató byte-jait egyenként kitölti úgy, hogy a DB22-es adatblokk egy 96 byte-os területére mutasson. A DB22-n belüli kzdőcímet az #Index-ből számítja ki.
Megszorozza 96-al. Mivel egy nap adatait tartalmazó REAL típusú adatból 24 van és a REAL típusú szám DWORD-ben üldögél, ami ugyebár 32 bit, azaz 4 byte. Tehát 24x4=96.
Az eredményhez hozzáad még 96-ot. Ez azért szükséges, mert az első nap adatai nem a DB22 elején, vannak, hanem a napi (forrás adatok) után, amik szintén 96 byte-ot foglalnak el (lásd az adatblokk felépítését feljebb). Ezzel létrejön a cél byte címe.
Az eredményt ezután egy duplaszóban eltolja balra 3 bittel. Ajobbról belépő bitek nullák lesznek.

Az ANY típus felépítésén látható, hogy a "b" betűvel jelzett byte címet tartalmazó bitek is3 bittel balra vannak a eltolódva, mert a Byte 9 alsó 3 bitje (x-el jelzett) adja a bit címet (ami itt nulla lesz).
A balra eltolás után tehát az any-nak megfelelő formában előállt a másolás cél blokkjának byte címe.
Hozzá kell még illeszteni azonban a Byte 6-on lévő memóriaterület azonosítót.
Mivel a mi cél blokkunk a DB22-ben van, ezért itt a DB adatblokknak megfelelő kódot kell megadnunk, ami 84h (lásd az oldal elején a memóriaterület kódjait felsoroló táblázatban).
Ezt a 84h hexadecimális számot bele kell illeszteni az imént kiszámolt, duplaszóban lévő byte címünkhöz. Mivel a byte 6 a duplaszó legfelső byte-ja lesz, ami jelenleg nullákat tartalmaz, kézenfekvő egy OD (Or Double word) utasítás.
Ezzel előállt a blokkmásolás teljes cél címe. Mivel a forráscím fix, ezért nincs szükség a forrás cím futás közbeni kiszámítására, egyszerűen bebetonozzuk a kódba.Ezután jöhet az SFC20 hívása.
Utolsó mozzanat az SFC20 visszatérési értékének (#RC) vizsgálata. Ha ez nem nulla, akkor az #Ok kimenetet törölni kell, ha nulla, akkor beállítani. Ezt végzi el az utolsó összehasonlítás.
A példaprogram az any felépítése mellett jó példával szolgál az AR1 address regiszter használatára is (regiszter indirekt címzés).

Felhasznált irodalom: Step7 Help, STEP 7 - Programming with STEP 7

Kapcsolódó írások:
Az ANY használata
Pointerek
S7 300/400 indirekt címzés, pointerek
S7-300/400 címtartományok, adattípusok


Szirty