Siemens d.o.o.
Avtor: Toni Zupančič
Svetova avtomatizacije in informacijskih tehnologij sta vse bolj združena. Na strani produkcijskega (OT) omrežja centralni nadzorni sistem oz. SCADA navadno predstavlja povezovalni element z aplikacijami iz IT okolja. WinCC Unified sistem ponuja številne integracijske protokole za vertikalno izmenjavo podatkov, ki bodo predstavljeni v nadaljevanju. Bolj podrobno bo predstavljena integracija preko GraphQL vmesnika, ki je v IT svetu precej uveljavljen. Prikazan bo tudi konkreten primer izmenjave podatkov preko omenjenega vmesnika s spletno stranjo.
WinCC Unified omogoča izmenjavo podatkov preko različnih protokolov in vmesnikov oz. API-jev (ang. Application Programming Interface). Poleg S7 komunikacijskega protokola, ki je namenjen horizontalni komunikaciji, je za izmenjavo podatkov največkrat uporabljen protokol OPC UA. WinCC Unified lahko deluje kot OPC UA strežnik ali odjemalec v Data Access ali Alarms & Conditions načinu. Prvi se uporablja za izmenjavo trenutnih vrednosti procesnih veličin, drugi pa za izmenjavo raznovrstnih sporočil, kot na primer alarmov. Z eksternimi aplikacijami lahko izmenjujemo podatke preko vmesnikov OpenPIPE in Runtime API. OpenPIPE je namenjen izmenjavi majhne količine podatkov. Vmesnik lahko sprogramiramo v kateremkoli programskem jeziku, ki podpira ‘pipe’ tehnologijo, smo pa pri tem načinu omejeni na izmenjavo trenutnih vrednosti procesnih veličin in alarmov oz. sporočil. Runtime API je namenjen izmenjavi večje količine podatkov. Dostopamo lahko praktično do katerihkoli podatkov našega SCADA sistema, od trenutnih vrednosti procesnih veličin, arhivskih vrednosti, alarmov, receptov, podatkov o uporabnikih in podobno. Runtime API vmesnik lahko sprogramiramo v programskih jezikih C# ali C++. Naslednja možnost je GraphQL, kateremu bomo v nadaljevanju namenili več pozornosti. Vsi komunikacijski protokoli oz. API-ji so integrirani v osnovni verziji WinCC Unified PC Runtime in za njihovo uporabo ne potrebujemo dodatnih licenc.
GraphQL
GraphQL vmesnik je razvilo podjetje Facebook (danes Meta) in ga leta 2015 izdalo kot odprtokodni vmesnik. Sestavljata ga dva dela, poizvedovalni jezik (ang. query language) in runtime okolje.Preko GraphQL poizvedovalnega jezika odjemalci od strežnika zahtevajo specifične podatke. Runtime okolje, ki deluje na GraphQL strežniku, sprejema poizvedbe odjemalcev in vrača podatke v strukturirani obliki, navadno v JSON formatu. GraphQL je podoben REST vmesniku, s to razliko, da GraphQL odjemalec natanko specificira katere podatke želi prejeti od strežnika. Posledično se izognemo prenosu podatkov, ki za nas niso relevantni. Z namenom zmanjšanja količine prenesenih podatkov je bil vmesnik prvotno tudi razvit. Facebook je takrat z njim reševal težavo nizkega prenosa podatkov do mobilnih naprav preko mobilnega omrežja. Vmesnik omogoča branje in zapisovanje podatkov na zahtevo ter ‘subscription’ model, pri katerem strežnik avtomatično posreduje odjemalcu podatke ob vsakokratni spremembi. V WinCC Unified nadzornem sistemu imamo preko GraphQL vmesnika dostop do trenutnih vrednosti procesnih veličin in sporočil oz. alarmov.
V WinCC Unified PC Runtime je GraphQL strežnik privzeto že omogočen. Vse kar moramo storiti je, da uporabnikom omogočimo dostop do vmesnika. Dostope uporabnikov urejamo v inženirskem orodju TIA Portal v razdelku ‘Security settings’. Imamo dve možnosti odstopa posameznega uporabnika, samo branje (query) ali pa branje in zapisovanje (mutation) vrednosti.
Za zajem podatkov iz GraphQL strežnika potrebujemo odjemalca. Za testiranje našega strežnika bomo uporabili Apollo GraphQL Client odjemalca. Omenjeni odjemalec deluje v spletnem brskalniku. Do njega lahko dostopamo preko povezave https://studio.apollographql.com/sandbox/explorer. Uporabimo lahko tudi druga orodja, kot na primer orodje Postman, ki je namenjeno testiranju različnih vmesnikov oz. API-jev. Z Apollo odjemalcem se najprej povežemo na naš GraphQL strežnik. Pod ‘Connection settings’ nastavimonaslova strežnika, preko katerih dostopamo do podatkov. Endpointnastavimo na »https:///graphql/« in Subscriptions na »ws://localhost:4000/graphql/«.GraphQL strežnik je v našem primeru na istem računalniku. Najprej moramo pridobiti žeton oz. token, ki nam služi za avtorizacijo pri poznejših poizvedbah. Žeton pridobimo s prijavo uporabnika, kateremu smo v TIA Portalu nastavili ustrezne pravice. Na prvi sliki je primer kode, ki jo preko odjemalca pošljemo na strežnik, da pridobimo žeton.
Po prijavi uporabnika od strežnika prejmemo žeton s časovno omejeno veljavnostjo. Ta žeton vključimo v glavo vsake poizvedbe. Podatki, ki jih vrne strežnik, so vedno v strukturirani obliki, kot je razvidno na drugi sliki.
Apollo Explorer orodje nam preko integriranega urejevalnika poizvedb omogoča enostavno programiranje le-teh. Uporabnik mora samo označiti katere podatke želi prejeti od strežnika, koda za poizvedbo pa se avtomatično generira. To kodo lahko pozneje uporabimo za poizvedbe preko lastne aplikacije, spisane v različnih programskih jezikih, kot na primer Python, JavaScript, C#. V našem primeru bomo kodo uporabili za izmenjavo podatkov preko spletne strani.
Izdelava spletne strani
Poizvedbe preko spletne strani izvedemo preko JavaScript kode, ki jo vključimo v HTML dokument. Za delo z GraphQL funkcijami potrebujemo ustrezno knjižnico. Knjižnico ‘graphql.js’ dobimo v dokumentaciji za WinCC Unified oz. jo prenesemo iz povezave na koncu članka. Za prikaz funkcionalnosti bomo uporabili enostavno spletno stran. Preko spletne strani bomo najprej prijavili uporabnika v sistem oz. pridobili žeton za avtorizacijo, ki ga potrebujemo ob vsaki poizvedbi. Za izmenjavo podatkov med strežnikom in našo spletno stranjo potrebujemo tri funkcije. Prva bo namenjena prijavi uporabnika oz. pridobitvi žetona za avtorizacijo, druga bo poizvedovalna funkcija za branje vrednost določene spremenljivke in tretja funkcija bo namenjena spreminjanju vrednosti spremenljivke. S ‘subscription’ načinom pridobivanja podatkov se tokrat ne bomo ukvarjali.
Preko funkcije za prijavo uporabnika v sistem pridobimo žeton za avtorizacijo pri poznejših poizvedbah. Poleg žetona dobimo tudi čas veljavnosti. Uporabniško ime in geslo smo zaradi lažje predstave vpisali direktno v samo kodo. V realnem primeru bi uporabniško ime in geslo vnesliv vnosni polji na spletni strani in bi ju posredovali preko spremenljivk. Vrednost žetona vpišemo v spremenljivko ‘AUTH_TOKEN’, ki jo moramo na začetku tudi definirati.
Funkciji za branje podatka na začetku dodamo ‘header’ z žetonom za avtorizacijo, ki smo ga prejeli v prvem koraku preko funkcije za prijavo. V zgornjem primeru od strežnika dobimo samo informacijo o vrednosti spremenljivke z imenom ‘GQLTag1’. Vrednost spremenljivke prikažemo na spletni strani preko HTML elementa z ID oznako ‘demo’. Če želimo poleg vrednosti pridobiti tudi časovno značko, enostavno dodamo atribut ‘timestamp’ v osmo vrstico kode za poizvedbo. Na enak način dodamo tudi ostale atribute, ki jih želimo prejeti. Če želimo prejeti vrednosti večjega števila različnih spremenljivk, le-te dodamo v oglatih oklepajih. V tem primeru šesto vrstico kode spremenimo v ‘tagValues(names: [»GQLTag1«, »GQLTag2«, …]) {‘.
Tretja funkcija je namenjena spreminjanju vrednosti določene spremenljivke. Tudi v tem primeru smo zaradi poenostavitve, fiksno določili vrednost, ki jo želimo zapisati v spremenljivko. Na podoben način, kot pri branju, lahko tudi pri spreminjanju vrednosti, določimo nove vrednosti večjemu številu spremenljivk naenkrat. Enostavno spletno stran s pripadajočo JavaScript kodo, vsemi potrebnimi knjižnicami in WinCC Unified PC Runtime projekt najdete na GitHub repozitoriju »WinCC-Unified-GraphQL-clanek« ali preko povezave vsebovane v QR kodi na koncu članka. To spletno stran bomo v nadaljevanju grafično obogatili. Za izdelavo grafičnih elementov, kot na primer grafov, diagramov in različnih prikazovalnikov vrednosti, si pomagamo z brezplačnimi knjižnicami. Dve takšni knjižnici s številnimi elementi sta Apache ECharts in Charts.js. Zelo uporabni sta tudi knjižnici Smoothie Charts in Gauge.js. Vse od naštetih na svojih spletnih straneh ponujajo urejevalnike, preko katerih elemente grafično in funkcionalno oblikujemo. Te elemente potem enostavno integriramo v naše spletne strani.
Naši spletni strani bomo dodali enostaven prikazovalnik vrednosti. Za naš primer bomo uporabil prikazovalnik z imenom ‘Speed Gauge’, ki ga dobimo na Apache ECharts spletni strani. Pred uporabno lahko prikazovalnik poljubno oblikujemo s pomočjo integriranega urejevalnika. Ko prikazovalnik uredimo po naših željah, lahko celotno kodo prenesemo v obliki HTML dokumenta. Izris na naši spletni strani naredimo kot funkcijo. Ob kliku na gumb se najprej izvede funkcija za branje podatkov in nato še druga funkcija, ki skrbi za izris našega prikazovalnika. V kodi za izris prikazovalnika, ki smo jo izdelali s pomočjo urejevalnika, moramo spremeniti samo vrednost za prikaz. Prednastavljeno fiksno vrednost, zamenjamo s spremenljivko, v katero preko funkcije za branje podatkov, zapisujemo vrednosti procesne veličine. Za uporabo Apache ECharts elementov moramo v spletno stan vključiti ustrezno knjižnico. To lahko storimo na dva načina. Lahko jo prenesemo iz njihove spletne strani, ali pa jo vključimo preko spletne povezave če imamo dostop do interneta.
GraphQL je namenjen predvsem izmenjavi manjše količine podatkov. Z njim si lahko pomagamo pri izdelavi tako imenovanih ‘dashboardov’ s prikazom KPI-jev. Primeren je tudi za posredovanje osnovnih podatkov in alarmov vzdrževalnemu osebju. Lahko pa ga uporabimo tudi za prikaz osnovnih podatkov posamezne izmene na velikih prikazovalnikih v proizvodnih obratih. Prednost uporabe GraphQL vmesnikaje v tem, da ne potrebujemo licence za dodatne oddaljene dostope.
Siemens d.o.o.
Letališka cesta 29c
1000 Ljubljana
https://www.siemens.si