19. července 2016 | Štěpán Držka
Až do verze 4.7.2 platilo, že všichni tencí klienti systému Reliance připojení k datovému serveru (Reliance Server nebo Reliance Control Server) mají vždy stejná data, tj. hodnoty všech proměnných. V případě fyzických proměnných (např. hodnota hladiny v nádrži přenášená z PLC) je to samozřejmě v pořádku – každý klient musí mít stejný údaj o hladině v nádrži.
U pomocných (interních) proměnných už to může být jinak. V některých případech klienti nesmí hodnoty proměnných sdílet.
Jedním z takových příkladů může být aplikace, která zobrazuje data podle přihlášeného uživatele. Uživatel tenkého klienta se přihlásí, datový server na základě jeho jména připraví data (hodnoty proměnných), která se uživateli zobrazí. Jinému uživateli, který může být i současně přihlášen, se však musí zobrazit jiná (pro něj určená) data. Přitom oba uživatelé používají stejnou sadu proměnných a prohlížejí stejné vizualizační okno. Pro každého připojeného klienta tedy na serveru existuje samostatná verze těchto proměnných. Zde se nabízí otázka, jakým způsobem server připraví data pro klienta.
Lze to vyřešit pomocí skriptů, kdy každý skript vyvolaný tenkým klientem je spuštěn v jeho kontextu a pracuje vždy s jeho verzí proměnných. Pomocí funkce RScr.GetCurrentScriptDataEx je možné ve skriptu zjistit jméno uživatele a na jeho základě data připravit. V případě potřeby je možné zjistit i název relace tenkého klienta a tak ověřit, že byl skript vyvolán tenkým klientem (pokud by nebyl, bude název relace prázdný řetězec).
Dalším příkladem může být aplikace, jež zobrazuje uživateli obsah, který je určen hodnotou „řídicí“ proměnné.
Např. komponenta Kontejner umožňuje zobrazit data strukturované proměnné s dynamickou vazbou. Název strukturované proměnné je dán hodnotou jiné (řídicí) proměnné.
In Reliance 4.7.2, the name of the tag used in the Container component can be determined by another string-type tag. pic.twitter.com/neXAnjHRRg
— Reliance SCADA (@RelianceSCADA) October 7, 2015
V tomto případě je žádoucí, aby každý z tenkých klientů měl vlastní hodnotu této řídicí proměnné (každý potřebuje vidět data jiné strukturované proměnné). Hodnota řídicí proměnné se vůbec nemusí přenášet na server. Datový server s ní nepracuje.
Podobných případů existuje více a do budoucna lze očekávat, že jich bude přibývat s tím, jak se budou ve SCADA systému Reliance rozšiřovat dynamické vazby.
Výše popsané chování lze nastavit ve Správci stanic pro vnitřní proměnné pomocí kombinace dvou voleb: Sdílet s tenkými klienty, Přenášet mezi serverem a tenkými klienty:
Správce stanic – Sdílení
Sdílet s tenkými klienty |
Přenášet mezi serverem a tenkými klienty |
Chování |
ano |
– |
Datový server a všichni připojení tencí klienti mají společnou hodnotu proměnné. |
ne |
ano |
Hodnota proměnné je přenášena mezi serverem a klientem. Datový server udržuje pro každého připojeného klienta samostatnou hodnotu proměnné. |
ne |
ne |
Hodnota proměnné se vůbec nepřenáší mezi serverem a klientem. Hodnota zapsaná do této proměnné se nepřenáší na server, je uložena pouze ve vnitřní paměti tenkého klienta. |
Aby bylo možné ve skriptu pracovat s proměnnými specifickými pro tenkého klienta, je nutné, aby byl skript spuštěn v jeho kontextu. Toho se běžně docílí tak, že uživatel spustí skript z tenkého klienta na základě nějaké operace (přihlášení a odhlášení uživatele, kliknutí na tlačítko apod.). Někdy je však potřeba spustit skript v kontextu tenkého klienta bez jakékoliv uživatelské operace. K tomu slouží funkce RScr.ExecScript, která byla ve verzi 4.7.3 rozšířena o nepovinný parametr ExecForEachThinClient.
Pokud je hodnota parametru ExecForEachThinClient True, spustí se skript v kontextu všech aktuálně připojených klientů. To umožňuje např. aktualizaci hodnot proměnných specifických pro tenké klienty na straně serveru.