Ćwiczenie IT13 Bazy danych SQL w InTouch-u SYSTEMY SCADA I PRZEMYSŁOWE BAZY DANYCH LABORATORIUM SYSTEMÓW STEROWANIA PRZEMYSŁOWEGO I AUTOMATYKI BUDYNKÓW KATEDRA ENERGOELEKTRONIKI I AUTOMATYKI SYSTEMÓW PRZETWARZANIA ENERGII WYDZIAŁ ELEKTROTECHNIKI, AUTOMATYKI, INFORMATYKI I INŻYNIERII BIOMEDYCZNEJ AKADEMIA GÓRNICZO-HUTNICZA Temat: Bazy danych SQL w pakiecie InTouch Narzędzia: Wonderware InTouch 10.x, SQL Access Manager, SQLite, ODBC Cel: przetwarzanie danych z InTouch-a w powiązaniu z zewnętrzną bazą danych SQL Celem ćwiczenia jest użycie funkcji InTouch-a umożliwiających dostęp do baz danych. Dostęp ten jest możliwy na dwa sposoby. Pierwszy sposób (uproszczony) wykorzystuje dedykowane funkcje QuickScript (ich nazwy rozpoczynają się od SQL ) do odczytu i zapisu danych, z wykorzystaniem SQL Access Managera do skojarzenia kolumn tabel SQL z tagami InTouch-a. Drugi sposób to tworzenie dowolnych zapytań w języku SQL, wykorzystując pełnię możliwości oferowanych przez silnik bazy danych. W ćwiczeniu należy rozszerzyć wizualizację wykonaną w ramach ćwiczenia w którym wykonana została wizualizacja Simulate. W niniejszym ćwiczeniu wyliczane będą wartości: minimalna, średnia i maksymalna z ostatnich N próbek poziomu aktualnego zbiornika. Wyliczanie zostanie zrealizowane poprzez rejestrację poziomu aktualnego w tabeli bazy danych (z wykorzystaniem interfejsu ODBC). Następnie, z zarejestrowanych danych, wyliczane będą (przez silnik bazy danych) wartości minimalna, średnia i maksymalna oraz prezentowane na wizualizacji. Niniejsza instrukcja pokazuje jak zrealizować powyższe zadanie dla 10-ciu próbek, a następnie należy wykonać rozszerzenie implementujące wyliczanie i prezentację wartości minimalnej, średniej i maksymalnej dla 50-ciu i 10-ciu próbek (jednocześnie dwie wersje). Wybór silnika bazy danych Ćwiczenie nie wymaga zastosowania bazy danych o zdalnym dostępie, z kontrolą uprawnień użytkowników, itd., dlatego użyta zostanie wbudowana baza danych SQLite. Jest to rozwiązanie nie wymagające uruchamiania osobnej aplikacji serwera bazy danych (silnika bazy danych), gdyż cała baza danych będzie zawarta w jednym pliku, a dostęp do niego zapewnią biblioteki SQLite. Użyty zostanie standardowy interfejs ODBC umożliwiający dostęp do dowolnych baz danych SQL, dzięki czemu połączenie i wykorzystanie bazy danych dla przygotowanej wizualizacji będzie takie samo dla innych relacyjnych baz danych (MySQL, msql, Microsoft SQL Serwer, PostgreSQL, Oracle Database, DB2, itp.). W przypadku konieczności zmiany bazy danych (wdrożenia bazy danych o większych możliwościach), konieczna będzie zwykle jedynie zmiana sterownika ODBC i konfiguracja bazy danych, wizualizacja będzie już w pełni gotowa do pracy z nowym silnikiem bazy danych.
Program ćwiczenia: Utworzenie bazy danych minmaxavg.db obsługiwanej silnikiem SQLite 1. Uruchomić program SQLite Studio. Z menu"'bazy danych" wywołać "Dodaj bazę danych". Uzupełnić pole "Plik bazy danych" ścieżką do pliku tworzonej bazy danych (w katalogu InTouch-owego projektu wizualizacji). Pliki bazy SQLite mają zwykle rozszerzenie db, np. users.db. Ścieżka do tworzonej baza danych może wyglądać następująco: C:\WiBD\Gr1_Pt0800\IT13\minMaxAvg.db. 2. Utworzenie tabeli. Z menu kontekstowego utworzonej bazy danych, wybrać Nowa tabela. Podać nazwę tabeli (buf) i dodać kolumny idx (typu INTEGER, z atrybutami Klucz główny i Nie NULL) oraz val (typu REAL). Sprawdzić w zakładce DDL zapytanie tworzące tabelę. Zatwierdzić przyciskiem "Utwórz". 3. Alternatywnie, zamiast wykorzystania SQLite Studio, można utworzyć bazę danych przy pomocy programu sqlite3 wywoływanego z wiersza poleceń: sqlite3 c:\wibd\<...ścieżka do kat. wizualizacji...>\minmaxavg.db a następnie aby utworzyć tabelę, w której przechowywane będą dane, wykonać: sqlite> create table buf ( idx integer primary key not null, val real ); sqlite>.quit 4. W katalogu wizualizacji powinien powstać zbiór minmaxavg.db. Utworzenie konfiguracji połączenia ODBC 5. Uruchomić Administratora źródeł danych ODBC (StartUruchom... OdbcCp32.cpl lub Panel SterowaniaNarzędzia administracyjneźródła danych (ODBC)). Sprawdzić czy na liście Sterowniki znajduje się SQLite3 ODBC Driver. W zakładce DSN użytkownika dodać połączenie o nazwie minmaxavg_pt0800 (gdzie Pt0800 identyfikuje grupę laboratoryjną), o parametrach: Sterownik: SQLite3 ODBC Driver Data Source Name: minmaxavg_pt0800 Database Name: ścieżka do pliku bazy, np. C:\WiBD\Gr1_Pt0800\IT13\minMaxAvg.db Pozostałe pola zostawić puste. Przetestowanie połączenia ODBC, wstawiania i odczytywania danych z tabeli 6. Uruchomić program ODBCView. Kliknąć "Datasource ", następnie z zakładki "Komputerowe źródło danych" wybrać uprzednio utworzoną konfigurację ODBC i kliknąć OK. Aby program mógł połączyć się ze źródłem danych, musi podać jego definicję określającą w minimalnej wersji jego nazwę (DSN= nazwa źródła ). Dodatkowo definicja może określać użytkownika i hasło potrzebne do zalogowania się do bazy danych i szereg innych parametrów. Na stronie http://www.connectionstrings.com można poznać wiele przykładów definicji połączeń z różnymi bazami danych. 2/5 IT13: Bazy danych SQL w pakiecie InTouch
7. W oknie programu ODBCView wstawić przykładowe dane do tabeli buf, wykonując zapytanie: insert into buf values ( 1, 23.4 ); 8. Następnie sprawdzić zawartość tabeli buf - wykonać zapytanie: select * from buf; 9. Sprawdzić działanie zapytania aktualizującego (wykonać update i select): update buf set val=12.4 where idx=1 Przygotowanie systemu SCADA do pracy z bazą danych 10. Otworzyć w programie InTouch WindowMaker projekt z ćwiczenia. 11. Utworzenie tagów do obsługi konfiguracji SQL. Utworzyć następujące tagi: Nazwa zmiennej (Tagname) sqlconnid sqlstmtid sqlindex sqlmin sqlmax sqlavg sqlfeedval Typ zmiennej (Type) Wartość minimalna (Min Value) Wartość maksymalna (Max Value) Memory Int 0 999999 Memory Real 0 9999 12. Dla tagu sqlindex ustawić Initial Value = 1, dla pozostałych pozostawić InitialValue = 0. 13. Utworzenie powiązań pomiędzy tagami a kolumnami z zapytań SQL. W narzędziach (Tools), rozwinąć SQL Access Manager i uruchomić Bind List. Utworzyć trzy połączenia BindList zgodnie z następującą tabelą: Bind List Name TagName.FieldName bminmaxavg sqlfeedval.value Column Name val bmin sqlmin.value min(val) bmax sqlmax.value max(val) bavg sqlavg.value avg(val) 14. Utworzenie skryptu obsługującego tabelę buf bazy danych. Skonfigurować skrypt Application.WhileRunning Every 250 ms, składający się z dwóch części: nawiązywania połączenia i przygotowywania tabeli buf (a.) oraz z części aktualizującej dane w tabeli i odczytującej wartości min/maks/średnią (b.). a. Pierwszy warunek IF sprawdza, czy połączenie zostało nawiązane i jeśli nie, to nawiązuje je, usuwa wszystkie wiersze z tabeli buf (SQLClearTable), następnie tworzy wzorzec polecenia (SQLSetStatement) i zapamiętuje jego identyfikator w tagu sqlstmtid, a potem w pętli ustawia parametr (SQLSetParamInt) we wzorcu zapytania na licznik pętli i wykonuje zapytanie (SQLExecute). Po 10 przebiegach pętli, zwalnia zasoby zajęte przez wzorzec połączenia (SQLClearStatement). Tabela buf jest wówczas przygotowana do IT13: Bazy danych SQL w pakiecie InTouch 3/5
aktualizacji wartości zawiera 10 wierszy z identyfikatorami od 1 do 10 i z wartościami pustymi wynoszącymi NULL. Wartości NULL nie będą uwzględniane w wyliczaniu przez silnik bazy danych wartości minimalnej, średniej ani maksymalnej. InTouch nie pozwala w inny sposób zrealizować wstawiania pustych wartości, dlatego posłużono się ciągiem funkcji SQLSetStatement.. SQLPrepareStatement.. SQLSetParamInt.. SQLExecute. b. W dalszej części, jeśli połączenie jest nawiązane (sqlconnid>0), aktualizowana jest wartość w jednym wierszu (kolumna tabeli buf o nazwie val) wierszu, którego indeks wynosi sqlindex. Realizuje to funkcja SQLUpdate, która korzysta z powiązania o nazwie bminmaxavg (patrz wcześniejszy punkt nt. Bind List). Wyrażenie 1 + ( sqlindex mod 10 ) powoduje, że sqlindex będzie cyklicznie zwiększany od 1 do 10, a funkcja SQLUpdate aktualizuje (nadpisuje) poprzednią wartość w kolumnie val wiersza tabeli buf określonego przez sqlindex. W ten sposób zrealizowany został tzw. bufor kołowy, w którym zawsze obecnych jest 10 ostatnich wartości. Z tych wartości kolejne zapytania SQLSelect.. SQLFirst.. SQLEnd odczytują wartości minimalną, maksymalną i średnią do tagów wskazanych na listach BindList bmin, bmax i bavg. 15. Ukończony skrypt wygląda następująco: DIM i; IF sqlconnid == 0 THEN SQLConnect( sqlconnid, "DSN=minMaxAvg_Pt0800" ); IF sqlconnid>0 THEN SQLClearTable( sqlconnid, "buf" ); SQLSetStatement( sqlconnid, "insert into buf values (?,null)" ); SQLPrepareStatement( sqlconnid, sqlstmtid ); FOR i=1 TO 10 SQLSetParamInt( sqlstmtid, 1, i ); SQLExecute( sqlconnid, "", sqlstmtid ); NEXT; SQLClearStatement( sqlconnid, sqlstmtid ); sqlstmtid = 0; IF sqlconnid>0 THEN sqlindex=1 + ( sqlindex MOD 10 ); SQLUpdate( sqlconnid, "buf", "bminmaxavg", "idx = " + StringFromIntg( sqlindex, 10 ) ); SQLSelect( sqlconnid, "buf", "bmin", "", "" ); SQLSelect( sqlconnid, "buf", "bavg", "", "" ); SQLSelect( sqlconnid, "buf", "bmax", "", "" ); 16. Rozszerzyć synoptykę wizualizującą proces mieszadła o wartości sqlmin/max/avg. Dodać suwak i powiązać go z tagiem sqlfeedval (w zakresie 0 do 100). Dodać pokazywanie 4/5 IT13: Bazy danych SQL w pakiecie InTouch
trzech wskaźników (min/max/avg), tak aby poruszały się w górę i w dół wzdłuż zbiornika i wyświetlały wartość wskaźnika. 17. Uruchomić wizualizację. Sprawdzić działanie wskaźników poprzez podgląd zawartości tabeli buf w programie SQLite Studio oraz obserwując wskaźniki na synoptyce 18. Jeśli wskaźniki pracują poprawnie, utworzyć skrypt On Data Change, w którym wartość z tagu przechowującego poziom w zbiorniku (z Simulate) będzie przepisywana do sqlfeedval, lub zmienić w powiązaniu bminmaxavg tag sqlfeedval na tag poziomu zbiornika. Usunąć suwak powiązany z tagiem sqlfeedval. 19. W przypadku nie działania wskaźników, sprawdzić komunikaty diagnostyczne pojawiające się w programie System Management Console. 20. Zmodyfikować skrypt obsługi tabeli buf tak, aby odczytywać min./maks/średnią z 10 próbek (tak jak do tej pory) oraz min/maks/średnią z 50 próbek. Dane rejestrować tak jak dotychczas (jedynie rozszerzyć ilość rejestrowanych próbek do 50-ciu), skonstruować natomiast warunkowe zapytanie do bazy danych tak aby z tabeli buf z zarejestrowanymi 50 próbkami, odczytać min/maks/średnią z 10 ostatnich próbek. Pokazać na synoptyce wszystkie wskaźniki. W niniejszym ćwiczeniu użyty został minimalistyczny typ bazy danych - SQLite. Jeżeli zaistniałaby potrzeba zrealizowania bardziej rozbudowanej bazy danych, obsługującej zdalny dostęp i niezależny silnik bazy danych, wystarczy użyć innej bazy danych i przekonfigurować źródło danych ODBC. Aplikacja InTouch owa pozostanie bez większych zmian. Warto jednak zwrócić uwagę, iż kompaktowość SQLite sprawia, że baza danych z tabelą buf mieści się w pliku o rozmiarze 2 KB. Co należy zapamiętać po wykonaniu tego ćwiczenia: Obsługa baz danych opiera się na warstwach klient-serwer: baza danych interfejs ODBC InTouch, co daje możliwość np. łatwej zmiany bazy danych w razie potrzeby. Aplikacje bazodanowe posługują się językiem SQL do realizacji żądań i zapytań. W przypadku pakietu InTouch, powiązanie pomiędzy tagiem a kolumną tabeli realizowane jest przy pomocy powiązań w Bind List w grupie SQL Access Manager. Do realizacji zapytań używających powiązań w Bind List, dostępne są funkcje QuickScriptowe z prefiksem SQL (SQLUpdate, SQLSelect, itp.), które konstruują zapytanie do bazy danych, a wynik zapytania przekazują do/z skonfigurowanych w Bind List tagów. W InTouchu do realizacji zapytań wymagających podania wartości NULL, konieczne jest posłużenie się funkcjami SQL...Statement. Po wykonaniu zapytań, należy zwalniać zasoby związane z zapytaniem (SQLEnd) lub poleceniem (SQLClearStatement). IT13: Bazy danych SQL w pakiecie InTouch 5/5