Wizualizacja w systemie SCADA ICONICS cz. 2

26.10.2020 How to / Oprogramowanie przemysłowe
Responsywna wizualizacja SCADA
Wizerunek autora
Wiktor Susfał Były pracownik Elmark Automatyka S.A.
Producent: ICONICS
  • Zakłady przemysłowe
  • Woda i ścieki
  • Górnictwo

Druga część poradnika konfiugracji responsywnych interfejsów SCADA. Integruj wbudowane komendy ze swoimi autorskimi skryptami .NET, buduj inteligentne ekrany HMI, stosuj interaktywną grafikę 3D. 

 

 

Ekran SCADA projektowany w oparciu o skrypty .NET

 

Skrypty dla ekranów SCADA w systemie ICONICS

 

Operacje takie, jak zapisywanie wartości do zmiennych, ukrywanie obiektów, tworzenie menu można wykonać w całości bez programowania. Co więcej, obecność takich modułów w Workbench, jak np. GridWorX - do komunikacji z bazą danych, pozwala na łatwe uzyskanie łączności z zewnętrznymi źródłami zmiennych.

Dane z większości modułów Workbench można natomiast zwizualizować za pomocą natywnych narzędzi w GraphWorX64. Tak więc operacje odczytu danych z baz SQL, czy śledzenia alarmów, a następnie ich wizualizacja może przebiec bez napisania jednej linii kodu. Wszystko opiera się na odpowiedniej konfiguracji określonych opcji.

Czasem jednak zdarza się, że końcowy klient wymaga pewnych specyficznych rozwiązań. Jeśli ich realizacja mogłaby być trudna, niemożliwa lub niepotrzebnie komplikowana z użyciem dostępnych komend, można posłużyć się własnymi skryptami.

Skrypty obsługujące ekran SCADA są pisane bezpośrednio w programie GraphWorX, służącym do budowy graficznych interfejsów. Niniejszy wpis powstał, aby nieco przybliżyć sposób tworzenia własnych funkcji wykonywanych podczas działania aplikacji.

 

Przykład użycia skryptu przy budowie ekranu SCADA

 

Poniżej przedstawiony jest prosty przykład. Powoduje on przepisanie wartości z jednej zmiennej do drugiej. Cały proces następuje po naciśnięciu określonego przez użytkownika przycisku. Wartości wyżej wspomnianych zmiennych są natomiast wyświetlane za pomocą dedykowanych okienek - ProcessPoint.

Pierwszą rzeczą, jaką należy dodać do interfejsu w GraphWorX są: dwa ProcessPoint'y (pokazujące wartość dwóch zmiennych) oraz przycisk. Następnie, do każdego z ProcessPoint'ów należy przypisać zmienną, której wartość wyświetlają. Ważną rzeczą jest nadanie każdemu z nich unikalnej dowolnej nazwy (pole "Name" pokazane na poniższym filmie).  

Skrypty i SCADA - Prosty Projekt cz1

 

Kolejnym krokiem jest przyporządkowanie do przycisku odpowiedniej komendy w jego ustawieniach, w zakładce "Dynamics". W tym przypadku będzie to "Run Script". Następnie, poprzez przejście do menu konfiguracji "Zdarzeń" (ikonka błyskawicy w zakładce "Dynamics"), możliwe jest otworzenie okna edycji skryptów i napisanie odpowiedniego kodu.

Zawartość kodu zaprezentowana jest poniżej.

 

var FirstProcessPoint = ThisConfiguration.GetDynamicObjectByName("PPT_1"); 
var First_PP_Value =FirstProcessPoint.GetValueOfPrimaryDataSource(); 
var SecondProcessPoint = ThisConfiguration.GetDynamicObjectByName("PPT_2"); 
SecondProcessPoint.WriteValueToPrimaryDataSource(First_PP_Value); 

 

Powyżej pogrubiono te nazwy, które użytkownik nadaje zmiennym w kodzie, w dowolny sposób. Oczywiście nazwy te należy zapamiętać i konsekwentnie później stosować.

Do zmiennych: FirstProcessPoint oraz SecondProcessPoint (będących obiektami) przyporządkowano elementy znajdujące się na ekranie SCADA, jakimi są dwa ProcessPoint'y. Do wykonania takiej operacji służy funkcja GetDynamicObjectByName, przyjmująca jako argument nazwę obiektu (nadaną w im w poprzednim kroku).

Następnie, do zmiennej First_PP_Value przepisano wartość z pierwszego ProcessPoint'a. Stało się to za pomocą funkcji GetValueOfPrimaryDataSource() nie przyjmującej żadnych argumentów.

Na końcu programu, wartość tej zmiennej jest przekazywana do drugiego ProcessPoint'a, a więc do tag'u, który jest dla niego źródłem danych.

 

Skrypty i SCADA - Prosty Projekt cz2

 

Skrypty czy wbudowane komendy?

 

Producent zaleca, aby używać własnych skryptów jedynie wtedy, gdy wykorzystanie wbudowanych funkcji jest albo zbyt skomplikowane, albo niemożliwe. Użytkownik nie powinien wykonywać wszystkich operacji na podstawie napisanego przez siebie kodu.

Powodem może być przede wszystkim malejąca przejrzystość aplikacji tworzonej w taki sposób. W przypadku kilkunastu linii kodu, wychwycenie ewentualnego błędu jest stosunkowo proste. Jednak w przypadku rozbudowanych aplikacji SCADA, liczba wszystkich linii skryptów może wzrosnąć do kilkuset lub nawet kilku tysięcy.

Następujące fakty mówiące, że:

  • tekstowa prezentacja programu jest mniej czytelna dla człowieka od graficznej,
  • dany program można napisać na kilka sposobów (nawet w ramach tej samej platformy),

czynią aplikace w pełni oparte na skryptach trudnymi do rozbudowy oraz modyfikacji. Szczególnie, gdy inżynier odpowiedzialny za poprawki nie jest tym, który tworzył pierwotny kod.

 

Dla porównania, można spojrzeć na poniższe wideo, które prezentuje, w jaki sposób szybko wykonać analogiczny prosty projekt, w oparciu o komendy.  

Skrypty i SCADA - Prosty Projekt za pomocą komendy

 

Bardziej przejrzysta aplikacja jest o wiele prostsza w rozbudowie oraz zarządzaniu.

 

Przykład projektu - współpraca aplikacji z plikami tekstowymi

 

Czytając tą sekcję dowiesz się, jak zaprojektować ekran SCADA działający w oparciu o skrypty, by współpracował z plikami tekstowymi.

Przypuśćmy, że użytkownik powinien móc wprowadzać w pole tekstowe dowolny komentarz, a następnie, za pomocą odpowiedniego przycisku zapisywać go do pliku. Co więcej, możliwy powinien być odczyt ostatniego komentarza z pliku, za pomocą tego samego pola tekstowego. Oprócz samej treści komentarza, do pliku zapisywana jest również nazwa aktualnie zalogowanego użytkownika.

Dodanie potrzebnych elementów do ekranu SCADA

Pierwszy krok to umieszczenie na ekranie SCADA wszystkich potrzebnych elementów. Powinien on zawierać co najmniej wyżej wspomniane pole tekstowe oraz dwa przyciski - odczytu i zapisu do pliku.

Dlatego, że pierwszy etap umieszczenia przycisków jest taki sam jak w trzeciej sekcji tego wpisu, skupiono się na prezentacji ustawień pola tekstowego. Polem tym jest zwykły ProcessPoint z odpowiednio dobranymi ustawieniami.  

Projekt_2 - dodanie elementów do ekranu

Do powyższego ekranu dodano również ProcessPoint prezentujący nazwę aktualnie zalogowanego użytkownika. Nazwa ta jest przechowywana w jednej z lokalnych zmiennych GraphWorX (localsim::currentUser), pokazanej na poniższym zdjęciu.

Przycisk pierwszy - zapis do pliku

Pierwszym krokiem jest utworzenie obiektu zapewniającego dostęp do sytemu plików na dysku komputera ("FileSystemObject").

var MyFileSystem = new ActiveXObject("Scripting.FileSystemObject");

Drugi krok to deklaracja zmiennej symbolizującej posiadany przez nas plik tekstowy.

var MyTextFile = MyFileSystem .OpenTextFile("Comments.txt", 8, false);

Pierwszy z argumentów powyższej funkcji to nazwa pliku (w ogólności - ścieżka względna razem z nazwą). Drugi ("8") oznacza, że plik jest otwierany w trybie dopisywania do niego treści. Ostatni powoduje to, że plik nie jest tworzony w przypadku, gdy nasza aplikacja nie odnalazła go w podanej lokalizacji.

Kolejne linie kodu odnoszą się do pozyskania wartości z pól (ProcessPoint) przechowujących nazwę użytkownika i komentarz. (Porównaj z sekcją trzecią tego wpisu).

var CommentPointName = ThisConfiguration.GetDynamicObjectByName("CommentPoint"); 
var Comment = CommentPointName.GetValueOfPrimaryDataSource();

var UserPointName = ThisConfiguration.GetDynamicObjectByName("UserPoint");
var UserName = UserPointName.GetValueOfPrimaryDataSource();

Następnie, tekst ten należy zapisać do pliku. Oprócz samych wartości komentarzy i nazw użytkowników można dołączyć tzw. słowa klucze opatrzone wyróżniającymi się znakami. Mogą one jednoznacznie wskazać miejsca w pliku, w których zaczynają się, bądź kończą interesujące nas informacje. Jest to szczególnie przydatne przy odczycie danych przez aplikację. W tym przypadku, potrzebny fragment kodu wygląda jak poniżej.

MyTextFile.Write("\n\n");      //podwójna nowa linia 
MyTextFile.Write("%UserName%: "); //słowo klucz wskazujące na nazwę użytkownika
MyTextFile.Write(UserName); //nazwa użytkownika
MyTextFile.Write("\n"); //nowa linia
MyTextFile.Write("%Comment%: "); //słowo klucz dla treści komentarza
MyTextFile.Write(Comment); //treść komentarza

MyTextFile.Close(); //zamknięcie pliku

Tak jak wcześniej, pogrubionym drukiem wyróżniono nazwy własne zmiennych i wartości, które nadaje użytkownik. Cały potrzebny kod znajduje się natomiast poniżej. Zawiera on dodatkowo funkcję warunkową "IF", która sprawdza, czy podany plik istnieje. Jeśli nie, wyświetla ona okienko z odpowiednią informacją.

Wyświetl pełny kod (KLIK)

Drugi przycisk - odczyt ostatniego komentarza z pliku

Kod drugiego przycisku jest bardzo podobny do tego, omówionego w poprzedniej sekcji. Różni się on jedynie użyciem funkcji "ReadAll()", "lastIndexOf(string_var)" oraz "Slice(pos1, pos2)".

Pierwsza z nich odpowiada za odczyt całej zawartości pliku do zmiennej tekstowej. Druga zaś, wyszukuje i podaje pozycję ostatniego wystąpienia podciągu znaków w dłuższym ciągu. Szukany podciąg jest przekazywany jako parametr string_var. Ostatnia natomiast, wycina z ciągu znaków mniejszy ich ciąg, począwszy od pozycji pos1 do pos2 i zwraca jako osobną zmienną. W przypadku pominięcia drugiego z argumentów, wytnie ona dany ciąg znaków do końca.

U nas, skrypt drugiego z przycisków najpierw wczytuje całą zawartość pliku do jednej zmiennej. Następnie szuka ostatniego wystąpienia ciągu "%Comment%:". Gdy go odnajdzie, wycina ostatni komentarz ze zmiennej przechowującej całą zawartość pliku i przekazuje do odpowiedniego ProcessPoint'a.

Na podstawie poprzedniej sekcji i powyższych wyjaśnień, czytelnik powinien być w stanie zinterpretować poniższy kod.

Wyświetl pełny kod (KLIK)

 

Zamieszczono tu krótki film prezentujący efekt implementacji wyżej opisanego rozwiązania. Jest to oczywiście tylko przykład tego, w jaki sposób można wykorzystać skrypty przy projektowaniu aplikacji SCADA.  

Prezentacja integracji z plikami tekstowymi

Podsumowanie

 

Jak widać, możliwość wdrożenia technologi .NET przy projektowaniu aplikacji SCADA otwiera bardzo szerokie spektrum możliwości przed integratorem. Na koniec warto jeszcze raz przypomnieć, aby mimo dużej swobody płynącej z wykorzystania skryptów, stosować je tylko tam, gdzie jest to niezbędne. Oprogramowanie SCADA od ICONICS oferuje wiele wbudowanych funkcjonalności, które pomagają w uproszczeniu projektowania aplikacji.

 

 


 

Inteligentna wizualizacja w systemach SCADA - "Clone Dynamic"

 

Inteligentna wizualizacja SCADA w systemie od ICONICS potrafi automatycznie dostosować się do wskazanych danych. Zobacz, jak stworzyć taki ekran bez programowania.

 

Słowem wstępu

 

Przede wszystkim, dzięki omawianemu narzędziu możliwe jest kopiowanie wskazanych obiektów na ekranie SCADA. Kopiowanie to odbywa się na podstawie danych ze wskazanego zbioru. Przykładem może być np. utworzenie dynamicznej listy, czy rozwijanego menu na podstawie rekordów z tabeli w bazie SQL.

Dla każdego elementu listy klonuje się również jego specjalne akcje dynamiczne, które są uruchamiane np. kliknięciem myszką na obiekt. Dzięki temu, po wyborze danego elementu z listy, odpowiadająca mu wartość w tabeli SQL może być przykładowo zapisana do dowolnej zmiennej.

Używane narzędzie nosi nazwę "Clone" i znajduje się na głównym pasku narzędzi w GraphWorX, w zakładce "Dynamics" w sekcji "Selectors". Opcję tę można przyporządkować do dowolnego obiektu na ekranie (jak na zdjęciu poniżej). Po przypisaniu do obiektu, pojawia się ona natomiast na liście jego akcji dynamicznych (widocznej na zdjęciu po prawej stronie okna).  
Prezentacja opcji Clone w GraphWorX64
Prezentacja opcji Clone w GraphWorX64

Opcję tą dodano do wersji 10.95 oprogramowania GENESIS64 od ICONICS wraz z Update 3 (lub nowszym).

 

Wizualizacja SCADA w oparciu o dane z bazy SQL

 

Niżej omówiono (na kilku przykładach), jak tworzyć obiekty na ekranie SCADA w sposób całkowicie automatyczny. Przed przystąpieniem do pracy należy jeszcze zdefiniować połączenie z bazą danych, która zawiera potrzebne informacje.

W tym przypadku wykorzystano połączenie z przykładową bazą "Northwind", które jest obecne od razu po zainstalowaniu pakietu GENESIS64. Połączenie to można odnaleźć w programie Workbench po węzłem DataConnectivity->Databases.

Więcej o połączeniach z bazami danych można przeczytać w innych artykułach powiązanych z systemami GENESIS64.

 

Utworzenie jednowymiarowej dynamicznej listy opcji

 

W tej sekcji pokazano, jak zaprojektować rozwiązanie, które pozwoli na automatyczne dostosowywanie listy opcji (przycisków) do zawartości bazy danych. Co więcej, do każdego przycisku dodano akcję dynamiczną, dzięki której dana wartość z bazy SQL będzie zapisywana do zmiennej lokalnej w GraphWorX.

Każdy przycisk będzie reprezentował nazwę produktu z tabeli "Products" wyżej opisanej bazy danych. Wybór przycisku będzie skutkował zapisaniem tej nazwy do wybranej zmiennej lokalnej.

Dodanie odpowiednich komponentów do ekranu

Pierwszym krokiem, jest dodanie do ekranu SCADA elementu "Scrool Stack Panel". Wytycza on pewien obszar, w którym dodawane będą elementy (tutaj - za pomocą opcji "Clone"). Dzięki niemu istnieje pewność, że mimo dużego zestawu danych z bazy SQL, nowe elementy nie przesłonią innych, statycznych obiektów na ekranie. Co najwyżej konieczne będzie przewijanie panelu w celu odnalezienia pożądanej opcji.

Drugi krok to dodanie wewnątrz panelu przycisku ("Button") oraz przyporządkowanie mu dwóch akcji: "Clone" oraz "Pick Action" (z komendą "Write Value"). W polu "Data Source" tej drugiej można od razu podać adres zmiennej, do której zapisywane będą wartości pochodzące od poszczególnych opcji.

 

 

Jednowymiarowa lista opcji - dodanie potrzebnych obiektów

 

Konfiguracja opcji "Clone" do utworzenia jednowymiarowej listy

Kolejnym krokiem będzie odpowiednie dostosowanie ustawień opcji "Clone". Na zdjęciu zamieszonym pod koniec pierwszej sekcji, w ustawieniach akcji "Clone", widnieją dwie opcje:

  • NumberOfInstances,
  • InstanceNumberAliasName.

Pierwsza z nich odnosi się do pożądanej liczby kopii danego obiektu, jaka ma zostać utworzona podczas symulacji. Druga natomiast, to nazwa Aliasu lokalnego, który przechowuje numer dla każdego dynamicznie utworzonego obiektu. Nazwę tą można wybrać dowolnie i używać jako zmiennej rozróżniającej nowe obiekty - swego rodzaju iteratora.

Do pierwszej opcji przyporządkowano liczbę rekordów z tabeli "Products" bazy danych "Northwind". Zmienna przechowująca liczbę rekordów jest tworzona automatycznie dla każdego nowego zapytania dodanego w Workbench.

Jako nazwę zmiennej-aliasu InstanceNumberAliasName wybrano "nr_kopii".

 

Jednowymiarowa lista przycisków - konfiguracja opcji Clone

 

Konfiguracja ustawień przycisku na podstawie numeru kopii

Teraz należy tak skonfigurować ustawienia przycisku, aby każdy z nich zawierał unikalne dane, lecz nadal mógł być kopiowany automatycznie. Jest to możliwe dzięki aliasowi z numerem kopii - tutaj nazwanym "nr_kopii".

Po pierwsze, należy odpowiednio ustawić tekst widniejący na przycisku. W tym przypadku będzie to nazwa produktu z tabeli "Products". W standardowym przypadku, ścieżka do pożądanej zmiennej wyglądałaby następująco.

{{db:Northwind.Products[ProductName][0]}}

Gdzie [ProductName] to nazwa kolumny przechowującej odpowiednie informacje, a [0] to przykładowy numer rekordu z tabeli. W tym przypadku jednak należy wprowadzić jedną uniwersalną ścieżkę dla wszystkich przycisków. Uzyska się to za pomocą naszego aliasu.

{{db:Northwind.Products[ProductName][<<nr_kopii>>]}}

Teraz dla każdego przycisku przyporządkowana będzie inna nazwa, w zależności od numeru kopii.

Podobnie należy skonfigurować opcję w ustawieniach akcji dynamicznej PickAction (Write Value), która przechowuje wartość zapisywaną do wskazanej zmiennej. W tym przypadku ścieżka dostępu do zmiennej będzie taka sama, choć w ogólnym przypadku może oczywiście się różnić.

 

 

Jednowymiarowa lista - ustawienia przycisku

 

Testowanie jednowymiarowej listy

Teraz, w dowolnym miejscu ekranu, można dodać ProcessPoint wyświetlający aktualną wartość lokalnej zmiennej, do której zapisywane są wartości z przycisków.

Po przejściu do trybu symulacji można zaobserwować, że przyciski powielono automatycznie. Ponadto, każdy z nich zawiera nazwę produktu z odpowiadającego mu rekordu tabeli bazy danych.

W tym przypadku zmodyfikowano w Workbench odpowiednie zapytanie SQL, tak aby zwracało jedynie 10 pierwszych rekordów. Należy bowiem mieć na uwadze, że każdy taki przycisk pobierający dane z bazy to dodatkowa zmienna, która wlicza się do posiadanej licencji. Trzeba mieć tego świadomość przy projektowaniu tego typu rozwiązań, korzystających z dużych zestawów danych.  

Prezentacja działania jednowymiarowej listy opcji

W podsumowaniu (ostatniej sekcji) zostanie przedstawiony sposób na to, jak radzić sobie z tym problemem. Tutaj natomiast znajduje się wideo prezentujące działanie jednowymiarowej listy.

 

Dwuwymiarowa dynamiczna lista

 

Z wykorzystaniem powyższych narzędzi można oczywiście tworzyć również dwuwymiarowe listy. Przede wszystkim należy jeszcze pamiętać, że klonować można nie tylko przyciski. Klonowaniu podlegają wszystkie elementy dodawane do ekranu - zdjęcia, obiekty 3D, symbole. Powielać można również takie rzeczy, jak np. liczbę pozycji w rozwijanym Menu (ang. Popup Menu).

Przykład projektu - założenia

Na podstawie pewnych kluczowych informacji zawartych w powyższej sekcji, użytkownik powinien łatwo prześledzić niżej przedstawione działania. Zaprezentowane zostanie tu rozwiązanie, w którym wizualizacja SCADA opiera się na danych przechowywanych w specjalnie utworzonej do tego tabeli SQL.

Zawiera ona przykładowy spis zasobów (robotów) pracujących przy różnych liniach produkcyjnych. Liczba linii jest określona poprzez zestaw danych w tabeli i może się zmieniać. Przy każdej linii pracuje dana liczba robotów. Roboty są rozróżnialne po swoim ID.  
Wizualizacja SCADA - dwuwymiarowa lista obiektów - zestaw danych wejściowych
Wizualizacja SCADA - dwuwymiarowa lista obiektów - zestaw danych wejściowych


Do realizacji tego zadania, należy dodać w Workbench nowe połączenie z taką bazą oraz zdefiniować dwa źródła danych. Pierwsze, zwraca wszystkie numery linii (po jednym rekordzie dla każdego numeru), drugie natomiast wyświetla ID i typy robotów dla danej linii.

Zapytanie SQL - numery linii produkcyjnych
Zapytanie SQL - numery linii produkcyjnych
 
Zapytanie SQL - typy i ID robotow
Zapytanie SQL - typy i ID robotow

 

Na ekranie SCADA wizualizowana będzie dwuwymiarowa tablica, prezentująca informacje o liniach produkcyjnych. Poziome rzędy symbolizować będą poszczególne linie. W każdym z nich będzie wyświetlana nazwa, typ oraz zdjęcie odpowiadające danemu robotowi.

Nazwy zdjęć odpowiadają nazwom typów robotów i są przechowywane w jednym folderze.

 

Folder ze zdjęciami robotów
Folder ze zdjęciami robotów

 

Wizualizacja SCADA obsługująca dynamiczną dwuwymiarową listę

Na podstawie informacji dotyczących działania samego narzędzia "Clone" (druga sekcja tego wpisu), jak również sposobu przygotowania zestawu danych dla tego przykładu (sekcja poprzednia), użytkownik może prześledzić, jak konfigurowany jest display SCADA.

W gruncie rzeczy, wizualizacja dwuwymiarowej listy na ekranie SCADA opiera się na zagnieżdżeniu w sobie dwóch paneli ("Scrool Stack Panel") - jednego poziomego i jednego pionowego. Akcja Clone jest wtedy przyporządkowana zarówno do samego powielanego obiektu (grupy obiektów), jak i wewnętrznego Scrool Panel'u.  

Wizualizacja SCADA - dwuwymiarowa automatyczna lista obiektów

 

Ograniczenia przy "klonowaniu" obiektów

 

W treści wpisu został wspomniany fakt, że przy duplikowaniu obiektów na dużą skalę może dojść do niebezpiecznie dużej konsumpcji zmiennych z licencji oprogramowania. Każdy obiekt korzystający z zewnętrznego źródła danych (np. komórki tabeli SQL) to dodatkowa wykorzystywana zmienna w systemie.

Aby temu przeciwdziałać i jednocześnie móc dalej wizualizować spore zestawy danych, można zastosować "stronicowanie" wyników (ang. Pagination). Powoduje to podzielenie zestawu duplikowanych obiektów na grupy (strony), które można swobodnie przewijać. Dzięki temu, w danej chwili zużywana jest mniejsza liczba zmiennych (dokładnie tyle, ile obiektów jest w jednej grupie).

Instrukcję, jak wdrożyć wyżej wspomniane rozwiązanie, można znaleźć pod poniższym linkiem (na jednej ze stron producenta).

 


 

Modele 3D, import oraz optymalizacja ich złożoności

 

Wpis ten poświęcony jest modułowi wizualizacji GraphWorX64 od ICONICS - opisane zostaną sposoby obróbki modeli 3D przy jego użyciu.

 

Biblioteki symboli

 

GraphWorX64 udostępnia użytkownikowi zaawansowane biblioteki domyślnych trójwymiarowych symboli.  W zasobach dostępnych zaraz po instalacji znajduje się ponad 200 symboli 3D przedstawiających różne obiekty.

Są one pogrupowane w tematycznych kategoriach. Dostęp do nich odbywa się bezpośrednio z poziomu aplikacji GraphWorx64. Aby dodać przykładowy symbol należy wybrać zakładkę "Symbols" znajdującą się w lewym dolnym rogu ekranu, a następnie wybrać pożądany symbol z rozwijanej listy. Na liście znajdują się zarówno symbole dwu- i trójwymiarowe, jednak są one przechowywane w odrębnych folderach. Dokładna ich lokalizacja przedstawiona jest na zdjęciu obok.  

 

Omawiane symbole zachowują cechy modeli 3D, tzn. mogą być modyfikowane przez użytkownika zarówno w zakresie ich właściwości (np. kolor) jak i animacji. Zmodyfikowane symbole mogą być również zapisane w celu ponownego użycia.

 

Importowanie modeli 3D

 

Oprócz wbudowanych bibliotek symboli, GraphWorX64 pozwala również na importowanie gotowych modeli 3D wykonanych za pomocą zewnętrznych programów. Pliki zawierające modele powinny być zapisane w jednym ze wspieranych formatów: 

  • XAML (.xaml) ,
  • COLLADA (.dae) , 
  • 3D Studio (.3ds) , 
  • Wavefront (.obj) , 
  • Autodesk (.dwg and .dxf) ,
  • Green Building XML (.gbXML).

Przygotowanie do importu plików odbywa się poprzez wybranie obiektu "3D View" z kategorii "Shapes" z zakładki "Home" oraz narysowanie przestrzeni 3D pożądanej wielkości w oknie rysowania programu GraphWorX64.  Rysowanie odbywa się poprzez przeciąganie kursora myszy z wciśniętym lewym przyciskiem.

 

Następnie należy wybrać zakładkę "File" w lewym górnym rogu ekranu oraz opcję "Import". Kolejnym krokiem jest wskazanie lokalizacji pliku zawierającego model 3D oraz wybranie go. Przed dodaniem modelu do projektu pojawi się jeszcze okno dialogowe, pozwalające nam na określenie skalowania modelu lub dokładności jego odwzorowania. Po dostosowaniu ustawień należy wybrać opcję "OK".

 


Redukcja złożoności modeli 3D

 

Należy pamiętać, że modele stworzone za pomocą specjalnego zewnętrznego oprogramowania są zazwyczaj bardzo dokładne. Aby je odwzorować, GraphWorx64 automatycznie dzieli je na dużo mniejszych prostych obiektów (trójkątów), co można zaobserwować po kliknięciu lewym przyciskiem myszy na zaimportowany obiekt - pokrywa się on czerwoną "siatką".

Im model bardziej skomplikowany, tym więcej potrzeba prostych obiektów do zbudowania "siatki". W przypadku dużych projektów (zawierających dziesiątki modeli 3D), procesor komputera może być niepotrzebnie obciążany koniecznością obsługi tak dużej liczby detali. W celu uniknięcia tego problemu, GraphWorx64 oferuje narzędzie pozwalające na zmniejszenie złożoności obiektów znajdujących się w projekcie, bez znacznego spadku ich jakości. Można tego dokonać na 3 sposoby.

  • Najprostszy z nich to ustawienie procentowej dokładności odwzorowania względem oryginalnej za pomocą suwaka w oknie importu modelu.

(Wadą tego rozwiązania jest jednak to, że nie ma możliwości podglądu efektu przed dodaniem modelu).

   
  • Drugi sposób to zaznaczenie już wgranego modelu 3D oraz wybór opcji "Make reducible" z zakładki "Advanced" z kategorii "Polygon Reduction"; GraphWorx64 przygotuje w ten sposób model do zmiany jego dokładności i pozwoli na dostosowanie poziomu szczegółów za pomocą suwaka "Quality" znajdującego się po prawej stronie.
 


Najlepiej dokonywać zmian za pomocą ikonek "+" i "-" gdyż pozwala to na ich stopniowanie i ciągły podgląd efektu końcowego. Za pomocą opcji "Make Regular" można zablokować możliwość zmiany poziomu detali modelu, opcja "Reset Quality" przywraca ostatni poziom detali przed wyborem opcji "Make Regular", opcja "Make All Regular" blokuje możliwość zmiany jakości dla wszystkich modeli w projekcie.

  • Trzecia możliwość to zaznaczenie uprzednio zaimportowanego modelu, wybór opcji "Make Reducible" oraz wpisanie procentowego poziomu detali względem oryginalnego w polu "Quality" w kategorii "Appearance" w zakładce "Properties"  po prawej stronie ekranu

 

 


Podsumowując, niezależnie od tego w jaki sposób dodano modele 3D (biblioteka, import z zewnętrznych zasobów), należy pamiętać o optymalizacji złożoności projektów, szczególnie w przypadku tych, które zawierają dużą liczbę trójwymiarowych modeli. Pozwala to znacząco podnieść wydajność przygotowywanej symulacji wykorzystując fakt, że w aplikacjach HMI nie jest potrzebne idealne odwzorowywanie istniejących urządzeń. Poniżej efekty redukcji złożoności modelu na przykładzie modelu pompy. Warto zwrócić uwagę na informację o ilości prostych obiektów użytych do odwzorowania modelu w każdym z przypadków.

100% dokładności
64% dokładności

 

37% dokładności

 

 

 


 

Trójwymiarowa dynamiczna wizualizacja SCADA

 

Przeczytaj ten wpis, aby dowiedzieć się, jak powstaje trójwymiarowa wizualizacja SCADA w oparciu o gotowe modele 3D.

 

Trójwymiarowa wizualizacja SCADA - projekt

 

Praca nad interfejsem przebiegać będzie w kilku etapach.

  1. Zaimportowanie modelu trójwymiarowego w jednym z obsługiwanych formatów - tu .obj.
  2. Redukcja jego złożoności.
  3. Odpowiednie pogrupowanie elementów składowych (części, z których "sklejony" jest model).
  4. Przypisanie do danych grup elementów odpowiednich akcji dynamicznych wywołujących zmianę zachowania modelu w zależności od pewnych zmiennych.

 

Import trójwymiarowego modelu

 

Interfejs SCADA jest oczywiście tworzony w module graficznym GraphWorX wchodzącym w skład pakietu GENESIS64.  Do zaimportowania modelu potrzebne jest dodanie do projektu obszaru 3D - jego zaznaczenie i następnie użycie opcji importu powoduje, że GraphWorX zezwoli za wybór plików modeli 3D z dysku komputera.

Ten krótki zestaw czynności przedstawia film. W omawianym przypadku wykorzystano model robota. Po zaimportowaniu modelu znajduje się on we wcześniej utworzonym obszarze 3D i co więcej, jest on edytowalny - można sterować jego położeniem oraz właściwościami textur.  

 

W tym miejscu warto przypomnieć sposoby dostosowywania widoku w obrębie obszaru 3D. Polegają one na użyciu klawisza Alt wraz z przyciskami myszy.

  • + LPM  - powoduje obrót widoku,
  • + PPM - przybliża/oddala widok (w zależności od kierunku przesuwania myszy) prostopadle do obecnej płaszczyzny
  • + LPM + PPM - powoduje ruch w obecnej płaszczyźnie.

 

Zmniejszanie złożoności

 

Zaimportowany model jest dosyć dokładny, a co za tym idzie skomplikowany oraz trudny do animowania dla silnika graficznego. W przypadku wizualizacji zawierającej więcej takich modeli, wydajność oraz wygoda korzystania z jej interfejsu znacząco spadłaby z uwagi na częste opóźnienia w odświeżaniu ekranu graficznego.

Aby zniwelować ten problem zastosowano narzędzie do zmniejszania złożoności importowanych modeli. Można o nim przeczytać więcej pod linkiem zamieszczonym na początku tego wpisu. Tu jedynie zostanie zaznaczone, że skorzystano z opcji zmniejszenia złożoności już po zaimportowaniu modelu - dzięki temu możliwy jest ciągły podgląd zmian zachodzących na skutek manipulowania dokładnością obiektu.

 

 

 

Grupowanie elementów modelu

 

Zdecydowana większość skomplikowanych modeli trójwymiarowych  (tworzonych za pomocą zewnętrznych programów) nie jest jednolitym obiektem, lecz składa się z wielu mniejszych części. Fakt ten powoduje, że po zaimportowaniu ich do systemu SCADA ICONICS, użytkownik jest w stanie nie tylko animować ruch modelu jak całości, lecz także planować przemieszczanie się niektórych jego elementów względem innych.

Z drugiej strony strony, męczące i wręcz niepotrzebne może być przypisywanie dynamicznych zachowań do każdej części modelu. W omawianym przypadku, animując ruch robota, projektantowi powinno zależeć na graficznej prezentacji obrotów w jego parach kinematycznych. Widać już więc potrzebę pogrupowania odpowiednich części składowych robota w kategorie.

Najprostszym rozwiązaniem jest tu doprowadzenie do sytuacji, gdzie:

  • element będący na najwyższym poziomie drzewka modelu robota symbolizuje cały model i składa się z dwóch grup obiektów:
    • tworzących bazę robota,
    • tworzących wszystko to, co nie jest bazą;
  • rozwijając drugą z powyższych grup powinny ukazać się dwie kolejne, zawierające elementy składające się na:
    • część robota pomiędzy pierwszą i drugą parą obrotową,
    • wszystko to, co powyżej tej pary obrotowej;
  • schemat powinien się powtórzyć do osiągnięcia ostatniej pary obrotowej robota.
 

 

Akcje dynamiczne - wizualizacja pracy modelu robota

 

Środowisko graficzne GraphWorX oferuje możliwość projektowania interaktywnych i dynamicznych wizualizacji SCADA przy użyciu pewnych akcji dynamicznych przypisywanych do konkretnych obiektów. Akcje te działają nieprzerwanie lub po wystąpieniu określonych warunków. Ponadto, ich obecność odciąża użytkownika poprzez eliminację potrzeby pisania skryptów programowych - konfiguracja akcji dynamicznych to w gruncie rzeczy wybór odpowiednich ustawień.

W omawianym przypadku kluczową rolę odgrywa akcja dynamiczna "Rotation", która ma za zadanie obracać wybrany obiekt. W związku z tym, można dla niej zdefiniować m.in zakres obrotu (definiując kąt początkowy oraz końcowy), kierunek obrotu oraz jego oś. Tu wybrano maksymalny zakres obrotu (w systemie ICONICS jest to 0 - 360 stopni).

Potrzebne są jeszcze sygnały określające kąt obrotu par kinematycznych robota. Dla każdego takiego sygnału podaje się w konfiguracji akcji dynamicznej jego górny i dolny limit - aby GraphWorX był w stanie właściwie odwzorować jego zmienne wartości poprzez obrót elementami modelu robota. Przyjęcie przez sygnał minimalnej wartości skutkować będzie umieszczeniem danej części robota pod kątem zdefiniowanym wyżej jako początkowy. Analogicznie procedura wygląda dla maksimum zadanego sygnału.  


Dla każdej pary obrotowej zostały dostosowane wyżej wymienione ustawienia. Przebieg konfiguracji wizualizacji ruchu robota przedstawia powyższy film.

 

Podsumowanie i efekty

 

Podczas sporządzania takiej wizualizacji należy mieć na względzie pewne fakty, jak np:

  • konieczność odpowiedniego dopasowania zakresu sygnałów zbieranych z urządzenia (robota) do zakresu animacji w GraphWorX (0 - 360 stopni),
  • odpowiedni wybór osi obrotu każdej pary kinematycznej (pomocne są tu graficzne podpowiedzi w GraphWorX pokazane na powyższym filmie),
  • dokładne ręczne dopasowanie środka, wokół którego obracają się dane elementy (eliminowanie efektu "rozjeżdżania się" części mechanizmu),
  • ustawienie optymalnych: częstości odczytywania danych ze źródła oraz poziomu złożoności modelu, w celu uzyskania płynnej animacji.

Powyższe zadania nie są jednak skomplikowane, wymagają natomiast kilku prób i błędów.

Zaprojektowana trójwymiarowa wizualizacja SCADA jest pokazana na poniższym filmie. Co więcej film ten przedstawia też możliwość zmiany wyglądu posiadanego modelu.

 

Skontaktuj się ze specjalistą Elmark

Masz pytania? Potrzebujesz porady? Zadzwoń lub napisz do nas!