Sok adat megjelenítése array tag használatával

(WinCC Flexible)

Rendszerint minden megjelenítendő vagy állítandó PLC változóra rádeklarálunk egy tag-et a WinCC Flexible-ben és úgy kezeljük azokat. Általában ez meg is felel a célnak. Deklaráljuk a tag-et, az objektumnak beállítjuk és készen is van.
Vannak esetek, azonban amikor nem csak egy-egy értéket kell megjeleníteni, hanem egész adat struktúrákat.
Pl. a rendszer számolja a terméket és elraktározza adatblokkban a számlált értékeket óránként naponta műszakonként stb. Ha ezeket az eltárolt értékeket megjeleníthetővé tesszük a HMI eszközön, akkor meg lehet nézni mennyi volt a termelés egy órája, tegnap vagy 6 műszakkal ezelőtt (attól függően,hogy az adatokat a PLC hogyan rögzíti).

A könnyebb érthetőség érdekében nézzünk egy konkrét példát:
Van egy berendezés, ami 4 párhuzamos gyártósorral rendelkezik, amin termékek mennek át. A PLC programja számlálja a termékeket a négy soron egymástól függetlenül. Minden sornak van a DB1-ben  egy 12 elemű adattömbje, azaz négy darab 12 elemű integer típusú adatokat tartalmazó tömbje:



Ebben az előző 12 óra számláló értékei vannak. A PLC program minden óra végén a tömbök tartalmát egyel arrébb lépteti és az aktuális számláló értéket beleteszi az első elembe, majd az aktuális számlálót törli. Így a tömb elemek növekvő indexein az egyre korábbi óra számláló értékei vannak. A PLC programmal nem foglalkozok ebben az írásban, a lényeg az így keletkező adatok megjelenítése.

A megjelenítést töbféleképpen is kivitelezhetjük:
A "hagyományos" módszer szerint mindegyikhez létrehozunk egy külön tag-et és minden egyes kijelzendő értékhez lerakunk egy IO Field-et, majd azokhoz külön beállítunk egy-egy tag-et. Itt 48 adatot kell megjeleníteni, ami hosszadalmas és monoton munkát jelent. Ráadásul pazaroljuk a tag-eket, hiszen azokból sem lehet akármennyi.

A tag-ekkel spórolhatunk úgy, hogy egy DB-ben létrehozunk egy másik, 12 elemű adatterületet. Ebbe belefér egy gyártósor 12 adata. Erre a 12 adatra hozunk létre 12 tag-et és kirakunk 12 output field-et a megjelenítéshez. PLC programban pedig egy a HMI-n elhelyezett kiválasztó mező tartalma alapján másoljuk a megfelelő adatokat erre a kijelző területre.



A másik két módszer az, hogy kihasználjuk azt a tényt, hogy az ilyen adatok a DB-ben szinte mindig egymást követő címen vannak. Ha nem így lenne, ezt a módszert nem tudnánk használni. Ha a DB-t is mi készítjük, akkor a megjelenítendő adatokat sorban helyezzük el. A példa szerint ezért az adatok sorban vannak egymás után elhelyezett tömbökben.

A módszer kulcsa az "array tag". Egy olyan változó a WinCC Flexible-ben, aminek több (egyforma) eleme van. Lényegében egy dimenziós tömb. A tag létrehozásakor lehet beállítani a tag tulajdonságainál, az Array elements oszlopban. Ez alap esetben 1. Ez mondja meg, hogy az adott tag hány darab olyan típusú elemet tartalmaz, mint amit beállítottunk:



Az ilyen tömb egyes elemei nem számítanak külön tag-nek, ezért ilyen változók felvételével kevésbé fogynak a tag-ek. Mint tudjuk a runtime licenszek a tag-ek számával korlátozzák a felhasználást (és mérséklik a licensz árát).
Egy ilyen tag minden elemére külön lehet hivatkozni egy index szám segítségével:



Ezzel megspóroljuk a 48 tag egyenkénti létrehozását, de 48 IO field lerakosgatását és egyenkénti beállítgatását nem.

Az utolsó módszer kicsit még bonyolultabb. Arra épít, hogy az output field-eket, amik az adatokat megjelenítik, egy faceplate tartalmazza. A faceplate egyik tulajdonsága, hogy adatstruktúrákat lehet neki átadni. Ezt a tulajdonságát fogjuk kihasználni.

A faceplate 12 output field-et fog tartalmazni, vagyis egy gyártósor adatait jelzi ki. Első lépésben hozzunk létre egy struktúrát a megjelenítendő adatok számára, a struktúrába tegyünk 12 integer típusú bejegyzést:



Készítsünke gy faceplate-et a Faceplates / Create Faceplate menüpont segítségével. Helyezzünk el a faceplate-en 12 Output field-et. rajzoljunk hozzá keretet, írjunk mellé szöveget ha szükséges, állítsuk be a megfelelő mező méreteket, színeket stb.
Készítsünk egy új property bejegyzést a property interface oldalon és adjuk meg neki a struktúra nevét, amit az imént deklaráltunk. Ha nem neveztük át, akkor a neve Property_1.



Így lesz egy Property_1 nevű, Structure_1 típusú bejegyzésünk a Properties listában.
Minden egyes mezőnek adjuk meg a Property_1 nevű struktúra egy-egy elemét egymás után, mint ha közönséges IO field-nek adnánk meg közönséges tag-eket a Process tag beállításnál.



Most van egy dobozunk (faceplate), amiben van 12 output field, és egy darab paramétert lehet neki átadni. A paraméter típusa az a struktúra, amit mi hoztunk létre és 12 darab integer változót tartalmaz.
Most készítsünk négy új tag-et. Mindegyik típusa legyen Structure_1. Az első kezdőcíme mutasson az adatokat tartalmazó DB első tömb kezdőcímére, a második a második tömb kezdőcímére, és így tovább:



Most tegyük le egy screen-re négyszer egymás utána  készített faceplate-et.



Minden faceplate Dynamic interface beállításánál a Property_1 paraméternek adjuk meg egymás után a négy Structure_1 típusú változónkat. amiket az imént deklaráltunk.



Eredmény: A faceplate a kívánt adatokat fogja mutatni. Az első az 1-es sor 12 számláló értékét, a második a kettes sorét és így tovább.

Kapcsolódó írások:
A WinCC Flexible faceplate-ek



Szirty