Copy/Paste a ProTool-ban

Gondolom senkinek nem kell bemutatni a másolás és beillesztés funkciót. A ProTool-ban is használható. A kijelölt elemet, vagy elemeket a CTRL-C gombokkal a vágólapra (clipboard) másoljuk, a CTRL-V gombokkal pedig a vágólap tartalma beilleszthető.
Hasznos funkció, gyorsítja a munkát, amikor ismétlődő, azonos részeket kell újra elkészíteni, vagy egymáshoz nagyon hasonló objektumokat lerakni, amikor egyszerűbb a másolatokat módosítani, mint újra létrehozni őket.

A copy/paste azonban két élű. Különösen akkor, ha egy ProTool project elkészítésekor másik, korábban elkészített projectekhez nyúlunk vissza és az ott már jól bevált megoldásokból merítve, a dolgokat elkezdjük átmásolgatni az új projectbe. Tovább fokozódik az "anomália", ha a másolás forrása több külön project.
A baj abból lesz, hogy a ProTool jót akar. :)
Amikor egy másik projectből egy tetszetősen beállított slider, vagy input field objektumot másolunk az újba hogy ott használjuk fel, a ProTool nem csak a kijelölt objektumot másolja át, hanem annak függőségeit is, méghozzá mindet!
Ha tehát a sliderhez a forrás projectben történetesen az MW10 merker word volt hozzárendelve, akkor az MW10 TAG-et is át fogja másolni. Ha ne adj isten az MW10 TAG-hez volt hozzárendelve funkció, ami teszem azt szerencsétlen esetben egy script, akkor bizony a copy/paste művelet hozza a scriptet is. Ha a script kimenete egy másik TAG-ba volt irányítva, akkor azt is átmásolja.
És ezzel nincs vége! A leggyönyörűbb ilyenkor az, ha netán a forrás projectben a ProTool  Controllers beállításánál a PLC, amihez a HMI kapcsolódik más nevet kapott mint a cél projectben, akkor azok a TAG-ek amiket a másolt objektum magával hoz, rossz hivatkozást tartalmaznának. Hogy ne legyen hibás hivatkozás, a másolási művelet egyszerűen átmásolja a controllert is!

Nézzünk erre egy példát:
Van két ProTool projectünk. OP1 és OP2. OP1 legyen a forrás, amiből át fogunk másolni egy slider objektumot, OP2-be.
Hogy ne legyen egyforma, az OP1 project Controller listájában a PLC neve: PLC_1, az OP2 projectben PLC_2.



A forrás projectben (OP1) egy input field objektum van a PIC_1 képen. Hogy a cél project se legyen teljesen üres, ezért az OP2-ben egy slider objektum van.


 
A bonyodalmaknak ezzel sincs vége. Mint látjuk egy egyszerű copy/paste művelet a TAG-ek másolását is jelentheti a függőségek miatt. De semmi garancia nincsen arra nézve, hogy a két projectben a másolás előtt nem létezik két azonos nevű TAG. Éppen így nincs garancia arra sem, hogy ha van két azonos nevű TAG, azok ugyanolyan nevű controller ugyanolyan memória területére és címére hivatkoznak.
Ha létezik itt is, ott is ugyanolyan nevű és az objektum másolásakor egy ilyen is másolásra kerül a koloncok között, akkor olyan konfliktus helyzet alakul ki, hogy két, azonos nevű TAG lesz egy projecten belül. Egy projectben nem lehet két azonos nevű TAG, ezért a másolatot a ProTool a másolás során átnevezi. Szerencsére van annyira jól nevelt, hogy ilyenkor az összes hivatkozás is megfelelően módosítja, ami az átnevezett TAG-re vonatkozik.
Ennek is van azonban egy következmény: Ha a TAG-ek neveit a memóriacímekhez igazítjuk (pl. az MW10-es merker word-re hivatkozó TAG nevének "MW10"-et adunk meg) akkor egy ilyen átnevezés után a TAG neve nem fog megfelelni a hivatkozásnak. Mivel a ProTool az átnevezést számozással oldja meg, ha egy TAG neve végén szám szerepel, akkor egyszerűen megnöveli egyel a számot. Így keletkezik egy olyan MW11 nevű TAG, ami a nevével ellentétben nem az MW11-re, hanem az MW10-re hivatkozik (ahova eddig is).
Ez önmagában működésbeli zavart nem okoz, de lábbal tiporja a TAG elnevezési koncepciónkat. Kellő figyelem nélkül ez komolyan megtévesztő lehet.

Visszatérve a példára, a forrás OP1 input mezője a "Mennyiseg" nevű TAG-hez kapcsolódik. Az OP2 slidere szintén "Mennyiseg" nevű TAG-hez kapcsolódik de csak a név azonos, ez a TAG természetesen a másik (OP2-vel kapcsolatban álló, PLC_2 nevű) vezérlőhöz van kötve, egy teljesen másik memóriaterületre hivatkozva.
A szemléltetés érdekében az OP1 példa project "Mennyiseg" TAG-jének change eseményéhez egy script is tartozik, aminek neve SCRIPT_1. A SCRIPT_1 kimenete az InternalTAG nevű TAG-be íródik, ami egy belső változó (No controller).
Az OP1 projectben tehát van egy Mennyiseg és egy InternalTAG nevű TAG, az OP2 projectben pedig egy Mennyiseg nevű TAG:



Az OP1 Mennyiseg TAG beállításai a funkció hozzárendelésnél az alábbi:



A SCRIPT_1 tartalma teljesen közömbös az ügy szempontjából, itt a lényeg csak az, hogy függvény legyen, tehát legyen legalább egy be és egy kimenő változója, ami másoláskor függőséget okoz. A script által tehát összefüggésbe kerül az InternalTAG és Mennyiseg nevű TAG.
Ha most kijelöljük az OP1 projectben a PIC_1 képernyőn az input mezőt, amit át akarunk másolni, majd CTRL-C-vel a vágólapra másoljuk, átváltunk az OP2 projectre, és a PIC_1 képen CTRL-V gombokkal beillesztjük az input mezőt, létrejön a másolat.
AZ OP2 projectben ott lesz az áhított input mező objektum.





A TAG és Controller listákban látható, hogy a másolás nem csak az input mezőt hozta át, hanem a koloncait is. Keletkezett egy InternalTAG és egy Mennyiseg1. Ráadásul ez utóbbi egy másik vezérlőre hivatkozik, ami szintén a másolás során jött létre: PLC_2.
Természetesen a script is ott van, ha benézünk a scriptek közé láthatjuk is.

Ezek után képzeljük el mi történik, ha pl. a Screens listában kijelölünk 5-6 képernyőt és azokat másoljuk teljes tartalmukkal együtt. Ha a kijelölt képernyők tele vannak aktív objektumokkal, amik scriptekre, TAG-ekre, különboző controller-ekre, text listákra, grafikákra hivatkoznak, egy csomó olyan dolog is átmásolásra kerül, amikről fogalmunk sincs a másolás végrehajtásakor.
Amellett, hogy esetleg sok fölösleges dologgal terheljük a projectünket, az átmásolt controllerek és név azonosság miatt átnevezett TAG-ek elég sok fejfájást okozhatnak egy meggondolatlan másolás után.
Klasszikus prabléma amikor egy controller is bejön a másolással és nem vesszük észre. Később a tesztelés során a HMI üzenget, hogy nem tudja felvenni a kapcsolatot ilyen meg olyan PLC-vel, miközben a project látszólag működik.

Bánjunk tehát óvatosan a másolással ProTool-ban, különösen ha másik project-ből másolunk.
A fenti csak egy példa. Nem csak input mező, TAG, controller és script okoz függőségeket, hanem gyakorlatilag mindenféle objektum és elem. Legyen az text list, grafika, vagy éppen egy közönséges statikus szöveg (gondoljunk csak arra, hogy a statikus szövegnek is megadható dinamikus attribútum vagy éppen az Enable tulajdonságnál változóval köthető össze a szöveg megjelenítése). Vagy ha olyan objektumot sikerül másolni, aminek köze van egy multiplex TAG-hez, valószínűleg át fogja másolni a fél projectet!

Szirty