Obliczanie daty w systemie SCADA

88

Zobacz jak proste jest obliczanie daty i czasu w systemie SCADA od ICONICS, z wykorzystaniem szeregu wbudowanych gotowych funkcji.

Jeśli nie otwierają Ci się pełne rozmiary obrazków, klikaj w nie PPM i wybieraj „Otwórz w nowej karcie”.

Obliczanie daty w systemie SCADA dzięki gotowym funkcjom

Pakiet oprogramowania SCADA – GENESIS64 od firmy ICONICS wyposażono w szereg wbudowanych funkcji w celu obliczania daty i czasu. Funkcje te mogą zwracać zarówno datę i czas, jak i inne informacje im towarzyszące. Takimi dodatkowymi informacjami może być na przykład:

  • numer dnia w danym tygodniu zwracany na podstawie podanej daty,
  • data pierwszego dnia roku, wskazanego przez użytkownika.

Obliczanie daty za pomocą gotowych funkcji wykorzystuje się w systemie SCADA zarówno w modułach:

  • HyperHistorian (za wyjątkiem wersji Express);
  • Expressions – narzędzie dostępne w Workbench; służy do budowania własnych wyrażeń;
  • jak i nawet bezpośrednio w GraphWorX – module pozwalającym na projektowanie graficznych interfejsów użytkownika.

Dlatego, że liczba dostępnych funkcji jest duża (tak jak możliwości które niosą one ze sobą), podzielono ten wpis na dwie części.

Pierwszą z nich będzie krótka prezentacja tychże funkcji w module GraphWorX. Pokazano w niej, w jaki sposób uzyskać do nich dostęp, w celu użycia ich w pojedynczym ProcessPoint (okienku wyświetlania danych). W tym miejscu wywoływano je pojedynczo, aby zwiększyć przejrzystość prezentacji.

Kolejna część wpisu pokaże natomiast sposób wykorzystania tych funkcji w praktyce, w nieco bardziej skomplikowanej konfiguracji. Efektem będzie dodanie do modułu Expressions w Workbench własnego wyrażenia obliczającego numer tygodnia. Obliczenia będą przebiegać zgodnie z wytycznymi Głównego Urzędu Miar, które można podejrzeć tutaj. Co więcej, numer tygodnia będzie obliczany na podstawie daty podawanej na bieżąco przez użytkownika – parametru wejściowego. Tak więc dane wyrażenie będzie można używać wielokrotnie, w różnych kontekstach – na przykład w module GraphWorX.

Proste obliczanie daty za pomocą funkcji w GraphWorX

W tej sekcji pokazano jak uzyskać dostęp do zestawu funkcji zwracających datę i czas w systemie SCADA ICONICS. Lista tych funkcji jest długa, więc wybrano i opisano tylko kilka przykładów. Przykłady te podzielono na 2 kategorie.

Funkcje nie przyjmujące żadnych argumentów

Przykładami funkcji, które nie przyjmują żadnych argumentów mogą być:

  • now() – zwraca obecną datę i czas (dla lokalnej strefy czasowej); co więcej, zwraca ją tylko raz, w momencie wywołania wyrażenia – na przykład przy odświeżeniu ekranu; istnieje analogiczna funkcja – utcnow() zwracająca uniwersalną datę i czas;
  • yday() – automatycznie pobiera aktualną datę z systemu i zwraca datę wczorajszą z czasem ustawionym na północ (12 AM); analogiczną funkcją jest today() zwracająca dzisiejszą datę.

Funkcje przyjmujące argumenty

Natomiast funkcje przyjmujące argumenty (najczęściej jest to inna data, choć czasem też liczba), to na przykład:

  • currentdatetime(RefreshRate) – zwraca aktualną datę i lokalny czas, z tym, że odświeża swój wynik z okresem podanym jako argument (w milisekundach);
  • year(DateTime) – przyjmuje parametr będący datą i zwraca liczbę z przedziału 0-9999 będącą rokiem zawartym w tej dacie;
  • yearday(DateTime) – podobnie jak wyżej, przyjmuje datę jako argument; na jej podstawie zwraca numer mówiący, który to dzień w danym roku;
  • byear(DateTime) – zarówno przyjmuje, jak i zwraca zmienną będącą datą; zwrócona data reprezentuje pierwszy dzień roku wynikającego z parametru wejściowego; czas w zwróconej dacie ustawiony jest na północ (12 AM).

Domyślnym formatem dla dat zwracanych przez funkcje jest „MM / DD / YYYY”. Daty podawane jako parametry wejściowe mogą być natomiast:

  • wynikiem działania innych funkcji – dopuszczalny jest na przykład zapis: byear( now() );
  • łańcuchem znaków wpisywanym ręcznie lub przekazywanym poprzez Alias; wtedy najlepiej posłużyć się formatami:
    • „YYYY – MM – DD” lub „YYYY/MM/DD”,
    • „MM-DD-YYYY” lub „MM/DD/YYYY”.

Obliczanie daty na przykładowym ekranie SCADA

W tej sekcji zamieszczono krótkie wideo prezentujące w praktyce wyżej opisane funkcje.

W celu ich użycia można posłużyć się obiektem typu ProcessPoint. Następnie w jego konfiguracji należy otworzyć okno pomocnicze, za pomocą przycisku przy opcji „DataSource”. Okno to zawiera zakładkę „Expression” służącą do budowania swoich wyrażeń na bieżąco w GraphWorX. Użytkownik ma tam dostęp między innymi do opcji „Functions” prowadzącej do listy wszystkich gotowych funkcji.

Prezentacja funkcji obliczających datę i czas w GraphWorX

Przykład zastosowania wbudowanych funkcji ICONICS

Tak, jak zostało to opisane w pierwszej sekcji, ta część wpisu poprowadzi czytelnika przez proces przygotowania własnego uniwersalnego wyrażenia. Będzie ono zwracało numer tygodnia w danym roku na podstawie daty, którą użytkownik przekazuje jako argument wejściowy. Numer tygodnia obliczany oblicza się zgodnie z wytycznymi Głównego Urzędu Miar.

Do zbudowania własnego wyrażenia (nieco bardziej skomplikowanego niż dotychczasowe przykłady) posłuży narzędzie „Expressions” dostępne w programie konfiguracyjnym – Workbench.

Dodatkowe potrzebne funkcje

Oprócz tych wymienionych wcześniej, będą potrzebne poniższe dodatkowe funkcje operujące na datach:

  • weekday(DateTime) – przyjmująca określoną datę i czas, a zwracająca numer z zakresu 0-6, będący numerem podanego dnia w tygodniu; przy czym: 0 – niedziela, 6 – sobota.
  • totaldays(TimeSpan) – przyjmująca zmienną reprezentującą odstęp czasu (typu TimeSpan) – np „1.20:40:30” (1 dzień, 20 godzin, 40 minut, 30 sekund); zwraca ona liczbę dni (w ułamku) odpowiadającą temu odstępowi czasu – tutaj będzie to około 1.86;
  • fromdays(number_of_days) – pozwala na dodanie do zmiennej typu DateTime (daty) określonej liczby dni (number_of_days).

Ostatnia używana funkcja jest czysto matematyczna i nosi nazwę floor(arg). Używa się jej w celu usunięcia z ułamka wartości po przecinku – w przypadku liczb dodatnich – do zaokrąglenia w dół.

Znając już wszystkie potrzebne funkcje, można zabrać się za konfigurowanie wyrażenia w systemie SCADA odpowiedzialnego za obliczanie numeru tygodnia.

Narzędzie „Expressions” w programie Workbench

Na poniższym wideo pokazano, w jaki sposób dodać nowe wyrażenie do programu Workbench – pod zakładką „Expressions”. Dodatkowo, skonfigurowano dla niego parametr wejściowy – „DATE” przekazujący datę do dalszych obliczeń. Aby użyć go w oknie do pisania skryptów, należy otoczyć go znakami: „<< i >>”. W tym przypadku będzie to: „<<DATE>>” .

Dodanie nowego wyrażenia z parametrem w Workbench

Wyrażenie obliczające numer tygodnia

Lata długie i krótkie

Na samym początku budowy algorytmu należy zdać sobie sprawę, że zgodnie z wytycznymi Głównego Urzędu Miar (a przede wszystkim normą ISO), istnieją lata posiadające 52 lub 53 tygodnie. Warunek sprawdzający, czy dany rok jest „długi” można odczytać z wielu źródeł i wygląda ona następująco.

Jeśli wyrażenie:

p(y) = y + floor(y/4) - floor(y/100) + floor(y/400) 

podzielone modulo przez 7 da wynik:

  • 4 dla zmiennej y równej numerowi danego roku lub
  • 3 dla y równej numerowi danego roku pomniejszonemu o 1,

to dany rok jest rokiem „długim”. Taki też warunek należy jako pierwszy wprowadzić do wyrażenia w Workbench. W przypadku oprogramowania SCADA GENESIS64 ma on postać jak niżej.

Cały kod będzie udostępniony w formie pliku tekstowego w podsumowaniu.

Należy pamiętać, że w przypadku omawianego zadania dysponuje się jedynie parametrem <<DATE>>, który przechowuje pełną datę wprowadzaną przez użytkownika. Aby uzyskać numer roku należy użyć funkcji „year()”.

Warunek na lata długie

Numer tygodnia w roku „długim”

Można zauważyć, że jeśli rok jest „długi” to zaczyna się w środę lub czwartek. Aby więc policzyć numer tygodnia dla takiego roku, wystarczy:

  • wziąć numer danego dnia w tym roku – funkcja yearday(),
  • zwiększyć go o 1, jeśli rok zaczynał się w środę lub o 2 – jeśli w czwartek (dzięki temu pierwszy poniedziałek w nowym roku będzie już częścią 2. tygodnia),
  • podzielić modulo 7 otrzymany wynik oraz odrzucić część ułamkową (opcjonalnie dodać 1 jeśli chcemy numerować tygodnie od 1).

Powyższe kroki spełnia następujące równanie.

floor( ( yearday("<<DATE>>") + weekday( byear("<<DATE>>") ) - 2 ) /7 ) + 1
Obliczanie daty w systmeie SCADA - numer tygonia w roku długim
Obliczanie daty w systmeie SCADA – numer tygonia w roku długim

Numery tygodnia dla lat „krótkich”

Dalsze postępowanie (dla lat „krótkich”) zależy od tego, czy bieżący rok zaczął się przed czwartkiem. Jest to równoznaczne z tym, czy tydzień zawierający pierwszy dzień b.r. jest pierwszym tygodniem tego roku, czy ostatnim poprzedniego.

Warunek na pierwszy dzień tego roku
Warunek na pierwszy dzień tego roku

Jeśli obecny rok rozpoczął się przed czwartkiem i jest rokiem „krótkim”, to znaczy, że jego ostatni dni należą już do pierwszego tygodnia roku kolejnego. Jak sprawdzić czy podana data nie dotyczy właśnie tych ostatnich dni?

Jeśli takie samo wyrażenie, jak to zwracające wynik dla roku „długiego”, zwróci tu wynik mniejszy niż 53 (krótki rok nie może mieć 53 tygodni), to znaczy że może być ono użyte do wyliczenia numeru tygodnia. Jeśli zaś zwróci 53, to tak na prawdę prawidłowym numerem tygodnia jest 1, gdyż jest to już pierwszy tydzień kolejnego roku.

Obliczanie daty - numer tygodnia dla roku krótkiego - rok rozpoczynający się przed czwartkiem
Obliczanie daty – numer tygodnia dla roku krótkiego – rok rozpoczynający się przed czwartkiem

Dla lat, które zaczynały się w dzień tygodnia po czwartku (tydzień zawierający ich początek jest ostatnim tygodniem roku poprzedniego) należy wykonać podobne rozumowanie. Teraz jednak należy sprawdzić, czy wprowadzona jako parametr data nie dotyczy właśnie tych początkowych dni.

Można tego dokonać poprzez weryfikację 3 par warunków:

  • obecny dzień to co najwyżej trzeci dzień roku, a rok zaczął się w piątek;
  • dzień z podanej daty to co najwyżej drugi dzień roku, a rok zaczął się w sobotę;
  • obecny dzień to pierwszy dzień roku, a rok zaczął się w niedzielę.

Sprawdzenie warunków następuje za pomocą funkcji yearday()weekday(), byear().

Jeśli choć jeden z powyższych warunków jest prawdziwy, to numer tygodnia jest następujący:

  • 53 – jeśli poprzedni rok rozpoczął się przed czwartkiem;
  • 52 – jeśli po czwartku.

Jeśli wszystkie powyższe warunki są fałszywe, numer tygodnia oblicza się z poniższego wzoru.

floor(( yearday("<<DATE>>")-weekday( byear("<<DATE>>") )%5-weekday( byear("<<DATE>>") )%3 - 2) /7)+1

Ideą tego wzoru jest, aby od numeru dnia w roku odejmować: 2 – jeśli pierwszy dzień roku to niedziela, 3 – sobota, 4 – piątek.

Prezentacja rezultatów

Proste przekazywanie parametru do wyrażenia

Aby szybko przekazywać datę podawaną przez użytkownika do stworzonego wyrażenia można, zastosować następujący sposób.

Pierwszym krokiem jest dodanie do ekranu SCADA elementu ProcessPoint wraz z przypisaną do niego lokalną zmienną tekstową oraz odblokowanie opcji wprowadzania danych.

Następnie można dodać przycisk zapisujący wartość tej zmiennej do Aliasu – globalnego lub lokalnego. Dzięki Aliasom można w prosty sposób przekazać dowolny ciąg znaków jako parametr wejściowy do wyrażenia. Całość powyższych działań prezentuje krótkie wideo.

Przekazywanie parametru do wyrażenia

Sprawdzenie poprawności algorytmu

Mając przygotowany ProcessPoint do wpisywania dat, oraz pozostałe komponenty do przekazywania ich jako parametr wyrażenia, można przejść do testowania działania algorytmu.

Prezentacja działania wyrażenia na numer tygodnia w roku

Podsumowanie

Niniejszy wpis przedstawił sposoby na obliczanie daty w systemie SCADA od ICONICS. Zaczęto od przedstawienia prostych przypadków użycia wbudowanych funkcji w module graficznym GraphWorX. Następnie pokazano, w jaki sposób zbudować własne wyrażenie matematyczne w programie konfiguracyjnym Workbench tak, aby było uniwersalne – tzn. obliczało wynik na podstawie parametru wejściowego podawanego przez użytkownika.

Co prawa, idąc za tematyką tego wpisu, wyrażenie w Workbench wykorzystywało głównie funkcje operujące na zmiennych typu Data i Czas. Należy jednak pamiętać, że moduł wyrażeń – Expressions – zaprojektowano tak, aby pozwalał na projektowanie wyrażeń matematycznych, logicznych, operujących na bitach rejestrów lub nawet manipulujących formatem zwracanych wyników.

Poniżej znajduje się kompletny kod wyrażenia zaprojektowanego na potrzeby tego artykułu.

Elmark Automatyka udostępnia wersję demo oprogramowania GENESIS64 w celu osobistego przetestowania funkcjonalności pakietu. Skontaktuj się z nami na ICONICS@elmark.com.pl w celu otrzymania wersji testowej lub oferty handlowej.

Źródło: Elmark

ZOSTAW ODPOWIEDŹ

Wprowadź swój komentarz!
Wprowadź swoje imię