Prosty odczyt danych JSON z pliku do systemu SCADA ICONICS
Dowiedz się na przykładzie prostego projektu, jak prowadzić automatyczny odczyt danych JSON (z plików) oraz ich import do systemu SCADA.
Wykorzystywane zasoby
W celu wykonania powyższego zadania użyjemy wymienionych niżej narzędzi. Są to:
Dostosowanie ustawień narzędzia GridWorX
Jak już zostało to opisane, GridWorX pozwala na obsługę elementów (Data Manipulators), które wykonują zdefiniowane przez użytkownika zapytania/procedury na bazach danych. Pierwszym etapem konfiguracji jest więc dodanie Data Manipulatora, który w ostatecznym rozrachunku wprowadzi dane JSON do bazy Hyper Historian.
KOD PROCEDURY SKŁADOWANEJ SQL [KLIK]
Więcej informacji na temat dodawania własnych procedur do baz danych MS SQL Server oraz ich integracji z narzędziami pakietu GENESIS64 znajduje się w poniższym wpisie, w sekcji "Import danych za pomocą HH SQL Query Engine".
Konfiguracja odpowiedniego trigger'a
Algorytm w BridgeWorX
Dlatego, że wpis ten jest poświęcony konkretnemu zastosowaniu narzędzia BridgeWorX, pominięto tu podstawy dodawania nowego szablonu algorytmu, czy dostosowywania opcji jego wykonywania przez system.
Jeśli jest to Twoje pierwsze spotkanie z tym narzędziem, w innym artykule na naszym blogu (podlinkowanym niżej) znajdziesz podstawy konfiguracji BridgeWorX. Znajdują się one w sekcji "Tworzenie złożonych operacji na danych w systemach SCADA"
Opis dostosowywania BridgeWorX na potrzeby importu danych do Hyper Historian rozpocznie się tu natomiast od tworzenia nowego szablonu algorytmu.
Szablon algorytmu - blok funkcyjny odczytu danych JSON
Kolejny krok to określenie metody odczytu danych przez system. W tym przypadku użyto opcji "Parse as Name-Value Pairs". Powoduje ona dodanie do zestawu danych wyjściowych tego bloczka osobnego rekordu dla każdej wartości odczytanej z pliku. Dodatkowo z zaznaczoną opcją "Include Array Indices" możliwe jest wyciąganie pojedynczych wartości z wektorów przechowywanych w pliku. Każdy rekord składa się z dwóch kolumn: "PropertyName" oraz "PropertyValue". Pierwsza z nich przechowuje nazwę zmiennej zdefiniowanej w pliku JSON, która jest aktualnie odczytana, natomiast druga - jej wartość.
Dla przykładu, w przypadku pliku JSON o poniższej strukturze (używanego również na potrzeby omawianego tu projektu), opcja "Parse as Name-Value Pairs" spowoduje dodanie 4 nowych rekordów dla każdej wiadomości.
{
"MSG": [
{
"Folder": "SQL_QUERY_ENGINE_DATA",
"Time": "2015/12/01 08:45:00",
"TAG": "Offline_TAG",
"Value": "50"
}
]
}
Jeśli natomiast nieco zmodyfikujemy plik, umieszczając na przykład dwuelementowe wektory z nazwami zmiennych i ich wartościami w każdej wiadomości, to powyższa opcja zwróci już 6 rekordów na każdą wiadomość.
{
"MSG": [
{
"Folder": "SQL_QUERY_ENGINE_DATA",
"Time": "2015/12/01 08:45:00",
"TAG": ["Offline_TAG", "Offline_TAG_2"],
"Value": ["50", "60"]
}
]
}
W tym przypadku zestaw rekordów dla danych wyjściowych z bloczka JSON Content Reader, dla pojedynczej wiadomości, będzie wyglądał jak poniżej.
Numer rekordu | Property Name | Property Value | ||
1 | MSG[0].Folder | SQL_QUERY_ENGINE_DATA | ||
2 | MSG[0].Time | 2015/12/01 10:00:00 | ||
3 | MSG[0].TAG[0] | Offline_TAG | ||
4 | MSG[0].TAG[1] | Offline_TAG_2 | ||
5 | MSG[0].Value[0] | 50 | ||
6 | MSG[0].Value[1] | 60 |
Kolejne elementy algorytmu
Kolejny etap to dodanie (początkowo pustej) pętli, która wykona się tyle razy, ile wiadomości zawarto w obecnie przetworzonym pliku JSON. W tym celu należy dodać bloczek "Condition" porównujący dwie zmienne zainicjalizowane wyżej. Jeśli zmienna określająca numer aktualnej wiadomości będzie mniejsza od ich ogólnej liczby, wtedy trzeba ją zwiększyć o 1 (za pomocą bloczka "Real Time Output") i znów sprawdzić warunek. Gdy zmienne się zrównają - algorytm zakończy się.
Inicjalizacja zmiennych - liczników. |
Pętla w algorytmie BridgeWorX |
W każdym obiegu pętli nastąpi odczyt odpowiednich informacji z zestawu danych wyjściowych bloczka JSON Content Reader - za pomocą funkcji getoutputcell(...), a następnie przekazanie ich jako parametrów do przygotowanej wcześniej procedury importu do bazy danych SCADA.
Funkcja getoutputcell przyjmuje argumenty:
- unikalną nazwę bloczka,
- numer rekordu (może być to wyrażenie, którego wynikiem jest pożądany numer),
- numer kolumny (w tym przypadku to 1).
Automatyczne wykonywanie algorytmu
Podsumowanie i prezentacja
Przede wszystkim należy zaznaczyć, że odczyt oraz import danych JSON do systemu SCADA zaprezentowano tutaj w sposób uproszczony. W celu zwiększenia przejrzystości przykładu, a więc minimalizacji jego skomplikowania założono, że w jednej wiadomości znajdują się zawsze informacje odnośnie jednej zmiennej. Co więcej, założono, że każda wiadomość składa się z takich samych elementów.
Oczywiście, zaprezentowany tutaj algorytm można rozbudować,a przez to uogólnić. Dodając więcej instrukcji warunkowych oraz pętli, za pomocą jednego algorytmu można obsłużyć dużo większą ilość plików reprezentujących więcej wariantów przekazywania wiadomości. Dodatkowo, tworzenie szablonów projektów jest możliwe w oparciu o parametry, dzięki którym już na etapie wywołania algorytmu staje się on bardziej spersonalizowany. Cała procedura opisana tutaj, jak również jej rezultaty przedstawiono na filmie pokazowym. |
BridgeWorX to rozbudowane narzędzie dające wiele możliwości aplikacjom działającym w każdej gałęzi przemysłu. Aby lepiej zapoznać się z jego funkcjonalnościami, warto samemu spróbować wdrożyć rozwiązania oparte na własnych pomysłach. W tym celu Elmark Automatyka udostępnia bezpłatnie wersję DEMO pakietu GENESIS64 wyposażoną w narzędzie BridgeWorX.
Skontaktuj się ze specjalistą Elmark
Masz pytania? Potrzebujesz porady? Zadzwoń lub napisz do nas!