Receptek kezelése WinCC Flexible HMI szoftverben

A leírás WinCC Flexible 2008 SP2 verzióról szólnak, más verziókban a leírtakhoz képest lehetnek eltérések.

Gyakori, hogy modern gyártó berendezésekkel többféle termék, vagy egy termék többféle változata is gyártható, feldolgozható. Egy átállás egyikről a másikra rendszerint a gép mechanikájának átállításával, esetleg cserélhető részek cseréjével és nem utolsó sorban a vezérlés által tárolt paraméterek megváltoztatásával jár.
Ha nincs túl sok megváltoztatandó paraméter, és/vagy a gyártható termékek száma nem nagy, akkor a szükséges néhány paraméter egy füzetből gyorsan átírható. Sajnos a füzettel az a baj, hogy vagy elvész, vagy egynél több van belőle :) Sokszor a felírt paraméter értékek hovatartozása nem egyértelmű, zavaros, nem lehet tudni melyik termékhez tartozik, vagy egyes paramétereknél több érték is szerepel. az adott termék neve mellett.
További jellemző probléma, hogy technológiai utasítás ide vagy oda, Pista bácsi így szokta gyártani, pali bácsi meg úgy, mert ha egy kicsi több megy bele a drága adalékból, akkor jobban halad a műszak, stb.

Ha sok a termékfüggő paraméter, akkor a káosz esélye is nagyobb lesz. A paraméter táblák gyors és egyszerű kezelésében segít a HMI recept kezelő funkciója. Azt sajnos nem állíthatom hogy ezzel elkerüljük a káoszt, de teljesen más jelleget adhatunk neki... :)
A recept tehát egy paramétertábla. Más szóval beállítások halmaza, amik TAG-ek (változók) értékeit tárolják a HMI eszköz háttértárolóján file-ban (ami egy egyszerű adatbázis).
A receptet tehát hasonlóképpen kell elképzelni mint ahogy egy konyhai receptet elképzelünk: hozzávalók mennyiségének számszerű leírása. Az ipari berendezések azonban sokfélék, nem mindegyik dolgozik különböző mennyiségű alapanyagok felhasználásával. Így a recept mennyiségeken kívül másmilyen adatokat is tartalmazhat,. Pl. pozíció értékeket, koordinátákat, hőmérséklet, nyomás, adatokat, időt, bármilyen adatot, amit a HMI-ben TAG-ek tartalmazhatnak.

A receptek kezelését WinCC Flexible-ben a Recipe View nevű objektum és a recept kezelő funkciók segítségével is kivitelezhetjük (vagy akár a kettővel együtt). A Recipe View egy átfogó megoldást kínál a kezelésre.
Segítségével a receptet:



A receptek szerkezete

Mielőtt rátérnék a Recipe View használatára, fontos megérteni a recept kezelés logikájának alapjait, különben könnyen előfordulhat, hogy nem tudjuk melyik receptet látjuk, mi van file-ban és melyik szerint működik a PLC-s vezérlés.
Egy recept több helyen is lehet egyszerre:


A PLC-ben pl. DB-kben(1), HMI recept TAG-ekben (2), a recept szerkesztőben (vagyis a HMI Recipe View-et tartalmazó képernyőjén) (3) és a háttértáron, file-ban (4).
A négy hely között a Recipe View objektum segítségével és a recept kezelő funkciókkal mozgathatjuk az adatokat, oda-vissza.
Ha tehát receptet akarunk váltani, akkor előbb be kell azt tölteni file-ból a szerkesztőbe, majd a szerkesztőből elküldeni a PLC-be. A PLC-ben a recepthez hozzárendelt TAG-ek csak akkor veszik fel a receptben tárolt értékeket, amikor a receptet elküldjük a Recipe View-ből a PLC-be. Recept kezelő funkcióval lehet közvetlenül file-ból PLC-be küldeni recept adatokat (lásd később).
Lényeges, hogy a recept TAG-ek tartalma a HMI-ben nem frissülnek automatikusan (ciklikusan), ahogy azt egyébként a TAG-ektől megszoktuk és ez akkor is agy van, ha a recept TAG acquistion mode tulajdonságát cyclic continuous-ra állítottuk be! A TAG tartalma tehát nem mindig ugyanaz, mint ami a PLC-ben a TAG által hivatkozott címen van.
Ezért jó tanács, hogy a recept TAG-eket a HMI-ben mindig a recept kezelő funkciókkal kezeljük és ne írjuk közvetlenül (pl. input mezőkkel).

Hogyan épül fel egy recept?
A recept egy fix adatstruktúra, amit előre fel kell építenünk a WinCC Flexible-ben a Recipes alatt:



A recept elkészítésekor megadjuk az összetevőket (elements). Ezeket nevezzük adatmezőknek.
Több receptet is készíthetünk, mindegyik állhat teljesen más összetevőkből. Vagyis lehet több vagy kevesebb adatmezőből és azok típusa is tetszőlegesen eltérő lehet.
A recept definíciója tulajdonképpen csak az adatstruktúra, valamint az összetevők és a változók közötti kapcsolat leírása, egyfajta váz. A tényleges adatok rekordokban vannak. Egy recept több rekordból állhat (elvileg egyből is állhat, de annak nem volna túl nagy gyakorlati haszna). A rekordban a recept összetevőit (mennyiségeket) megadó adatmezők adattartalma van.

Egy recept számtalan rekorból állhat. Ezek nevét és tartalmát előre is megszerkeszthetjük, de a Recipe View objektummal újakat lehet készíteni és a meglévőket szerkeszteni. Új receptet azonban nem lehet az objektummal létrehozni, mert a receptek szerkezete fix, futás közben nem módosítható.
A recept így tehát rekordok összessége.
Egy-egy rekord tehát ugyanazon összetevőket tartalmazza, csak más-más mennyiség (adat) lehet bennük. Egy másik recept azonban állhat teljesen más és több vagy kevesebb összetevőből.
Így egy valami (termék) elkészítésének különböző módjait egy recept írja le. Az elkészítéshez szükséges mennyiségeket a rekordok tárolják. Egy másik recept már egy másik valami elkészítését írja le.
A "konyhai" logika szerint ha egy sütibe ugyanazok az anyagok kellenek, de ahhoz Mariska néni más-más mennyiségeket használ mint Lujza néni, akkor az egy másik recept. Itt nem, itt csak egy másik rekord ugyanazon recepten belül. A disznósajt viszont már másik recept, mert nem csak a hozzávaló anyagok mennyiségének az arányában tér el, hanem a hozzávalók számában és fajtájában is.

A hagyományos értelemben vett recept  sem csak az összetevők mennyiségét írja le, hanem az elkészítés módját, az elvégzendő műveleteket is. Persze mivel a HMI-s receptben csak adatokat lehet tárolni, algoritmusokat nem, így erre itt csak úgy van lehetőség, hogy az elkészítés módját a PLC-ben programozzuk, a HMI receptben pedig olyan adatokat (is) tárolunk, ami az erre felkészített program működését a kívánt módon befolyásolja.
Pl. olyan boolean (logikai) változókat veszünk fel a receptbe, amik TRUE tartalma esetén a gép végrehajt, FALSE tartalma esetén kihagy egy konkrét műveletet a műveletek sorából.

A recept összeállítása

Lássuk egy példán keresztül miből áll és hogyan használható a recept. Először tehát a recept struktúráját, változókhoz való kapcsolódását és alapértelmezett tartalmát kell összeállítani.
A Recipes / Add recipe  funkcióval létrejön egy új, üres recept, amit kitölthetünk.



Az Elements fül alatti táblázatban lehet a recept egyes összetevőihez tartozó adatokat beírni. Minden sor egy összetevőt ad meg és minden összetevőhöz hozzá kell rendelni egy változót.

Ha átváltunk a Data Records fülre, akkor előre elkészített rekordokat készíthetünk az összetevők konkrét mennyiségének beállításával, amik a runtime-ban azonnal elérhetők és használhatók.



Ezeket RT-ben Recipe View-ben törölhetjük vagy módosíthatjuk, de a runtime indulásakor újra létrejönnek azokkal az adatokkal, amiket itt megadtunk.
Természetesen a Data Records üresen is hagyható, akkor nem lesznek előre adatokkal kitöltött rekordok, minden rekordot a Recipe View-ben kell kitölteni.

A Recipe View objektum

A beállításokkal szabályozható az objektum alapvető viselkedése és itt adhatunk meg néhány általános beállítást.
valószínűleg fölöslegesen írnám le az összes opciót, a legtöbb szerepe már a nevéből is világos. Aki először használja a Recipe view-et, de a WinCC Flexible nem idegen a számára, az könnyen fog boldogulni vele. Néhány fontosabb, főleg erre az objektumra jellemző beállítás említésére szorítkozom.



Recipe
Data record
Megjegyzés:
Mivel az adatrekordok szerkesztése a recept adatokat megjelenítő táblázatban történik, ha a tábla megjelenítése ki van kapcsolva (Display table) akkor hiába engedélyeztük a szerkesztést, arra nem nyílik lehetőség a táblázat hiányában.
Ha használjuk a Tag for number/name lehetőséget, jegyezzük meg, hogy a változókba annak a receptnek és/vagy adatrekordoknak a neve vagy száma kerül, amelyiket az illető Recipe View objektummal kiválasztottunk (hiszen lehet több ilyen objektum egy projectben) és nem az, amelyiket elküldtük a PLC-nek! Vagyis az itt feltüntetett változókban az éppen szerkesztett vagy megjelenített recept adataira utaló tartalom lesz és nem a PLC-ben éppen működő recept adataira utaló tartalom!

View Type

A recept kezelő funkciók

A recept kezelő funkciók (függvények) ugyanúgy használhatók mint a többi funkció WinCC Flexible-ben. Néhány megkötés itt is előfordulhat, ami a hívásukra vonatkozik (nmelyik pl. nem hívható VB script-ből). A korlátozásokat a help részletesen leírja külön minden egyes funkciónál a Configurable objects táblázatban.

Az alábbi funkcióknak számos közös paramétere van. Ezeket összefoglalom az ismétlések elkerülése érdekében.

DeleteDataRecord
Adatrekord(ok) törlése.



Confirmation: Legyen vagy ne legyen a törlésre vonatkozó megerősítő kérdés. Ha Off  (0) nincs megerősítő kérdés, On (1) a rekord törlése előtt egy ablakban megkérdezi valóban törölni akarjuk-e.

Törli a megadott számú (vagy nevű) receptből a megadott számú (vagy nevű) adatrekordot.
Ha a Data record number/name paraméter értéke 0 (nulla) akkor a megadott recpet összes adatrekordját törölni fogja. Ha ezzel együtt be van kapcsolva a  Confirmation (On), akkor előtte a következő kérdés jelenik meg:



Ebben az esetben ha használjuk a Processing status kimenő paramétert, akkor 2 értéket kapunk (végrehajtás alatt) amíg a kérdésre nem válaszoltunk. Ha a válasz NEM, akkor is a 4-es értéket kapjuk (hiba nélkül befejezve). Sőt, szintén 4-et kapunk (és nem 12-t) ha a receptben már nincsenek adatrekordok, amikor azokat törölni akarjuk (még akkor is 4. ha nincs adatrekord és IGEN választ adunk a megerősítő kérdésre).

ExportDataRecords
Adatrekord(ok) exportálása CSV file-ba.



Ha az Overwrite paraméter With confirmation, és a file már létezik, akkor megkérdezi felülírja-e. A válaszig a
A recept adatrekordját, vagy (nulla rekordszám mellett) összes adatrekordját a File name paraméterben lévő elérési úton létrehozott csv file-ba menti. Processing status kimenő paraméter értéke 2 lesz amíg a kérdés függőben van, 12-t (hiba) kapunk "Nem" válasz esetén, és 4-et (ok) ha igennel válaszoltunk és a file kiírása is sikeres volt.

Egy rekordot tartalmazó CSV export fil eszerkezete az alábbi:
List separator=;Decimal symbol=,
Próba recept ;
LANGID_40e;Rekord5
1;6
Recept1.Viz;2
Recept1.Alapanyag;34
Recept1.Adalek1;560
Recept1.Adalek2;565
Recept1.Adalek3;256
Recept1.PT;3
Recept1.KT;12
Recept1.Sz1;0
Recept1.Sz2;0
Recept1.Sz3;0
Recept1.Sz4;1
Recept1.Sz5;0


Az összes rekordot tartalmazó CSV export file szerkezete az alábbi:

List separator=;Decimal symbol=,;;;;;
Próba recept ;;;;;;
LANGID_40e;Recipe data record_1;R1_0;R2_0;R3_0;R4_0;Rekord5
1;1;2;3;4;5;6
Recept1.Viz;7;2;55;10;1;2
Recept1.Alapanyag;77;2;53;4;10;34
Recept1.Adalek1;77;0;22;333;1;560
Recept1.Adalek2;77;0;455;343;1;565
Recept1.Adalek3;77;0;365;433;1;256
Recept1.PT;777;0;366;4;1;3
Recept1.KT;7;0;221;4;1;12
Recept1.Sz1;0;0;1;0;0;0
Recept1.Sz2;0;0;0;0;0;0
Recept1.Sz3;0;0;0;0;0;0
Recept1.Sz4;1;0;0;0;0;1
Recept1.Sz5;0;0;0;0;0;0

Ha az Output status message opciót bekapcsoljuk, akkor a HMI rendszer üzenetek között az exportálásra vonatkozó bejegyzéseket is megtaláljuk, amelyek hibamentes export esetén az alábbi képet mutatják:




ExportDataRecordsWithChecksum
Adatrekord(ok) exportálása CSV file-ba ellenőrző összeggel.



Minden paraméterének ugyanaz a jelentése mint az ExportDataRecords funkciónak, de a CSV file minden sorát megtoldja egy ellenőrző karaktersorozattal:
List separator=;Decimal symbol=,;"Checksum"
Próba recept ;;FYsokN
LANGID_40e;Rekord5;XT8cfF
1;6;CUwm1n
Recept1.Viz;2;D4daAG
Recept1.Alapanyag;34;+LUvDs
Recept1.Adalek1;560;RvbjDq
Recept1.Adalek2;565;zPqo10
Recept1.Adalek3;256;/pUDa0
Recept1.PT;3;Sl8f6X
Recept1.KT;12;aO50nn
Recept1.Sz1;0;qfBsa6
Recept1.Sz2;0;CqCQen
Recept1.Sz3;0;RO6qVY
Recept1.Sz4;1;4hmPDz
Recept1.Sz5;0;eOqbd0

Ez valamelyest védelmet jelent a file tartalmára nézve, pl. arra az esetre ha szövegszerkesztővel illetéktelenül módosítják benne az adatokat.

GetDataRecordFromPLC
Adatrekord kiolvasása a PLC-ből és a HMI memóriába írása.



A funkció kiolvassa a PLC-ből a rekord adatokat amik megjelennek a HMI Recipe View által megjelenített adatrekordban. Ha a Recipe View  a képernyőn van amikor ez a funkció lefut, akkor a változás nem lesz látható benne (a kijelzés nem frissül automatikusan)!
A funkció a recept rekordokat tároló file-ok tartalmára nincs hatással, csak a HMI memóriájába olvassa be PLC-ből az adatokat.
Lényegében egyenértékű a Recipe view objektum adat olvasás a PLC-ből nyomógombjával:

GetDataRecordName
Visszaadja a paraméterben adott számú recept nevét és adatrekord számát. (Mint az fentebb kiderült, a receptekre és rekordokra hivatkozhatunk azok nevével is, itt ennek annyi értelme lehet, hogy leellenőrizzük létezik-e az dott név)



Process status-ban 12-t kapunk ha a hivatkozott recept vagy rekord nem létezik.

GetDateRecordTagsFromPLC
A recept változók tartalmát közvetlenül kiolvassa a PLC-ből és a megfelelő HMI Tag-ekbe írja. A funkció a recept rekordokat tároló file-ok tartalmára nincs hatással.



A GetDataRecordFromPLC-funkciótól annyiban tér el, hogy ez nem a recep rekordot tároló memóriába írja be a PLC-ből kiolvasott adatokat, hanem a HMI TAG-ekbe, amiket a recepthez hozzárendeltünk a recept elkészítésekor!
Más szóval frissíti a HMI-ben a PLC-ből az adatokat (mivel itt nincs ciklikusan automatikus frissítés). Akkor használatos, amikor a recepthez tartozó változók tartalmát a PLC program módosítja (pl. automatikus betanítás).

ImportDataRecords
Beolvassa CSV file-ból a megadott recept adott rekordját.



Hiba esetén a Process status itt is12-t ad (pl. ha a megadott CSV nem létezik, vagy nem tartalmazza a kért rekordot). Ha a Data record number/name paraméter nulla, akkor a file-ban lévő összes rekordot beolvassa. Ha van már olyan számó rekord a receptben, és az Overwrite paraméter With confimation, akkor mindegyikre külön rákérdez.

ImportDataRecordsWithChecksum
Beolvassa CSV file-ból az ellenőrző összeggel ellátott recept adott rekordját.



Ha az ellenőrző összeg nem felel meg a tratalomnak, akkor 12-es kódot ad Process status kimenő paraméterben.

LoadDataRecord
Betölti a recept adott rekordját abból a file-ból, amelyiket megadtuk a receptek tárolására.



A funkció ugyanazt csinálja, mint a "Load" nyomógomb a Recipe view objektumban

SaveDataRecord
Elmenti a recept adott rekordját abba a file-ba, amelyiket megadtuk a receptek tárolására.



A funkció ugyanazt csinálja, mint a "Save" nyomógomb a Recipe view objektumban

SetDataRecordTagsToPLC
A GetDateRecordTagsFromPLC funkció párja.



A recept változók tartalmát közvetlenül kírja a PLC-be.
A recept TAG-ek tartalma nem feltétlenül azonos a Recipe View objektum által megjelenített adatokkal. Főleg ha a recept TAG-eket közvetlenül i smódosítjuk más HMI funkciókkal

SetDataRecordToPLC
A GetDataRecordFromPLC funkció párja.
Adatrekord kiolvasása a HMI-ből és a PLC-be írása.



A funkció a PLC-be küldi azokat az adatokat, amelyek a Recipe View által ki vannak választva.

SetRecipeTags
Elvileg megszünteti vagy újra felépíti a kapcsolatot a megadott recept változói (TAG) és a PLC között.



A Status paraméterben mondjuk meg neki hogy Offline vagy Online állapotot hozzon létre ami a Recipe number/name TAG-jeire vonatkozik. A Toggle oda-vissza kapcsolgat Online és Offline állapot között.

Problémák

Saját tapasztalatom szerint az, hogy a recepteket tartalmazó adatok sok helyen lehetnek egy időben (főleg ha ezek nem ugyanazok az adatok) félreértésekre adhat okot.
A probléma főleg az, hogy amikor egy adatrekordot a PLC-be ínak és az a rekord adatai szerint kezd működni, majd utána más adatrekordokat megnéznek szerkesztenek exportálnak, importálnak stb... akkor csak a PLC-ben lévő adatrekordok tartalma az egyetlen támpont hogy melyik adatrekord lett áttöltve a PLC-be.
Sajnos ha egy rekord sok adatmezőből áll, akkor azok tartalma szerint ránézésre nehéz azonosítani a letöltött rekordot.

Természetesen ha csak egy ember kezeli a receptváltásokat és másnak nincs erre lehetősége, akkor kézben tartható a dolog. Ha azonban többen is megtehetik ezt, akkor a PLC és a HMI alapesetben nem tud segíteni a rekord azonosításában. De egy kis plusz munkával segíthetünk ebben.
Azt gondolhatnánk, hogy ott van a Recipe view General beállításoknál opcionálisan megadható Tag for number/name, ami remekül megfelel erre. Sajnos nem, ezek a TAG-ek annak a receptnek és rekordnak az adatait veszi fel, amelyiket a Recipe View-el éppen kiválasztottunk a listából. Tehát már azelőtt felveszik egy recept adatait, hogy azt a PLC-be elküldenénk. Erre tehát nem támaszkodhatunk, minket nem ez érdekel, hanem hogy melyik adatrekord lett a PLC-be elküldve.
Sajnos a Recipe View objektum Transfer To PLC nyomógombjához nem fűzhetünk semmilyen eseményt, így nem lehetünk biztosak abban, hogy az a rekord van a PLC-ben amelyik nevét/számát a két TAG pillanatnyilag tartalmazza.

Egy másik lehetőség ami felcsillan, a recept kezelő funkciók használata. Pl. oly módon, hogy letiltjuk a Recipe View Transfer To PLC gombját és saját gombot használunk az adatok PLC-be küldéséhez, mert így a gombhoz további funkciókat is hozzárendelhetünk. Vagyis a gomb megnyomásakor éppen kiválasztott rekord és recept nevét elhelyezhetjük egy-egy TAG-ben, így biztosak lehetünk abban, hogy a PLC-ben annak a rekordnak az adatai vannak, emyliket a TAG tartalmazza...
Vagy nem?... Lássuk:

Egy egyszerű példa mutatja be a várható nehézségeket. A példa csak egy receptet használ, de több adatrekordot.
A célnak talán megfelel, ha a Recipe View-nek adunk egy változót, ahova beleteszi az éppen kiválasztott adatrekord számát. Létrehozunk egy gombot, amihez hozzárendeljük a SetDataRecordToPLC funkciót és az iménti változóval megmondjuk neki melyik rekordot töltse a PLC-be:

A Recipe View beállítása:


A nyomógomb Event beállítása:


Így amikor A Recipe View-ben kiválasztunk egy rekordot, annak száma azonnal beíródik a Recpet1.KivRekordSzama TAG-be. Amikor pedig megnyomjuk a gombot, lefut a SetDataRecordToPLC funkció, ami a PLC-be küldi ezt a rekordot, utána a SetValue funkció Recpet1.KivRekordSzama TAG tartalmát belemásolja a Recpet1.LetRekordSzama TAG-be. Ez fogja megmondani (elvileg) melyik rekord van a PLC-ben, a technológia amelyik rekord szerint működik.

A módszer tökéletes addig, amíg a SetDataRecordToPLC funkció hibamentesen fut le.Sajnos a SetValue mindenképpen végrehajtásra kerül, attól függetlenül, hogy a PLC-be átkerültek-e a kiválasztott rekord adatok, vagy sem. Ha hiba van, az adatok nem kerülnek a PLC-be, de a Recpet1.LetRekordSzama TAG ennek ellenére is annak a rekordnak a számát fogja tartalmazni amelyiket át akartuk küldeni de az valamiért nem sikerült, így ekkor ez az adat nem felel meg a valóságnak.
Az érték adást tehát feltételhez kell kötni. csak akkor szabad lefutnia, amikor az adatközlés sikeres volt.Ezért vegyük ki ezt az érték adást a gomb eseménye alól.

Ki kell használni, hogy a SetDataRecordToPLC egy változóban közölni tudja, hogy a művelet sikeres volt-e vagy sem.
Paraméterezzük úgy a SetDataRecordToPLC funkciót, hogy a ProcessingStatus kimenete egy változóba kerüljön. A gomb megnyomásához a a SetDataRecordToPLC hívása elé, vagy a receptváltást tartalmazó screen Loaded eseményéhez helyezzük el ennek a változótartalomnak a törlését (=0) végző hívást:



Így most már csak azt kell kifigyelni, hogy a ProcessStatus TAG értéke mikor változik 0-ból 4-re (4= funkció hiba nélkül befejeződött). Sajnos egy TAG-nek csak a változásás eseményéhez tudunk funkciót hozzárendelni, amit nem lehet úgy szűkíteni hogy csak akkor fusson ha 0 volt és 4 lett.
De pont ezért scriptelhető a WinCC Flexible. Tehát mivel ekkor az értékadást már feltételhez kötöttük, avagy a kiválasztott rekord változó tartalma csak akkor kerülhet bele a letöltött rekord számát tartalmazó változóba ha a PLC-be töltés sikeres volt, kénytelenek vagyunk scriptet alkalmazni.

A mi scriptünk egyszerű, nincs paramétere.
Megvizsgálja, hogy ProcessStatus TAG tartalma 4-e. Ha igen, akkor beleírja LetRekordSzama (PLC-be letöltött rekord száma) TAG-be KivRecordSzama (kiválasztott rekord száma) tartalmát.Ha nem négy, akkor nem írja bele.
Utána nullázza ProcessStatus-t.



Most ezt a scriptet meg kell hívni, ha a ProcessStatus tartalma megváltozik. Ez úgy kivitelezhető, hogy a ProcessStatus TAG Events tulajdonságai között a Change value eseményéhez berakjuk a scriptünk hívását:



Így elvileg amikor a gombra kattintva lefut a SetDataRecordToPLC hívás, akkor az megváltoztatja a ProcessStatus TAG-ünk tartalmát, mire lefut a script, ami megvizsgálja 4 van-e benne (mivel 4 jelenti a sikeres letöltést).
Gyakorlatilag azonban nem ez történik.
Sajnos ugyanis a ProcessStatus TAG change value event-je nem jön létre akkor, ha a ProcessStatus TAG értékét a SetDataRecordToPLC hívás változtatja meg. Az event minden általam kipróbált más esetben létrejön (input mezőben átírva, más, pl. SetValue funkcióval átírva, stb) de ha a SetDataRecordToPLC hívás változtatja meg, akkor nem veszi észre a változást és a scriptünk nem fut le. Ez nyilván egy hiba lehet a WinCC Flexible-ben, talán egy újabb változatban vagy SP-ben ki lesz javítja.

Mindenesetre a hiba miatt célunk eléréséhez más megoldás után kell néznünk
Nézzük mi volna, ha a scriptet a nyomógomb event-jéhez tennénk a SetDataRecordToPLC hívás után. Így lefutna a PLC-be írás, rögtön utána pedig a script, ami megállapítaná sikeres volt-e. Sajnos ez sem jó a rendszer nem időzik a SetDataRecordToPLC funkcióban addig amíg az el nem végzi a műveletet, ezért a rendszer csak egyszerűen átfut a scriptünkön, szinte azonnal meghívva azt, miközben a PLC-be írás még javában tart (vagy éppen csak elkezdődött). Így a legjobb esetben is a script 2-t talál a ProcessStatus változóban, 4-et vagy 12-t nem, mivel a művelet csak jóval a script lefutása után fejeződik be valamilyen eredménnyel.

Mit tehetünk még? Nos "taknyolhatunk" is. A Scriptet a gombbal hívjuk a SetDataRecordToPLC hívás után és teszünk bele egy ciklust, ami megvárja, hogy a ProcessStatus 12 vagy 4 legyen. :)



Ez egy hurokban meg fogja várni hogy a ProcessStatus 4 vagy 12 legyen. Arra az esetre ha ez nem történne meg, a script használ egy CNT nevű belső változót, amit a ciklusmagban növel, hogy ne alakulhasson ki végtelen ciklus. Akkor is kilép, ha ez a változó nagyobb lesz 200000-nél. Így már valóban működik, a LetRekordSzama TAG értéke felveszi a PLC-be elküldött rekord számát, de csak akkor, ha az áttöltés sikeres volt.
Sajnos a LetRekordSzama tartalmából csak addig következtethetünk a PLC-ben lévő adatrekordra, amíg azt az áttöltés után nem módosították.


2012.10.22
Szirty