Witamy

>> Pomoc dla użytkowników systemu asix - wersji 6

www.asix.com.pl

Skrypty

Dok. Nr PLH6015

Wersja: 2011-10-24


1 Uwagi ogólne

Celem modułu skryptów jest rozszerzenie funkcji systemu asix o:

  • wykonywanie nietypowych obliczeń na wartościach zmiennych procesowych;

  • zaprogramowanie nietypowych reakcji na zdarzenia wewnątrz modułu asix;

  • przekazywanie na zewnątrz systemu asix wartości zmiennych i innych informacji o działaniu systemu;

  • pozyskiwanie danych z nietypowych źródeł danych.

W celu realizacji powyższych zadań moduł skryptów umożliwia:

  • automatyczne uruchamianie wielu współbieżnych skryptów stworzonych w różnych językach z możliwością określenia priorytetu/ważności skryptu;

  • wymianę danych pomiędzy skryptami;

  • wywoływanie przez jeden skrypt funkcji znajdujących się w innych skryptach stworzonych w różnych językach (skrypty biblioteczne);

  • przekazywanie sterowania do systemu asix w wyniku zdarzeń powstałych w czasie wykonywania skryptu (akcje operatorskie);

  • kontrolę czasu wykonywania skryptów;

  • śledzenia zmian w pliku zawierającym program skryptu i automatyczne ponowne uruchomienie skryptu po wykryciu takich zmian.


2 Wymagania programowe

Moduł skryptów zrealizowany jest w oparciu o technologię ActiveX ® Scripting i może wykonywać skrypty stworzone w językach, których interpretery realizują tę technologię.

Moduł skryptów testowany był z wykorzystaniem Microsoft Windows Script 5.5, który zawiera interpretery JScript 5.5 oraz VBScript 5.5.

Moduł skryptów może być wykorzystywany w systemach Microsoft Windows NT 4.0, Microsoft Windows 2000, Microsoft Windows Me oraz Microsoft Windows 98.

Jeżeli Windows Script nie jest zainstalowany, to można go znaleźć pod adresem http://www.microsoft.com/msdownload/vbscript/scripting.asp.

Pod adresem http://msdn.microsoft.com/scripting znajduje się Microsoft Script Debugger, który można wykorzystać do uruchamiania skryptów.

Moduł skryptów pracuje w systemie asix w wersji 3 lub wyższej.


3 Uruchamianie i wykonywanie skryptów

3 Uruchamianie i wykonywanie skryptów / parametryzacja

Skrypty mogą być uruchamiane automatycznie przez moduł skryptów w wyniku odpowiednich deklaracji w pliku konfiguracyjnym aplikacji lub poprzez akcję operatorską SKRYPT. Niniejszy rozdział opisuje uruchamianie skryptów w wyniku odpowiedniego sparametryzowania pliku konfiguracyjnego aplikacji systemu asix.

Deklarowanie skryptów rozszerzających możliwości funkcjonalne systemu asix zapewnia program Architekt:

Architekt > Obszary i komputery > moduł Parametry startowe > zakładka Programy/Skrypty

Zakładka Skrypty umożliwia zadeklarowanie skryptów rozszerzających możliwości funkcjonalne systemu asix. Skrypty należy zadeklarować w kolejnych pozycjach, podając nazwę skryptu oraz deklarując plik i dodatkowe opcje skryptu zgodnie z opisaną poniżej składnią.

Nazwa skryptu musi być różna od nazw innych parametrów deklarujących użycie skryptu. Nazwa skryptu nie może być nazwą parametru modułu skryptów oraz nie może być słowem „skrypt" i „script".

Deklaracja pliku skryptu wraz z dodatkowymi opcjami wymaga zapisu zgodnie z następującą składnią:

plik_skryptu parametry_skryptu parametry_wykonawcze

gdzie:

plik_skryptu - ścieżka oraz nazwa pliku zawierającego program skryptu; rozszerzenie nazwy pliku określa domyślny język skryptu;

parametry_skryptu - parametry przekazywane do skryptu; parametry skryptu są dostępne w skrypcie za pomocą obiektu Asix.Script.Parameters (lub Asix.Script.Arguments);

parametry_wykonawcze - parametry przekazywane do modułu skryptów (a nie do skryptu) i określające parametry wykonywania skryptu różne od domyślnych;

Do parametrów wykonawczych należą: ograniczenia czasu wykonania, aktywacja debuggera, deklaracja wątku, w którym zostanie wykonany skrypt i jego priorytet, typ skryptu, język itp. Niektóre parametry (np. ograniczenia) odpowiadają parametrom modułu skryptów. Umieszcza się je jako parametry wykonawcze tylko wtedy, gdy określony skrypt ma specjalne wymagania, różne od tych określonych za pomocą parametrów definiujących sposób wykonywania skryptów &endash; patrz: Architekt > Obszary i komputery > moduł Pozostałe / zakładka Parametry skryptów.

Parametry wykonawcze podaje się w konwencji programu cscript, tj. są one poprzedzone podwójnym ukośnikiem.

Parametry wykonawcze:

//S - w danej chwili może być uruchomiony tylko jeden skrypt z parametrem //S, zawarty w podanym pliku; parametr ma znaczenie tylko w przypadku uruchamiania skryptu jako akcji operatorskiej systemu asix; moduł skryptów odrzuci próbę ponownego uruchomienia skryptu w sytuacji, gdy poprzednie uruchomienie skryptu z parametrem //S, zawartego w tym samym pliku, jeszcze się nie zakończyło; brak tego parametru powoduje, że można równocześnie uruchamiać wiele skryptów w oparciu o program zawarty w tym samym pliku.;

//X - po uruchomieniu skryptu jest również uruchamiany debugger (zainstalowany w systemie jako domyślny); debugger zatrzymuje wykonanie skryptu na pierwszej instrukcji skryptu;

//D - wystąpienie błędu w skrypcie powoduje uruchomienie debuggera;

//IT:nnn - ograniczenie czasu wykonania części inicjalizacyjnej wyrażone w milisekundach;

//T:nnn - ograniczenie czasu wykonania części zdarzeniowej wyrażone w milisekundach;

//E:nazwa - podaje nazwę języka skryptu (np. //E:JScript);

//Watek:nazwa[,pri] - podaje nazwę wątku, w którym wykonuje się skrypt oraz określa priorytet pri wątku; nazwa wątku może być dowolna i służy grupowaniu skryptów wykonywanych w jednym wątku;

priorytety wątku skryptu:

0 IDLE &endash; bezczynny,

1 LOWEST &endash; najniższy,

2 BELOW_NORMAL - poniżej normalnego,

3 NORMAL - normalny (domyślny),

4 ABOVE_NORMAL - powyżej normalnego,

5 HIGHEST &endash; najwyższy,

6 TIME_CRITICAL - krytyczny czasowo;

domyślnym priorytetem wątku jest priorytet 3 (normalny).

//U - podanie tego parametru spowoduje, że nie będą generowane zdarzenia „OnRead" oraz funkcje zdarzeń czasowych zdefiniowane metodami SetInterval i ExecuteAt, jeśli okna aplikacji asix są ukryte (np. za pomocą akcji operatorskiej UKRYJ).


3.2 Kontrola czasu wykonania skryptu

3.3 Kontrola czasu wykonania skryptu

Kontrola czasu wykonania funkcji skryptów umożliwia detekcję wadliwie działających skryptów i jest realizowana poprzez określenie maksymalnego czasu wykonywania się skryptu (timeout).

Można określić dwa ograniczenia czasowe dla każdego skryptu. Pierwsze z nich ma zastosowanie w czasie inicjalizacji skryptu, a drugie jest wykorzystywane do ograniczenia czasu działania skryptu w wyniku reakcji na zdarzenie zewnętrzne. Przekroczenie czasu działania skryptu powoduje jego przerwanie. Skrypt nie będzie się już dalej wykonywał. Wprowadzenie dwóch różnych ograniczeń umożliwia określenie maksymalnego czasu wykonania skryptu w czasie jego inicjalizacji, która może wymagać wykonania czynności długotrwałych (takich jak uruchomienie programu Excel, czy inicjalizacja dostępu do bazy danych) oraz maksymalnego czasu w czasie normalnej pracy skryptu (reakcja na zdarzenia), który jest zazwyczaj krótszy.

Maksymalne czasy wykonania skryptów deklarowane są w programie Architekt:

Architekt > Obszary i komputery > moduł Pozostałe > zakładka Parametry skryptów

  • Maksymalny czas zdarzenia - parametr określa maksymalny czas obsługi zdarzenia przez skrypt. Jeśli wartością tego parametru jest 0, to czas obsługi zdarzenia nie jest ograniczony. Jednostką jest czas wyrażony w milisekundach.

Wartość domyślna: 5000 milisekund

  • Maksymalny czas inicjalizacji - parametr określa maksymalny czas wykonywania części inicjalizacyjnej skryptu. Jeśli wartością tego parametru jest 0, to czas wykonywania części inicjalizacyjnej skryptu nie jest ograniczony. Jednostką jest czas wyrażony w milisekundach.

Wartość domyślna: 15000 milisekund

Pominięcie powyższych parametrów spowoduje przyjęcie wartości domyślnych.

Powyższe parametry określają ograniczenia dla każdego skryptu, który nie posiada specyficznych ustawień. Dla każdego skryptu można określić odrębne wartości ograniczeń. Służą do tego parametry wykonawcze "//IT:nnn" dla maksymalnego czasu inicjalizacji i "//I:nnn" dla maksymalnego czasu reakcji na zdarzenie. "nnn" określa czas w milisekundach.

Kontrola czasu wykonania skryptu jest wyłączana w czasie, gdy skrypt jest zatrzymany w wyniku pracy krokowej lub ustawienia "breakpoint’u" w debuggerze skryptów.


3.3 Śledzenie zmian w pliku skryptu

3.4 Śledzenie zmian w pliku skryptu

Moduł skryptów systemu asix automatycznie śledzi zmiany czasu zapisu pliku, w którym znajduje się program skryptu. W przypadku zmiany tego czasu, co następuje w wyniku wprowadzania zmian do pliku lub przekopiowania na jego miejsce innego pliku, moduł skryptów kończy działanie aktualnie wykonywanego skryptu, odczytuje ponownie zawartość pliku skryptu i uruchamia skrypt w oparciu o nowy program. Powyższa funkcja umożliwia wprowadzanie poprawek do skryptu w trakcie działania systemu asix bez konieczności kończenia całej aplikacji.


4.2 Deinicjalizacja skryptu

Skrypt nie posiada wyróżnionej części deinicjalizacyjnej. Aby umożliwić zaprogramowanie czynności wykonywanych w czasie zakończenia pracy przez skrypt, takich jak zwolnienie zajętych zasobów, wprowadzone zostało zdarzenia OnTerminate obiektu Asix oraz OnTerminate obiektu Script.

Listing 2. Fragment skryptu zawierającego zdarzenie ‘OnTerminate’ obiektu Asix oraz ‘OnTerminate’ obiektu Script

VBScript

JScript

Zdarzenie OnASIXTerminate i OnTerminate wykonują się w chwili zamykania aplikacji systemu asix. Są one wykonywane tylko wtedy, gdy skrypt jest aktywny w czasie zamykania aplikacji (był uruchomiony poprzez wpis do parametru Skrypty). Zdarzenie OnASIXTerminate jest wykonywane przed zdarzeniem OnTerminate.


4.4 Reakcja na zdarzenia

Przypisanie określonej funkcji do zdarzenia ma postać:

Listing 6. Przypisanie określonej funkcji do zdarzenia.

VBScript

JScript

Gdzie „obiekt" jest wyrażeniem zwracającym określony obiekt (np. nazwa zmiennej, która odnosi się do określonego obiektu), „nazwa_zdarzenia" jest nazwą zdarzenia generowanego przez obiekt „obiekt" a „nazwa_funkcji" nazwą funkcji (lub podprogramu Sub w przypadku języka VBScript), która będzie wykonana w chwili wystąpienia zdarzenia.

Należy tutaj zaznaczyć, że aby została wykonana funkcja reakcji na zdarzenie, określony obiekt musi istnieć w chwili wystąpienia tego zdarzenia.

Listing 7. Fragment skryptu z błędnym przypisaniem funkcji do zdarzenia.

VBScript

JScript

Powyżej przedstawiono przykład błędnego przypisania funkcji do zdarzenia. Po zakończeniu się funkcji „F" zmienna „Var" przechowująca obiekt typu Variable, jako zmienna lokalna funkcji „F", przestaje istnieć, a wraz z nią przestaje istnieć obiekt typu Variable. Aby powiązanie funkcji ze zdarzeniem było skuteczne, obiekt generujący musi być przechowany w innym miejscu (np. w zmiennej globalnej).

W powyższych przykładach funkcja reakcji na zdarzenie miała taką samą nazwę jak zdarzenie. W ogólnym przypadku nazwa funkcji nie ma związku z nazwą zdarzenia i może być dowolna.

W funkcji reakcji na zdarzenie jest dostępny obiekt, który wygenerował zdarzenie. Obiekt generujący zdarzenie jest dostępny za pomocą słowa this w języku JScript i Me w języku VBScript.

Listing 8. Fragment skryptu wyprowadzającego do panelu kontrolnego systemu asix nazwę zmiennej przy użyciu funkcji OnRead.

VBScript

JScript

W powyższym przykładzie funkcja „OnRead" wyprowadzi do panelu kontrolnego systemu asix nazwę zmiennej, której wartość pomiarowa została odczytana.

Aby usunąć powiązanie pomiędzy źródłem zdarzenia i funkcją reakcji na zdarzenie należy jako funkcję reakcji na zdarzenie podać wartość pustą.

Listing 9. Sposób podania wartości pustej jako funkcji reakcji na zdarzenie.

VBScript

JScript

Funkcje obsługi zdarzeń są wykonywane po zakończeniu wykonywania bieżącego fragmentu skryptu, tj. części inicjalizacyjnej skryptu, lub funkcji obsługi zdarzenia. To znaczy, bieżący ciąg instrukcji skryptu nie jest przerywany przez funkcję obsługi zdarzenia. Wyjątkiem od tej zasady może być wywołanie metody obiektu zewnętrznego, tj. obiektu spoza zestawu obiektów udostępnianych przez moduł skryptów. Obecna wersja modułu skryptów nie zawiera metod dopuszczających wykonanie funkcji obsługi zdarzenia w trakcie realizacji metody.


5.3 Odczyt serii danych surowych

Odczyt serii surowych danych archiwalnych realizowany jest za pomocą metody ReadRaw obiektu Variable.

ReadRaw czyta wartości, statusy i stemple czasu zmiennej z archiwum z podanego okresu. Czyta rzeczywiste wartości zapisane w archiwum, zwracając również wartości obejmujące końce przedziału.

Po zakończeniu operacji czytania parametr dane zawiera tablicę przeczytanych próbek. Tablica zawiera tyle wierszy ile jest przeczytanych próbek. Każdy wiersz zawiera 3 elementy: wartość, stempel czasu i jakość.

W tablicy zwracane są również wartości graniczne dla podanego okresu czasu. Jeżeli w archiwum nie zarejestrowano próbki dokładnie w chwili czasowej czas_początku, to zwracana jest ostania próbka sprzed tej chwili czasowej. Jeżeli w archiwum nie zarejestrowano próbki dokładnie w chwili czasowej czas_końca, to zwracana jest pierwsza próbka zarejestrowana za tą chwilą czasową. Jeżeli nie można pobrać z archiwum wartości granicznych, to zwracana jest próbka, której pole jakość ma wartość OPCHDA_NOBOUND.


5.4 Odczyt serii danych zagregowanych

Odczyt serii zagregowanych danych archiwalnych realizowany jest za pomocą metody ReadProcessed obiektu Variable.

ReadProcessed oblicza agregaty danej zmiennej w podanym okresie.

Listę agregatów obsługiwanych przez metodę ReadProcessed obejmuje Tabela 1.

Tabela 1. Zestawienie agregatów zmiennych archiwalnych.


5.5 Odczyt atrybutów zmiennych z bazy definicji zmiennych

Dostęp do atrybutów zmiennej zapisanych w bazie definicji zmiennych odbywa się za pośrednictwem metody RaedAttribute obiektu Variable.


5.7 Status danych

Statusy danych pomiarowych są wyrażone jako statusy OPC (ang. OLE for Process Control). Dotyczy to pola Status zmiennej Variable, funkcji obsługi zdarzenia OnRead, funkcji Write obiektu Variable i in.. Wykorzystując statusy OPC można używać wartości symbolicznych prezentowanych w poniższej tabeli.

Tabela 2. Wartości statusów danych pomiarowych.

Wykorzystanie statusów OPC wymaga odpowiedniej parametryzacji modułu ASMEN systemu asix. Powinien zostać włączony parametr Status OPC:

Architekt > Obszary i komputery > moduł Dane bieżące > zakładka Zaawansowane

Jeśli moduł ASMEN nie używa statusów OPC, to moduł skryptów wyprowadzi komunikat ostrzegawczy do panelu kontrolnego systemu asix. Nie będzie wtedy możliwe utworzenie obiektu Variable.

Oprócz wartości zdefiniowanych w standardzie OPC, w systemie asix zdefiniowane są specyficzne dla tego systemu statusy. Zajmują one bity 8-16 statusu danej pomiarowej.

Tabela 3. Statusy danych charakterystyczne dla systemu asix.

Statusy OPC dla danych historycznych

Statusy danych historycznych powstają przez złożenie podstawowego 16-bitowego statusu na 16 młodszych bitach i 16-bitowego pola na 16 starszych bitach. Dotyczy to metod ReadRaw i ReadProcessed obiektu Variable.

W poniższej tabeli podano znaczenie 16 starszych bitów.

Znaczenie pierwszych ośmiu bitów jest zgodne ze specyfikacją OPC, a bit ASKOM_HDA_ARCHIVE_END oznacza, że próbka jest ostatnią aktualnie dostępną w archiwum.


5.9 Przeliczanie i zapis danych pomiarowych

Skrypty można wykorzystać do realizacji funkcji przeliczających wykonujących nietypowe przeliczenia wartości danych pomiarowych. Za pomocą skryptu nie można jednak zmodyfikować wartości odczytanej z urządzenia zewnętrznego, tak jak robi to moduł ASMEN przy pomocy funkcji przeliczających. Można natomiast wykorzystać funkcję Write obiektu Variable do zapisu wyniku przeliczeń wartości jednej zmiennej do zmiennej, która jest zadeklarowana w kanale NONE i pełni jedynie funkcję odbiornika przeliczonych wartości. Wynik przeliczania powinien być zazwyczaj związany z czasem oraz statusem. Aby można było przyporządkować nową wartość zmiennej kanału NONE razem ze statusem, kanał NONE musi być odpowiednio sparametryzowany. W sekcji tego kanału należy zadeklarować parametr Zapis czasu i statusu.

Brak tego parametru spowoduje zapis jedynie wartości zmiennej.

Metoda Write obiektu Variable ma postać:

Write( wartość[, status[, czas]] )

Pominięcie parametru status spowoduje przyjęcie, że jest on równy OPC_QUALITY_GOOD, tzn. dana jest poprawna, zaś pominięcie parametru czas spowoduje przyjęcie czasu bieżącego. Jeśli status i czas danej pomiarowej są nieistotne, to można wykorzystać pole Value do przypisania zmiennej nowej wartości tzn. instrukcje:

obiekt.Write(5)

i

obiekt.Value = 5

są równoważne. (obiekt oznacza obiekt Variable)

Jeśli kanał NONE nie posiada parametru Zapis czasu i statusu, to status i czas podawany w operacji zapisu są ignorowane. W przypadku fizycznych kanałów transmisji, możliwość zapisu czasu i statusu zależy od danego kanału.

Zapis do zmiennej można również wykorzystać do tworzenia przebiegów symulowanych, oraz do zapisu wartości do urządzeń zewnętrznych.

Dodatkowe informacje na temat realizacji funkcji przeliczających znajdują się w punkcie 5.19. Realizacja bibliotek funkcji oraz 5.20. Uwagi na temat czasu.

UWAGA Zapis do zmiennej za pomocą operacji przypisania do pola Value lub metody Write powoduje wykonanie fizycznego transferu nowej wartości do urządzenia zewnętrznego (lub kanału NONE). Nie oznacza to automatycznej aktualizacji pól Value, Status i Time. Dopiero wykonanie fizycznego odczytu z urządzenia zewnętrznego może zaktualizować te pola. Po wykonaniu zapisu, moduł ASMEN systemu asix dokonuje automatycznego fizycznego odczytu nowych wartości, co powoduje aktualizację powyższych pól oraz ewentualną generację zdarzenia OnRead. Aktualizacja tych pól nastąpi jednak dopiero po zakończeniu wykonywania bieżącego zdarzenia lub części inicjalizacyjnej skryptu. Aby wymusić aktualizację tych pól zaraz po zapisie, należy wykonać metodę Read.


5.10 Zmienne tablicowe

Moduł ASMEN systemu asix pozwala na odczyt i zapis zmiennych tablicowych.

Zmienna tablicowa to zestaw danych pomiarowych składający się z wielu danych tego samego typu. Ze wszystkimi danymi wchodzącymi w skład zmiennej tablicowej związany jest jeden status i jeden czas. Jeśli obiekt Variable odnosi się do zmiennej tablicowej, to pole Value oraz parametr „wartość" funkcji reakcji na zdarzenie OnRead również jest tablicą. Jest to tablica w znaczeniu języka VBScript. Dana zapisywana do pola Value oraz parametr „wartość" metody Write również musi być tego typu tablicą. Dodatkowo, w języku JScript dana ta może być obiektem Array języka JScript. Zapisywana dana powinna zawierać przynajmniej tyle elementów ile zawiera ich zmienna, której dotyczy obiekt Variable. Ilość elementów, z których składa się zmienna tablicowa można odczytać z pola Count obiektu Info. Należy zwrócić uwagę, że w przypadku zmiennych tablicowych, zmienia się sposób dostępu do konkretnych wartości zmiennej. Należy posługiwać się numerem konkretnej danej w tablicy, czyli indeksem. Pierwszy element tablicy ma numer 0. Język JScript nie zezwala na odczyt poszczególnych wartości tablicy znajdującej się w polu Value lub parametrze „wartość" funkcji OnRead. Taką tablicę należy przekształcić do obiektu VBArray i dopiero z tego obiektu można odczytać poszczególne wartości składające się na zmienną tablicową. Zawartość obiektu VBArray nie może być jednak modyfikowana. Modyfikacja elementów tablicy obiektu VBArray jest możliwa po przekształceniu tego obiektu do obiektu Array za pomocą metody toArray obiektu VBArray.

Poniżej przedstawiono kilka przykładów obsługi zmiennych tablicowych w skryptach.

PRZYKŁAD 1

Listing 17. Przepisanie wartości z jednej zmiennej tablicowej do drugiej.

VBScript

Jscript

W powyższym przykładzie, w języku JScript nie była wymagana żadna konwersja tablicy na obiekty pośrednie ponieważ metoda Write oraz pole Value akceptują tablice w znaczeniu języka VBScript.

PRZYKŁAD 2

Listing 18. Odczyt dwuelementowej tablicy z jednej zmiennej, modyfikacja jej elementów i zapis do drugiej zmiennej.

VBScript

JScript

W powyższym przykładzie do każdego elementu tablicy zmiennej „Var1" dodano liczbę 1. Wynikowa tablica została zapisana do zmiennej „Var2". W przypadku języka JScript należało dokonać konwersji do obiektu VBArray, a następnie do obiektu Array.

PRZYKŁAD 3

Listing 19. Przepisanie nowych wartości do dwuelementowej zmiennej tablicowej.

VBScript

Jscript

PRZYKŁAD 4

Listing 20. Dostęp do poszczególnych elementów tablicy w funkcji obsługi zdarzenia OnRead.

VBScript

Jscript

Funkcja OnRead wyprowadza komunikat zawierający wartości poszczególnych elementów tablicy do panelu kontrolnego systemu asix. W języku JScript wymagana była konwersja parametru „val" do obiektu VBArray.


5.11 Zmienne tablicowe i operacje na tekstach

Moduł skryptów pozwala przypisać tekst do zmiennej tablicowej, której elementy mają długość jednego bajta. Zmienne te są zazwyczaj skojarzone z funkcją przeliczającą NIC_TEXT. Przypisanie tekstu polega na tym, że do kolejnych elementów zmiennej tablicowej podstawiane są kolejne znaki tekstu. Przypisywany tekst może być dowolnej długości. Jeśli ilość znaków tekstu jest mniejsza niż ilość elementów zmiennej tablicowej, to pozostałe elementy zmiennej otrzymują wartość 0. Jeśli przypisywany tekst jest dłuższy niż zmienna tablicowa, to nadmiarowe znaki są ignorowane.

PRZYKŁAD

Listing 21. Przykład skryptu przedstawiającego sposób operowania na tekstach.

VBScript

JScript

Opisany wyżej sposób operowania na tekstach jest obsługiwany przez moduł skryptów w wersji 1.06.000 lub wyższej.


5.13 Wykonywanie akcji operatorskich

Za pomocą metody ExecuteAction można wykonać akcję operatorską. Parametrem metody jest tekst określający akcję, która ma być wykonana. Szczegółowe informacje na temat akcji operatorskich znajdują się w dokumentacji systemu asix.

PRZYKŁAD

Asix.ExecuteAction( "Otworz Emisja.msk" )

Powyższa instrukcja spowoduje otwarcie maski „emisja.msk".


5.19 Realizacja bibliotek funkcji

Ponieważ dynamiczne dodawanie składowych dotyczy zarówno pól jak i metod, to może zostać ono wykorzystane do tworzenia bibliotek funkcji używanych przez inne skrypty. Umożliwia to również korzystanie z funkcji napisanych w innych językach programowania. Aby utworzyć bibliotekę należy zgromadzić funkcje biblioteczne w oddzielnym pliku i przypisać je do obiektu globalnego GlobalData lub ThreadGlobalData. Przykładowo skrypt o nazwie „Sum.js" może zawierać funkcję o nazwie „Sum", która sumuje argumenty i zwraca wynik. Funkcja „Sum" może być następnie wykorzystana w skrypcie VBScript.

Zawartość pliku „Sum.js":

Listing 30. Przykład skryptu "Sum.js" z funkcją sumującą argumenty i zwracającą wynik.

Powyższą funkcję możemy wykorzystać w skrypcie zawartym w pliku „Licz.vbs" w języku VBScript:

Asix.Panel.Message( "Sum=" + CStr(Asix.GlobalData.Sum(5,2)))

Uruchomienie skryptu zawartego w pliku „Licz.vbs" spowoduje wyprowadzenie do panelu kontrolnego systemu asix komunikatu o treści „sum=7".

Aby powyższy przykład zadziałał poprawnie, to część inicjalizacyjna skryptu „Sum.js" musi wykonać się przed częścią inicjalizacyjną skryptu „Licz.vbs". W związku z tym deklaracje skryptów w parametrze Skrypty pliku konfiguracyjnego aplikacji muszą zostać umieszczone we właściwej kolejności:

Sum = Sum.js

Licz = Licz.vbs

Powyższy przykład zadziała poprawnie tylko wtedy, gdy zarówno skrypt biblioteczny jak i skrypt korzystający ze skryptu bibliotecznego znajdują się w tym samym wątku, ponieważ tylko wtedy kolejność deklaracji skryptów odpowiada kolejności inicjalizacji skryptów. Jeśli skrypt biblioteczny zostałby umieszczony w innym wątku, to jego inicjalizacja przebiegałaby współbieżnie z inicjalizacją skryptu używającego funkcji bibliotecznych, co z kolei mogłoby doprowadzić do błędu dostępu do niezainicjowanych składowych obiektu GlobalData.

W przypadku, gdy skrypt biblioteczny i skrypt użytkowy znajdują się w tym samym wątku, należy korzystać z obiektu „ThreadGlobalData" zamiast „GlobalData". Czas dostępu do obiektu „GlobalData" jest około 30 razy dłuższy niż do obiektu GlobalThreadData.

Wykorzystując fakt, że wewnątrz metody jest dostępny za pomocą słów Me i this obiekt, którego jest ona składową, w module bibliotecznym można umieścić metody, które będą działały w kontekście obiektu Variable.

Listing 31. Przykład skryptu modułu bibliotecznego.

VBScript

JScript

Listing 32. Przykład skryptu modułu wykorzystującego bibliotekę.

VBScript

JScript

To samo można uzyskać, gdy funkcja przelicznik ma parametr odnoszący się do obiektu Variable.

Listing 33. Przykład skryptu modułu bibliotecznego (gdy funkcja przelicznik ma parametr odnoszący się do obiektu Variable).

VBScript

JScript

Moduł wykorzystujący bibliotekę:

Listing 34. Przykład skryptu modułu wykorzystującego bibliotekę (gdy funkcja przelicznik ma parametr odnoszący się do obiektu Variable).

VBScript

JScript

W powyższym przykładzie zastosowano niekorzystne ze względu na czas wykonania rozwiązanie polegające na każdorazowym odwoływaniu się do obiektu GlobalData wewnątrz funkcji obsługi zdarzenia. Bardziej efektywne rozwiązanie polega na zapamiętaniu funkcji Przelicznik w zmiennej lokalnej skryptu w celu późniejszego wywołania:

Listing 35. Przykład skryptu modułu wykorzystującego bibliotekę (funkcja przelicznik zapamiętywana jest w zmiennej lokalnej skryptu w celu późniejszego wywołania).

VBScript

Jscript

Oczywiście, w przypadku, gdy funkcja Przelicznik dokonuje prostego przeliczenia wartości pomiarowej i nie wymaga dostępu do innych pól obiektu Variable, to zamiast przesyłać obiekt Variable, można po prostu przesłać wartość zmiennej (i ew. parametry):

Listing 36. Przykład skryptu z zastosowaniem funkcji 'Przelicznik' (przesyłanie wartości zmiennej zamiast obiektu 'Variable').

VBScript

JScript


5.20 Uwagi na temat czasu

Reprezentacja czasu w skryptach

Czas lokalny i UTC

Konwersje czasu UTC

Niektóre metody i pola obiektów asixa zawierają czas danej pomiarowej, alarmu itp. Prawidłowe operowanie czasem w skryptach wymaga pewnej wiedzy zarówno o reprezentacji czasu w skryptach, jak i w obiektach asixa. Niżej opisano najważniejsze aspekty tego problemu.

Reprezentacja czasu w skryptach

VBScript

W VBScript czas jest wyrażony w formacie VT_DATE. Format VT_DATE jest wykorzystywany także przez wiele obiektów ActiveX.

Wewnętrznie VT_DATE jest liczbą określającą ilość dni od 1899-12-30 00:00:00. Ułamki oznaczają część dnia, np. 1/24 oznacza godzinę. Nie należy, chociaż jest to możliwe, wykonywać bezpośrednio operacji arytmetycznych na czasie, jako liczbie. Wynik byłby wtedy liczbą i przekazany do pól lub metod obiektów asixa zostałby błędnie zinterpretowany. Do operowania na czasach należy stosować standardowe funkcje VBScript: DateAdd() i DateDiff().

Czas VT_DATE można wykorzystać przekazując bezpośrednio do funkcji modelu obiektowego asixa wymagających podania czasu.

JScript

W JScript czas jest obiektem Date.

Wewnętrznie Date jest liczbą milisekund od początku roku 1970 UTC (GMT) (uwaga: nie wolno w ten sposób wyrazić czasu wcześniejszego niż 01.01.1980). Cały szereg metod tego obiektu pozwala na dostęp do niego w formie czasu UTC lub lokalnego.

Nieraz trzeba w JScript dokonywać obliczeń na czasie w formacie VT_DATE. Dzieje się tak, gdy chcemy przekazać czas do lub ze skryptu VBScript lub obiektu ActiveX, albo wykorzystać metody modelu obiektowego asixa operujące na czasie VT_DATE. W takich sytuacjach należy dokonać odpowiedniego przekształcenia.

Jeśli chcemy np. wykonać w języku JScript obliczenia arytmetyczne na czasie zmiennej asixa x to możemy przekonwertować go w następujący sposób:

var when = new Date(x.Time);

Możemy teraz wykorzystać wszystkie metody obiektu Date do wykonania obliczeń (metody obiektu Date są opisane w dokumentacji języka JScript).

Aby np. wyznaczyć chwilę czasu o 20 sekund poprzedzającą czas określony zmienną when z powyższego przykładu, to możemy to zrobić w następujący sposób:

when.setTime( when.getTime() - 20000 );

Czas z obiektu Date można pobrać w formacie VT_DATE metodą getVarDate().

Czas lokalny i UTC

Czas wykorzystywany w module skryptów jest czasem lokalnym lub UTC. Czas lokalny jest czytelny dla użytkownika, bo właśnie nim posługujemy się na co dzień. Użycie czasu lokalnego może jednak prowadzić do nieprawidłowości spowodowanej niejednoznacznością w przypadku cofania o jedną godzinę przy zmianie na czas zimowy. Dotyczy to szczególnie danych historycznych.

Dlatego najwygodniej jest stosować czas lokalny w interfejsie użytkownika, a czas UTC w obiektach asixa i przy obliczeniach. Przekształcenia czasu można dokonać opisanymi niżej metodami UTCTimeToLocal() i LocalTimeToUTC() obiektu Asix. W przypadku JScript nie jest to konieczne, bo obiekt Date zawiera czas UTC i udostępnia go także jako czas lokalny odpowiednimi metodami.

VBScript

W języku VBScript pole UTCMode obiektu Variable pozwala zmienić sposób reprezentacji czasu we wszystkich polach i parametrach metod obiektu Variable dotyczących czasu. Po ustawieniu tego pola na wartość true, czas będzie wyrażony jako czas UTC (ang. Coordinated Universal Time, poprzednio nazywany Greenwich Mean Time). Pozwala to uniknąć niejednoznaczności w okresie zmiany czasu na zimowy.

Z czasem UTC związany jest bit AS_STAT_UTC_TIME statusu zmiennej asixa. Jeżeli jest on ustawiony, świadczy to o tym, że czas jest wyrażony w UTC.

Jeżeli pole UTCMode obiektu Variable ma wartość true, to pole Status obiektu Variable będzie miało ustawiony bit AS_STAT_UTC_TIME.

Z kolei jeśli parametr Status metody Write obiektu Variable ma ustawiony bit AS_STAT_UTC_TIME, to przekazywany parametr Time powinien zawierać czas UTC.

JScript

Należy zwrócić uwagę, że metody getUTC...() języka JScript nie będą działać poprawnie, jeśli pole UTCMode ma wartość true. Dlatego w tym języku pole UTCMode powinno pozostać ustawione na false, a konwersją czasu UTC na lokalny zajmuje się już sam obiekt Date tego języka.

W języku JScript czas w formacie VT_DATE należy traktować zawsze jako lokalny, a czas milisekundowy powinien być czasem UTC.

Metodą getVarDate() uzyskujemy czas lokalny w formacie VT_DATE, a metodą getTime() czas UTC w formacie milisekundowym.

Wstawianie czasu lokalnego do obiektu Date można wykonać tworząc nowy obiekt z czasu w formacie VT_DATE

var when = new Date(x.Time);

a milisekundowy czas UTC, albo tworząc nowy obiekt z liczby milisekund

var when = new Date(milisekundy);

albo wstawiając tę liczbę metodą SetTime()

when.setTime(milisekundy)

Konwersje czasu UTC

Począwszy od wersji asixa 6.1 w obiekcie Asix znalazły się 2 nowe metody umożliwiające konwersję czasu lokalnego na UTC i odwrotnie:

LocalTime = Asix.UTCTimeToLocal( UTCTime )

Konwertuje czas UTC na lokalny. Wynik jest tego samego typu (Date lub liczba milisekund) co parametr.

UTCTime = Asix.LocalTimeToUTC( LocalTime [ , ExpectedUTCTime ] )

Konwertuje czas lokalny na czas UTC. Wynik jest tego samego typu (Date lub liczba milisekund) co parametry.

Dodatkowy parametr ExpectedUTCTime umożliwia prawidłową konwersję serii danych przy niejednoznaczności związanej z przestawieniem czasu z letniego na zimowy i oznacza jakiego w przybliżeniu wyniku się spodziewamy (+/- 0,5 h).

Przykład

Konwertujemy serię danych pochodzących z nocy 30/31.10.2010. Nastąpiło wtedy cofnięcie czasu lokalnego z 3:00 na 2:00.

Seria wygląda tak: 00:05, 01:02, 02:04 (czasu letniego), 02:05 (czasu zimowego), 03:01

' Konwersja bez parametru ExpectedUTCTime

For n = 1 To 5

UTCTime[n] = Asix.LocalTimeToUTC( LocalTime[n] )

Next n

' Zapisze w UTCTime serię 22:05, 23:02, 01:04, 01:05, 02:01.

' 02:04 zostanie błędnie skonwertowane na 01:04, zamiast na 00:04, bo zarówno 02:04, jak i 02:05 potraktowano jako czas zimowy.

' Konwersja z parametrem ExpectedUTCTime

CzasUTC = Now ' Tutaj tylko nadajemy zmiennej CzasUTC typ Date.

For n = 1 To 5

SpodziewanyCzasUTC = DateAdd("h", 1, CzasUTC) ' Oczekujemy kolejnej godziny.

CzasUTC = Asix.LocalTimeToUTC( LocalTime[n], SpodziewanyCzasUTC)

UTCTime[n] = CzasUTC

Next n

' Zapisze w UTCTime serię 22:05, 23:02, 00:04, 01:05, 02:01.

' 02:04 zostanie teraz poprawnie skonwertowane na 00:04,

' bo oczekiwaliśmy, że wynik powinien być bliski 23:02 + 01:00 = 00:02.

' Dla 02:05 oczekiwaliśmy około 00:04 + 01:00 = 01:04 i dlatego otrzymaliśmy 01:05.


5.20.1 Przekazywanie czasu do asixa

Format przekazywanego czasu

Przekazywanie czasu z JScript

Przykłady poprawnego przekazywania czasu

Przekazywanie odcinka czasu

Format przekazywanego czasu

Czas do asixa Powinien on być przekazywany w formacie VT_DATE lub jako liczba milisekund od początku 1970 roku w czasie UTC.

Format milisekundowy został wprowadzony w asixie 6.1 i jest zgodny z wewnętrznym formatem czasu Date języka JScript, który można uzyskać wywołaniem metody getTime().

W języku VBScript nie jest wymagana dodatkowa konwersja czasu przed przekazaniem go do modułu skryptów. W JScript należy stosować się do zasad opisanych w dalszej części niniejszego opisu.

Uwaga: Ryzyko związane z zastosowaniem czasu milisekundowego

Wprowadzenie w wersji 6.1 czasu wyrażonego jako milisekundy od 1970 roku UTC niesie pewne ryzyko wynikające z 2 faktów:

1. Użycie czasu milisekundowego JScript dla starego AsScriptera spowoduje wadliwe traktowanie czasu.

2. Stare skrypty, które próbowały korzystać z nieudokumentowanego sposobu przekazywania czasu jako liczby, przestaną poprawnie działać. Takie sytuacje nowy AsScripter próbuje wykrywać i sygnalizować komunikatami o błędach.

Przykład błędnego przekazywania czasu w VBScript

Dzis = Now ’ Dzis jest typu Date.

Wczoraj = Dzis - 1.0 ’ Wczoraj jest liczbą.

’ To działało w starych wersjach, a w nowych wpisze błędną wartość czasu.

Zmienna.Write(1, OPC_QUALITY_GOOD, Wczoraj)

Zamiast tego należy napisać:

Dzis = Now ’ Dzis jest typu Date.

Wczoraj = DateAdd(”d”, -1, Dzis) ’ Wczoraj jest typu Date.

’ To działa i w starych wersjach i w nowych.

Zmienna.Write(1, OPC_QUALITY_GOOD, Wczoraj)

Przekazywanie czasu z JScript

W języku JScript użycie zmiennej zawierającej czas lub funkcji zwracającej czas (np. jako obiekt Date), może powodować przekazanie tekstu reprezentującego czas zamiast jego wartości.

Na przykład metoda Write obiektu Variable wywołana w poniższy sposób:

var when = new Date();

obiekt.Write( 5, OPC_QUALITY_GOOD, when );

spowoduje przekazanie tekstu zamiast wartości czasu.

Czas powinien być przekazywany w formacie VT_DATE lub jako liczba milisekund od początku 1970 roku w czasie UTC. Ten drugi format został wprowadzony w asixie 6.1 i jest zgodny z wewnętrznym formatem czasu Date języka JScript, który można uzyskać wywołaniem metody getTime().

Jeżeli funkcja ma więcej parametrów wyrażających czas, to wszystkie muszą być tego samego typu, a w parametrach, w których zwracany jest wynik, czas także będzie wyrażony w tym samym typie. Przykładem są metody ReadRaw() i ReadProcessed().

Do przekazania czasu lokalnego w formacie VT_DATE, należy posłużyć się metodą getVarDate()

obiekt.Write( 5, OPC_QUALITY_GOOD, when.getVarDate() );

natomiast dla czasu UTC w formacie milisekundowym, metodą getTime()

obiekt.Write( 5, (OPC_QUALITY_GOOD Or AS_STAT_UTC_TIME), when.getTime() );

Dotyczy to wszystkich metod i pól wymagających przekazania czasu do modułu skryptów w języku JScript. W poniższym przykładzie w języku JScript użycie metody getVarDate() lub getTime() jest zbędne, ponieważ metoda Message() obiektu Panel wymaga łańcucha znaków, a nie czasu jako parametru:

var when = new Date();

Asix.Panel.Message( ”Teraz jest " + when.getVarDate() );

Wyprowadzony przez metodę Message() komunikat będzie miał poprawną postać, ale taki sam efekt można uzyskać wykonując instrukcję:

Asix.Panel.Message( ”Teraz jest " + when );

W obydwu przypadkach język JScript dokonuje konwersji czasu do postaci łańcucha znaków i wynik konwersji oraz sumowania łańcuchów przekazuje do metody Message().

Z kolei użycie metody getTime() spowodowałoby wpisanie liczby milisekund zamiast daty i czasu.

Przykłady poprawnego przekazywania czasu

Przykład VBScript dla czasu typu VT_DATE

Zmienna.UTCMode = False

Teraz = Now ' Czas jako VT_DATE lokalny.

Zmienna.Write(1, OPC_QUALITY_GOOD, Teraz)

Przykład VBScript dla czasu typu milisekundowego

' Niech zmienna CzasAsixa zawiera czas UTC wyrażony jako liczba sekund od 01.01.1980.

Sekundy1980 = DateDiff("s", DateSeria(1970, 1, 1), DateSerial(1980, 1, 1))

Teraz = CzasAsixa.Value ' Czas w sekundach.

Teraz = 1000 * (Teraz + Sekundy1980) ' Czas w milisekundach.

Zmienna.Write(1, (OPC_QUALITY_GOOD Or AS_STAT_UTC_TIME), Teraz)

Przykład JScript dla czasu typu VT_DATE (w dotychczasowych wersjach asixa)

Zmienna.UTCMode = false;

Teraz = new Date(); // Czas bieżący.

// Zapis czasu lokalnego.

Zmienna.Write(1, OPC_QUALITY_GOOD, Teraz.getVarDate());

Przykład JScript dla czasu typu milisekundowego - preferowany od asixa 6.1

// Zmienna.UTCMode = false; // To ustawienie nie jest istotne.

Teraz = new Date(); // Czas bieżący.

// Zapis czasu UTC jako milisekundy.

Zmienna.Write(1, (OPC_QUALITY_GOOD Or AS_STAT_UTC_TIME), Teraz.getTime());

Przekazywanie odcinka czasu

Odcinek czasu może być przekazany w następujący sposób:

1. W formacie VT_DATE, czyli data VBScript lub Date.getVarDate() JScript. Ten czas jest jednoznacznie interpretowany.

2. W formacie liczby milisekund, w zakresie od 1000 ms w górę, czyli wewnętrzna reprezentacja czasu w JScript. Nie wolno w ten sposób wyrazić czasu krótszego niż 1 sekunda, z wyjątkiem czasu zerowgo.


5.20.2 Pobieranie czasu z obiektu Variable

Podstawowym sposobem przekazywania czasu z asixa do skryptu są wartości pól obiektu Variable. W starszych wersjach było to tylko pole Time typu VT_DATE zgodnego z VBScript. Jego wartość mogła wyrażać czas lokalny, gdy pole UTCMode = False, a czas UTC, gdy UTCMode = True.

W asixie 6.1 pojawiły się 2 nowe pola, przydatne głównie w JScript, ale nie tylko:

1. UTCTimeMilli - czas jako liczba milisekund od 01.01.1970 UTC.

2. LocalTimeMilli - czas jako liczba milisekund od 01.01.1970 czasu lokalnego.

Przykład JScript

// W obiekcie Czas typu Date ustawia czas wartości zmiennej Zmienna.

Czas = new Date();

Czas.setTime(Zmienna.UTCTimeMilli);

Przykład VBScript

' Zapisuje do zmiennej CzasAsixa czas wartości zmiennej Zmienna,

' wyrażony jako liczba sekund od 01.01.1980 UTC.

Sekundy1980 = DateDiff("s", DateSeria(1970, 1, 1), DateSerial(1980, 1, 1))

Milisekundy = Zmienna.UTCTimeMilli ' Czas wartości Zmienna w milisekundach UTC.

Sekundy = Milisekundy / 1000 - Sekundy1980 ' Czas w sekundach od 01.01.1980 UTC.

CzasAsixa.Value = Sekundy


5.20.4 Czas zerowy

5.20.3 Czas zerowy

Czas zerowy (01.01.1970 = 0 w milisekundach lub 30.12.1899 = 0 w VT_DATE) jest traktowany w asixie w szczególny sposób. Wszystkie konwersje takiego czasu (UTC-lokalny oraz milisekundy-Date) dają w wyniku także czas zerowy.

Ta uwaga dotyczy tylko metod i pól obiektów asixa, a nie funkcji VBScript lub JScript.


5.21 Format czasu OPC

Składnia formatu czasu względnego OPC jest następująca:

keyword +/- offset +/- offset …

Możliwe wartości keyword i offset podane są w tabeli poniżej. Spacje i znaki tabulacji są ignorowane. Każdy parametr offset musi być poprzedzony liczbą całkowitą specyfikującą jego krotność i kierunek.

Keyword | Opis
NOW | Czas bieżący
SECOND | Początek bieżącej sekundy
MINUTE | Początek bieżącej minuty
HOUR | Początek bieżącej godziny
DAY | Początek bieżącego dnia
WEEK | Początek bieżącego tygodnia
MONTH | Początek bieżącego niesiąca
YEAR | Początek bieżącego roku

Offset | Opis
S | Przesunięcie czasu w sekundach
M | Przesunięcie czasu w minutach
H | Przesunięcie czasu w godzinach
D | Przesunięcie czasu w dniach
W | Przesunięcie czasu w tygodniach
MO | Przesunięcie czasu w miesiącach
Y | Przesunięcie czasu w latach

Na przykład, napis DAY -1D+7H30M mógłby reprezentować czas początkowy danych do raportu dziennego generowanego w dniu bieżącym (DAY = pierwszy stempel czasu dnia dzisiejszego). Zapis -1D daje pierwszy stempel czasu dnia wczorajszego, +7H daje godzinę 7:00 wczoraj, +30M daje godzinę 7:30 wczoraj; znak + w ostatnim offsecie jest przenoszony z poprzedniego offsetu).

Podobnie, MONTH-1D+5h oznacza godzinę 5:00 ostatniego dnia poprzedniego miesiąca, NOW-1H15M oznacza 1 godzinę i 15 minut temu, a YEAR+3MO oznacza datę 1 kwietnia bieżącego roku.

W formacie tym można wyrazić również długość okresu czasu. Należy wtedy w opisanym formacie pominąć pierwszy człon keyword.


6.1 Obiekt ApplicationObiekt_Application_

6.1 Obiekt Application

Pola

Directory

Name

Language

IniFileName

Metody

Zdarzenia

Składowe zarezerwowane

Dostęp do obiektu Application uzyskuje się poprzez pole Application obiektu Asix.

Pola

  • Pole Directory

Pole zwraca nazwę katalogu startowego aplikacji.

  • Pole Name

Pole zwraca nazwę aplikacji. Jest to główna część nazwy pliku inicjalizacyjnego.

  • Pole Language

Pole zwraca język aplikacji (np. "pl" dla języka polskiego).

  • Pole IniFileName

Pole zwraca pełną nazwę pliku inicjalizacyjnego aplikacji.

Metody

Obiekt nie posiada metod.

Zdarzenia

Obiekt nie generuje zdarzeń.

Składowe zarezerwowane

Składowe zarezerwowane mają nazwy: Extra, Explicite, Diagnostics, Close, Catalogue, Catalog.


6.2 Obiekt Alarms

Pola

Metody

Cancel

Raise

State

Zdarzenia

Składowe zarezerwowane

Dostęp do obiektu Alarms uzyskuje się poprzez pole Alarms obiektu Asix.

Pola

Obiekt nie posiada pól.

Metody

  • Metoda Cancel

Postać wywołania:

obiekt.Cancel( ident [, wart1[,wart2[,czas[,global]]]])

gdzie: | Obiekt | obiekt ”r;Alarms"
 | identyfikator | identyfikator alarmu
 | wart1 | parametr alarmu. Jeśli parametr jest pominięty to przyjmowana jest wartość 0.
 | wart2 | parametr alarmu. Jeśli parametr jest pominięty to przyjmowana jest wartość 0.
 | czas | czas zaniku alarmu. Jeśli parametr jest pominięty to przyjmowany jest czas bieżący.
 | global | wartość logiczna określająca czy alarm ma zakres globalny (true) czy lokalny (false). Jeśli parametr jest pominięty to przyjmowana jest wartość false.

Metoda powoduje skasowanie alarmu o podanym identyfikatorze.

Jeśli metoda została pomyślnie wykonana, to zwracana jest wartość true. W przeciwnym wypadku zwracana jest wartość false.

Parametry wart1 i wart2 są parametrami liczbowymi, które przekazywane są do systemu alarmów asix’a. Wartości te mogą być wstawione do wyświetlanego tekstu alarmu. Wymaga to odpowiedniej definicji alarmu (szczegółowe informacje znajdują się w opisie systemu alarmów asix’a).

Parametr global ma znaczenie tylko dla sieciowych, redundancyjnych instalacji systemu alarmów. Alarmów globalnych należy używać wtedy, gdy skrypt wykrywający zdarzenia instalowany jest tylko na jednym komputerze i jego zgłoszenia mają być akceptowane niezależnie od aktualnego stanu systemu. Alarmy lokalne używane są wtedy, gdy skrypt jest uruchamiany na wszystkich stanowiskach systemu, a jego zgłoszenia będą akceptowane tylko na stanowisku, które w danej chwili pełni rolę stanowiska aktywnego.

  • Metoda Raise

Postać wywołania:

obiekt.Raise( ident [, wart1[,wart2[,czas[,global]]]])

gdzie: | obiekt | Obiekt "Alarms"
 | identyfikator | identyfikator alarmu
 | wart1 | parametr alarmu. Jeśli parametr jest pominięty to przyjmowana jest wartość 0.
 | wart2 | parametr alarmu. Jeśli parametr jest pominięty to przyjmowana jest wartość 0.
 | czas | czas zgłoszenia alarmu. Jeśli parametr jest pominięty to przyjmowany jest czas bieżący.
 | global | wartość logiczna określająca czy alarm ma zakres globalny (true) czy lokalny (false). Jeśli parametr jest pominięty to przyjmowana jest wartość false.

Metoda powoduje ustawienie alarmu.

Jeśli funkcja została pomyślnie wykonana, to zwracana jest wartość true. W przeciwnym wypadku zwracana jest wartość false.

  • Metoda State

Postać wywołania:

obiekt.State( ident )

gdzie: | obiekt | obiekt "Alarms"
 | identyfikator | identyfikator alarmu

Metoda zwraca wartość true jeśli alarm jest ustawiony i false w przeciwnym wypadku.

Zdarzenia

Obiekt nie generuje zdarzeń.

Składowe zarezerwowane

Składowe zarezerwowane mają nazwy: Extra, Explicite, Diagnostics, OnNew.


6.3 Obiekt Asix

Pola

Alarms

Application

GlobalData

Mode

Panel

Script

Scripter

ThreadGlobalData

Version

CurrentUserId

CurrentUserName

CurrentUserLevel

Metody

ClearInterval

CreateEmptyObject

ExecuteAction

ExecuteAt

Parameters

SetInterval

Sleep

Variables

UTCTimeToLocal

LocalTimeToUTC

Zdarzenia

OnTerminate

Składowe zarezerwowane

Obiekt Asix jest bezpośrednio dostępny przez każdy skrypt wykonywany pod kontrolą modułu skryptów systemu asix.

Pola

  • Pole Alarms

Pole zwraca obiekt typu Alarms, który umożliwia dostęp do systemu alarmów systemu asix.

  • Pole Application

Pole zwraca obiekt typu Application, który umożliwia dostęp do informacji na temat wykonywanej aplikacji.

  • Pole GlobalData

Pole zwraca obiekt typu GlobalData, który umożliwia wymianę danych pomiędzy skryptami. Skrypty mogą znajdować się w różnych wątkach.

  • Pole Mode

Pole zwraca liczbę określającą bieżący tryb pracy systemu asix. Pole może mieć następujące wartości symboliczne:

Wartość symboliczna | Wartość numeryczna | Znaczenie
Application | 2 | ASIX pracuje w trybie normalnym (wykonywanie aplikacji)
Initialize | 3 | ASIX jest w trakcie inicjalizacji
Terminate | 4 | ASIX w trakcie kończenia pracy

  • Pole Panel

Pole zwraca obiekt typu Panel, który umożliwia wyprowadzanie informacji do panelu kontrolnego systemu asix.

  • Pole Script

Pole zwraca obiekt typu Script, który umożliwia dostęp do informacji o aktualnie wykonywanym skrypcie.

  • Pole Scripter

Pole zwraca obiekt typu Scripter, który umożliwia dostęp do informacji o module skryptów AsScripter.

  • Pole ThreadGlobalData

Pole zwraca obiekt typu ThreadGlobalData, który umożliwia wymianę informacji pomiędzy skryptami znajdującymi się w tym samym wątku.

  • Pole Version

Pole Version zwraca numer wersji systemu asix w postaci numer_wersji*256 + numer_podwersji.

  • Pole CurrentUserId

Pole zwraca identyfikator bieżącego użytkownika systemu asix.

  • Pole CurrentUserName

Pole zwraca nazwę bieżącego użytkownika systemu asix.

  • Pole CurrentUserLevel

Pole zwraca poziom uprawnień bieżącego użytkownika systemu asix.

Metody

  • Metoda ClearInterval

Postać wywołania:

obiekt.ClearInterval( identyfikator )

gdzie: | obiekt | obiekt Asix
 | identyfikator | liczba zwrócona przez metodę SetInterval lub ExecuteAt

Metoda anuluje skutek wykonania funkcji SetInterval lub ExecuteAt.

  • Metoda CreateEmptyObject

Metoda jest przeznaczona dla skryptów w języku VBScript. Zwraca pusty obiekt, do którego skrypt możne dodawać nowe składowe. Obiekt pozwala przesłać grupę logicznie powiązanych składowych (np. zmiennych) do innego skryptu za pośrednictwem obiektu GlobalData. Obiekt jest kolekcją swoich składowych.

  • Metoda ExecuteAction

Postać wywołania:

obiekt.ExecuteAction( akcja )

gdzie: | obiekt | obiekt Asix
 | akcja | łańcuch znaków przekazywany do systemu ASIX i określający akcję, jaka ma zostać wykonana

Zestaw dostępnych akcji jakie mogą być wykonane za pomocą metody ExecuteAction znajduje się w dokumentacji systemu asix.

  • Metoda ExecuteAt

Postać wywołania:

obiekt.ExecuteAt( funkcja, czas )

gdzie: | obiekt | obiekt Asix
 | funkcja | Funkcja, jaka ma zostać wykonana
 | czas | czas, w jakim ma zostać wykonana funkcja

Metoda zwraca identyfikator, który może służyć do anulowania skutku wykonania tej funkcji (ClearInterval). Po wywołanie funkcji określonej parametrem funkcja identyfikator przestaje być ważny. Jeśli czas odnosi się do przeszłości, to funkcja funkcja zostanie wykonana natychmiast (a dokładniej, po zakończeniu wykonywanego w chwili bieżącej fragmentu skryptu).

  • Metoda Parameters

Postać wywołania:

obiekt.Parameters( nazwa_sekcji )

gdzie: | obiekt | obiekt Asix
 | nazwa_sekcji | łańcuch znaków określający nazwę sekcji

Metoda Parameters pozwala na przetwarzanie pliku inicjalizacyjnego aplikacji. Jako parametr podaje się nazwę sekcji pliku inicjalizacyjnego. W wyniku wywołania zostanie zwrócona kolekcja obiektów typu Parameter.

  • Metoda SetInterval

Postać wywołania:

obiekt.SetInterval( funkcja, intervał[,przesunięcie])

gdzie: | obiekt | obiekt Asix
 | funkcja | funkcja wywoływana cyklicznie
 | intervał | odstęp czasu w milisekundach pomiędzy kolejnymi wywołaniami funkcji funkcja. Jeśli interwał jest liczbą ujemną to funkcja wykona się tylko jeden raz.
 | przesunięcie | czas przesunięcia w milisekundach. Parametr określa czas przesunięcia w stosunku do pełnej wielokrotności interwału (np. jeśli interwał wynosi 1 godz., a przesunięcie 15 minut to funkcja będzie uruchamiana o 0:15, 1:15, 2:15 itd.) Jeśli parametr jest pominięty to funkcja będzie wywoływana bez wyrównania czasu

Metoda zwraca identyfikator, który może zostać wykorzystany w funkcji ClearInterval w celu anulowania skutku wywołania funkcji SetInterval. Jeśli parametr interwał jest liczbą ujemną to identyfikator zwrócony przez funkcję SetInterval zostanie unieważniony po pierwszym wywołaniu funkcji funkcja.

  • Metoda Sleep

Postać wywołania:

obiekt.Sleep( milisekundy )

gdzie: | obiekt | obiekt Asix
 | milisekundy | czas zawieszenia wykonywania skryptu w milisekundach

Metoda powoduje zawieszenie wykonania skryptu na czas określony parametrem. W czasie trwania funkcji ograniczenia czasowe są naliczane. W czasie wykonania funkcji skrypt nie reaguje na zdarzenia. W czasie wykonywania tej funkcji nie wykonują się również inne skrypty pracujące w tym samym wątku. Metoda Sleep nie ma wpływu na działanie skryptów w innych wątkach. Parametrem funkcji jest czas wyrażony w milisekundach.

  • Metoda Variables

Postać wywołania:

obiekt.Variables( nazwa_zmiennej[, bieżąca] )

gdzie:

obiekt

obiekt Asix

nazwa_zmiennej

łańcuch znaków określający nazwę zmiennej. Na końcu nazwy zmiennej, po przecinku, można podać jednoliterowy kod archiwum, jeśli zmienna będzie wykorzystywana do przeglądu archiwum

bieżąca

wartość logiczna określająca czy wymagany jest dostęp do bieżących wartości zmiennej. Parametr definiuje działanie metody Variables w sytuacji, gdy brak jest zmiennej określonej parametrem nazwa_zmiennej w bazie zmiennych modułu ASMEN. Jeśli podano true, to zmienna musi znajdować się w bazie danych modułu ASMEN. Jej brak spowoduje, że metoda Variables zakończy się niepomyślnie - obiekt Variable nie zostanie utworzony. Jeśli podano false, to zmienna może być nieobecna w bazie danych modułu ASMEN, musi być jednak obecna w archiwum modułu ASPAD. W takim przypadku nazwa_zmiennej musi zawierać kod typu archiwum.

Jeśli parametr jest pominięty to przyjmowana jest wartość true tzn. wymagany jest dostęp do wartości bieżących.

Metoda zwraca obiekt Variable, który pozwala na dostęp do danych pomiarowych bieżących i/lub archiwalnych. Każdorazowe wywołanie metody z tymi samymi argumentami powoduje zwrócenie nowego obiektu odwołującego się do tej samej zmiennej systemu ASIX. W przypadku, gdy wartością parametru bieżąca jest true oraz brak jest zmiennej w bazie danych modułu ASMEN, to metoda zwraca obiekt pusty. Metoda zawsze zwraca obiekt pusty, jeśli zmienna nie występuje w bazie danych modułu ASMEN ani nie jest archiwizowana (nie występuje w bazie danych modułu ASPAD). W przypadku pomyślnego utworzenia obiektu Variable, pole WithArchive obiektu Info pozwala określić czy jest możliwy dostęp do wartości archiwalnych zmiennej.

Jeśli zmienna znajduje się w bazie zmiennych modułu ASMEN, to pole Current nowo utworzonego obiektu Variable będzie miało wartość true oraz pola Value, Status i Time zostaną ustawione odpowiednio do ostatnio wykonanego odczytu wartości zmiennej przez moduł ASMEN. Pole WithArchive obiektu Info będzie miało wartość true, jeśli parametr nazwa_zmiennej zawiera kod typu archiwum oraz zmienna jest archiwizowana w archiwum tego typu.

W przypadku potrzeby dostępu do wartości archiwalnych zmiennych, które nie posiadają wartości bieżących, tj. nie znajdują się w bazie danych ASMENA, należy podać false jako wartość parametru bieżąca. Pole Current tak utworzonego obiektu Variable będzie stale zawierać wartość false, a pole Status będzie początkowo zawierać wartość OPC_QUALITY_BAD. Dopiero wykonanie metod ArcRead lub ArcReadAt spowoduje odpowiednie ustawienie pól Value, Status i Time. Takie zachowanie obiektu Variable dotyczy jedynie sytuacji, gdy zmienna nie posiada wartości bieżących. Jeśli zmienna znajduje się w bazie zmiennych modułu ASMEN, to wartość parametru bieżąca nie ma znaczenia. Obecnie, tylko zmienne w archiwum przebiegów wzorcowych mogą nie być zawarte w bazie zmiennych modułu ASMEN.

Jeśli utworzenie obiektu Variable nie jest możliwe, to metoda zwraca obiekt pusty. Poniżej przedstawiono sposób w jaki można zweryfikować rezultat wykonania metody:

Listing 37. Przykład skryptu przedstawiającego sposób weryfikowania metody 'Variables'.

VBScript

JScript

  • Metoda UTCTimeToLocal

Postać wywołania:

LocalTime = obiekt.UTCTimeToLocal( UTCTime )

gdzie:

obiekt

obiekt Asix

Metoda konwertuje czas UTC na lokalny. Wynik jest tego samego typu (Date lub liczba milisekund) co parametr.

(Patrz: 5.20.3 Konwersje czasu UTC).

  • Metoda LocalTimeToUTC

Postać wywołania:

UTCTime = obiekt.LocalTimeToUTC( LocalTime [ , ExpectedUTCTime ] )

gdzie:

obiekt

obiekt Asix

Konwertuje czas lokalny na czas UTC. Wynik jest tego samego typu (Date lub liczba milisekund) co parametry.

Dodatkowy parametr ExpectedUTCTime umożliwia prawidłową konwersję serii danych przy niejednoznaczności związanej z przestawieniem czasu z letniego na zimowy i oznacza jakiego w przybliżeniu wyniku się spodziewamy (+/- 0,5 h).

(Patrz: 5.20.3 Konwersje czasu UTC).

Zdarzenia

  • Zdarzenie OnTerminate

Zdarzenie jest generowane w chwili zakończenia aplikacji. Zdarzenie wystąpi przed zdarzeniem OnTerminate obiektu Script.

Składowe zarezerwowane

Składowe zarezerwowane mają nazwy: Test, Freeze, Await, BreakAwait, IsAwaiting, Quit, Extra, Explicite, OnASIXPhase, Diagnostics, Modules, Drivers, ConnectObject, CreateObject, Masks, Pictures, Dump i Utils.


6.4 Obiekt GlobalData

Dostęp do obiektu GlobalData uzyskuje się poprzez pole GlobalData obiektu Asix.

Obiekt służy do przekazywania danych pomiędzy skryptami. W celu wymiany danych pomiędzy skryptami należy wybrać nazwę składowej a następnie przypisać jej wartość. Składowe obiektu GlobalData są dostępne dla wszystkich skryptów także tych, które znajdują się w różnych wątkach. Obiekt jest kolekcją swoich składowych.

Składowymi obiektu mogą być dowolne dane, także inne obiekty (w tym funkcje skryptu).

Pola

Obiekt posiada tylko takie pola, jakie zostały mu nadane przez skrypty.

Metody

Obiekt posiada tylko takie metody, jakie zostały mu nadane przez skrypty.

Zdarzenia

Obiekt posiada tylko takie zdarzenia, jakie zostały mu nadane przez skrypty.

Składowe zarezerwowane

Składowe zarezerwowane mają nazwy: Extra, Explicite i Diagnostics.


6.5 Obiekt Info

Pola

ArcAttr

ArcCycle

Arcdt

Arcdx

ArchiveType

ArcHorizon

Count

RefreshPeriod

WithArchive

Metody

Zdarzenia

Dostęp do obiektu Info uzyskuje się poprzez pole Info obiektu Variable.

Pola

  • Pole ArcAttr

Pole zwiera atrybuty archiwizacji zmiennej. Obecnie, pole może zawierać sumę logiczną następujących wartości:

VARATTR_NOPACK | Powtarzające się wartości zmiennej nie są pakowane
VARATTR_SIM | Wartości zmiennej są symulowane
VARATTR_RESTORE | Ostatnia wartość archiwalna jest początkową wartością zmiennej po uruchomieniu systemu
VARATTR_ALL | Zapisywane są wszystkie wartości

  • Pole ArcCycle

Pole zwiera cykl archiwizacji zmiennej wyrażony w sekundach.

  • Pole Arcdt

Pole zwiera dokładność czasową rejestracji zmiennej wyrażoną w sekundach.

  • Pole Arcdx

Pole zwiera minimalną zmianę wartości zmiennej, która powoduje jej zapis w archiwum.

  • Pole ArchiveType

Pole zwraca łańcuch określający typ archiwum (np. "M") w którym jest archiwizowana zmienna.

  • Pole ArcHorizon

Pole zwiera horyzont archiwizacji zmiennej.

  • Pole Count

Pole zwiera ilość elementów z jakich składa się zmienna. Dla zwykłych zmiennych pole to ma wartość 1. Dla zmiennych tablicowych pole określa ilość elementów w tablicy.

  • Pole RefreshPeriod

Pole zwiera cykl odświeżania zmiennej wyrażony w sekundach.

  • Pole WithArchive

Pole zwraca wartość logiczną true, jeśli jest możliwy dostęp do archiwum oraz false w przeciwnym wypadku.

Metody

Obiekt nie posiada metod.

Zdarzenia

Obiekt nie generuje zdarzeń.


6.6 Obiekt Panel

Pola

Ident

Metody

Error

Message

Popup

Warning

Zdarzenia

Składowe zarezerwowane

Dostęp do obiektu Panel uzyskuje się poprzez pole Panel obiektu Asix.

Obiekt Panel umożliwia wysyłanie informacji do Panelu Kontrolnego systemu Asix.

Pola

  • Pole Ident

Pole Ident to łańcuch znaków identyfikujący źródło komunikatów wyprowadzanych przez obiekt Panel. Jeśli polu nie nadano innej wartości to moduł skryptów nadaje jej wartość taką samą jak nazwa skryptu określona w deklaracji skryptu.

Metody

  • Metoda Error

Postać wywołania:

obiekt.Error( tekst[,diag] )

gdzie: | obiekt | obiekt Panel
 | tekst | łańcuch znaków określający wyświetlany komunikat
 | diag | jeśli parametr ma wartość logiczną true, to komunikat zostanie zapisany tylko w pliku logu aplikacji systemu ASIX. Jeśli parametr jest pominięty to jest przyjmowana wartość false tzn. komunikat zostanie wyprowadzony do panelu kontrolnego.

Metoda powoduje wyprowadzenie komunikatu do panelu kontrolnego systemu ASIX. Komunikat ma status "BŁĄD".

  • Metoda Message

Postać wywołania:

obiekt.Message( tekst[,diag] )

gdzie: | obiekt | obiekt Panel
 | tekst | łańcuch znaków określający wyświetlany komunikat
 | diag | jeśli parametr ma wartość logiczną true, to komunikat zostanie zapisany tylko w pliku logu aplikacji systemu ASIX. Jeśli parametr jest pominięty to jest przyjmowana wartość false tzn. komunikat zostanie wyprowadzony do panelu kontrolnego.

Metoda powoduje wyprowadzenie komunikatu do panelu kontrolnego systemu ASIX. Komunikat ma status "ZWYKŁY".

  • Metoda Popup

Postać wywołania:

obiekt.Popup( tekst )

gdzie: | obiekt | obiekt Panel
 | tekst | łańcuch znaków określający wyświetlany komunikat

Metoda powoduje otwarcie okienka informacyjnego zawierającego tekst określony parametrem tekst..

  • Metoda Warning

Postać wywołania:

obiekt.Warning( tekst[,diag] )

gdzie: | obiekt | obiekt Panel
 | tekst | łańcuch znaków określający wyświetlany komunikat
 | diag | jeśli parametr ma wartość logiczną true, to komunikat zostanie zapisany tylko w pliku logu aplikacji systemu ASIX. Jeśli parametr jest pominięty to jest przyjmowana wartość false tzn. komunikat zostanie wyprowadzony do panelu kontrolnego.

Metoda powoduje wyprowadzenie komunikatu do panelu kontrolnego systemu ASIX. Komunikat ma status "OSTRZEŻENIE".

Zdarzenia

Obiekt nie generuje zdarzeń.

Składowe zarezerwowane

Składowe zarezerwowane mają nazwy: Extra, Explicite i Diagnostics.


6.7 Obiekt Parameter

Pola

domyślne

Name

Value

Metody

Zdarzenia

Składowe zarezerwowane

Obiekt Parameter reprezentuje parametr umieszczony w sekcji pliku inicjalizacyjnego lub parametr przekazany do skryptu w deklaracji skryptu. W ostatnim przypadku pole Name może być puste. Obiekt Parameter jest elementem kolekcji jaką jest obiekt Parameters.

Pola

  • Pole domyślne

Polem domyślnym jest pole Value.

  • Pole Name

Pole jest łańcuchem znaków określającym nazwę parametru.

  • Pole Value

Pole jest łańcuchem znaków określającym wartość parametru.

Metody

Obiekt nie posiada metod.

Zdarzenia

Obiekt nie generuje zdarzeń.

Składowe zarezerwowane

Obiekt nie zezwala na dynamiczne dodawanie nowych składowych.


6.8 Obiekt Parameters

Obiekt jest kolekcją obiektów Parameter reprezentującą parametry sekcji pliku inicjalizacyjnego lub parametry przekazane do skryptu w deklaracji skryptu. Parametry są umieszczone w kolejności ich występowania w pliku inicjalizacyjnym lub deklaracji skryptu. Obiekt Parameters jest zwracany przez metodę Parameters obiektu Asix oraz przez pole Arguments obiektu Script.

Pola

Obiekt posiada pola, które posiada kolekcja tj. pole Count określające ilość parametrów w kolekcji.

Metody

Obiekt posiada metody, które posiada każda kolekcja tj. metoda Item pozwalająca na dostęp do poszczególnych elementów kolekcji poprzez użycie numeru elementu. Elementy są numerowane począwszy od wartości 1.

Zdarzenia

Obiekt nie generuje zdarzeń.

Składowe zarezerwowane

Składowe zarezerwowane mają nazwy: Extra, Explicite i Diagnostics.


6.9 Obiekt Script

Pola

Arguments

File

Ident

Name

Parameters

Timeout

Metody

Zdarzenia

OnTerminate

Składowe zarezerwowane

Dostęp do obiektu Script uzyskuje się poprzez pole Script obiektu Asix.

Pola

  • Pole Arguments

Pole zwraca obiekt-kolekcję Parameters zawierającą parametry umieszczone w deklaracji skryptu.

  • Pole File

Pole zwraca nazwę pliku zawierającego program skryptu.

  • Pole Ident

Pole zwraca identyfikator liczbowy skryptu.

  • Pole Name

Pole zwraca nazwę skryptu.

  • Pole Parameters

Pole jest synonimem pola Arguments.

  • Pole Timeout

Pole zwraca bieżącą wartość ograniczenia czasu wykonania skryptu w milisekundach. Zapis do tego pola powoduje ustawienie nowej wartości ograniczenia. Zapis powoduje jednocześnie ponowne rozpoczęcie odmierzania czasu wykonania skryptu. Zapisywana wartość jest czasem wyrażonym w milisekundach. Zapis do pola może zostać wykorzystany w przypadku konieczności wykonywania czynności wymagających dłuższego czasu. Zapisanie wartości 0 spowoduje wyłączenie kontroli czasu wykonania skryptu.

Metody

Obiekt nie posiada metod.

Zdarzenia

  • Zdarzenie OnTerminate

Zdarzenie jest generowane w chwili kończenia pracy skryptu. Zdarzenie wystąpi po zdarzeniu OnTerminate obiektu Asix o ile skrypt będzie kończył działanie razem z aplikacją systemu ASIX.

Składowe zarezerwowane

Składowe zarezerwowane mają nazwy: Extra, Explicite, Dump i Diagnostics.


6.10 Obiekt Scripter

Pola

Version

Metody

Zdarzenia

Składowe zarezerwowane

Dostęp do obiektu Scripter uzyskuje się poprzez pole Scripter obiektu Asix.

Pola

  • Pole Version

Pole zwraca numer wersji modułu skryptów w postaci:

Numer_główny*16777216+ numer_dodatkowy *65536+ numer_wydania

(lub (Numer_główny<<24)+ (numer_dodatkowy<<16)+ numer_wydania).

Metody

Obiekt nie posiada metod.

Zdarzenia

Obiekt nie generuje zdarzeń.

Składowe zarezerwowane

Składowe zarezerwowane mają nazwy: Extra, Explicite, Diagnostics i Manager.


6.11 Obiekt ThreadGlobalData

Dostęp do obiektu ThreadGlobalData uzyskuje się poprzez pole ThreadGlobalData obiektu Asix.

Podobnie jak obiekt GlobalData obiekt służy do przekazywania danych pomiędzy skryptami. W przypadku obiektu ThreadGlobalData wymiana danych dotyczy tylko skryptów znajdujących się w tym samym wątku. Obiekt jest kolekcją swoich składowych.

Pola

Obiekt posiada tylko takie pola, jakie zostały mu nadane przez skrypty.

Metody

Obiekt posiada tylko takie metody, jakie zostały mu nadane przez skrypty.

Zdarzenia

Obiekt posiada tylko takie zdarzenia, jakie zostały mu nadane przez skrypty.

Składowe zarezerwowane

Składowe zarezerwowane mają nazwy: Extra, Explicite i Diagnostics.


6.12 Obiekt Variable

Pola

domyślne

Current

Info

Name

Overruns

V alue

Time

U TCTimeMilli

LocalTimeMilli

Status

IsGood, IsBad, IsUncertain

Quality

Substatus

IsUTCTime

IsMaster

IsLow, IsHigh, IsConst

AggregateMode,

QualityGoodThreshold,

QualityBadThreshold

Metody

ArcParam

ArcRead

ArcReadAt

ArcSeek

ArcTell

Read

Write

ReadRaw

ReadProcessed

ReadAttribute

Zdarzenia

OnRead

Składowe zarezerwowane

Obiekt pozwala na dostęp do wartości zmiennych procesowych. Obiekt jest zwracany przez metodę Variables obiektu Asix.

Pola

  • Pole domyślne

Polem domyślnym obiektu Variable jest wartość zmiennej tj. wartość zwracana przez pole Value.

  • Pole Current

Pole zwraca wartość logiczną true, jeśli pola Value, Status, i Time odnoszą się do bieżących danych pomiarowych i false jeśli odnoszą się one do wartości archiwalnych. Zapis wartości true do tego pola powoduje aktualizację pól Value, Status i Time bieżącymi wartościami pomiarowymi pozyskanymi z modułu ASMEN oraz wznowienie generacji zdarzenia OnRead. Wykonanie funkcji ArcRead i ArcReadAt powoduje ustawienie wartości tego pola na false. Zdarzenie OnRead nie jest generowane, jeśli pole ma wartość false. Zapis wartości false do pola Current nie ma żadnego znaczenia.

UWAGA:

Jeśli zmienna nie posiada wartości bieżących a jedynie archiwalne, tzn. nie ma jej w bazie zmiennych modułu ASMEN, to zapis wartości true do pola Current jest traktowany jako błąd.

  • Pole Info

Pole zwraca obiekt Info zawierający informacje o zmiennej (patrz: Obiekt Info.).

  • Pole Name

Pole zwraca łańcuch określający nazwę zmiennej taką, jaka została zadeklarowana w bazie danych modułu ASMEN.

  • Pole Overruns

Pole zwraca liczbę określającą ile razy nie doszło do aktualizacji pól Value, Status i Time z powodu zajętości skryptu. Odczyt tego pola powoduje jednocześnie jego wyzerowanie. Niezerowa wartość tego pola świadczy o zbyt wolnym działaniu skryptu w stosunku do częstości odświeżania i ilości obsługiwanych zmiennych.

  • Pole Value

Pole zwraca wartość zmiennej. Może to być bieżąca wartość zmiennej lub wartość archiwalna w zależności od wartości zwracanej przez pole Current.

  • Pole Time

Pole zwraca stempel czasu związany z wartością zmiennej. Czas jest czasem lokalnym.

UWAGA: Podstawowym sposobem przekazywania czasu z asixa do skryptu są wartości pól obiektu Variable. W starszych wersjach było to tylko pole Time typu VT_DATE zgodnego z VBScript. Jego wartość mogła wyrażać czas lokalny, gdy pole UTCMode = False, a czas UTC, gdy UTCMode = True. Począwszy od wersji AsSkryptera 6.1 pojawiły się 2 nowe pola, przydatne głównie w JScript, ale nie tylko:

  • Pole UTCTimeMilli

Pole zwraca stempel czasu związany z wartością zmiennej. Czas jest liczbą milisekund od 01.01.1970 UTC (uwaga: nie wolno w ten sposób wyrazić czasu wcześniejszego niż 01.01.1980).

  • Pole LocalTimeMilli

Pole zwraca stempel czasu związany z wartością zmiennej. Czas jest liczbą milisekund od 01.01.1970 czasu lokalnego (uwaga: nie wolno w ten sposób wyrazić czasu wcześniejszego niż 01.01.1980).

Przykład VBScript

' Zapisuje do zmiennej CzasAsixa czas wartości zmiennej Zmienna,

' wyrażony jako liczba sekund od 01.01.1980 UTC.

Sekundy1980 = DateDiff("s", DateSeria(1970, 1, 1), DateSerial(1980, 1, 1))

Milisekundy = Zmienna.UTCTimeMilli ' Czas wartości Zmienna w milisekundach UTC.

Sekundy = Milisekundy / 1000 - Sekundy1980 ' Czas w sekundach od 01.01.1980 UTC.

CzasAsixa.Value = Sekundy

Przykład JScript

// W obiekcie Czas typu Date ustawia czas wartości zmiennej Zmienna.

Czas = new Date();

Czas.setTime(Zmienna.UTCTimeMilli);

  • Pole Status

Pole zwraca liczbę określającą status wartości zmiennej. Wykorzystywane są statusy OPC (patrz: Status danych.)

UWAGA: Począwszy od wersji 6.1 w AsScrypterze można korzystać z pól rozkodowanego statusu OPC obiektu Variable. Powinno to ułatwić pisanie skryptów i zmniejszyć liczbę popełnianych błędów.

Przed wykorzystaniem nowych pól należy się upewnić, czy AsScripter jest już w nowej wersji.

Dość często można spotkać skrypty, które weryfikują poprawność danych na podstawie porównania statusu z wartością OPC_QUALITY_GOOD = 192. Jest to oczywistym błędem, gdyż wystarczy, że np. wartość ma czas UTC lub pochodzi z archiwum oznaczonego jako Master, aby w statusie pojawiły się inne bity, a wartość nadal była dobra.

Prawidłowy test na status dobry powinien zawierać maskowanie bitów jakości: If (Zmienna.Status And OPC_QUALITY_MASK) = OPC_QUALITY_GOOD Then ...

Jest to dość rozwlekłe i skłania do popełniania błędów. Dlatego w nowym AsSkrypterze można skorzystać z pól obiektu Variable, które zawierają już częściowo rozkodowany status OPC. Są to następujące pola oznaczone jako "nowe":

  • Pola IsGood, IsBad, IsUncertain

Są to pola boolowskie ustawiane na True, gdy wartość jest odpowiednio dobra, zła lub niepewna.

Np.:

If Zmienna.IsGood Then ...

jest równoznaczne z

If (Zmienna.Status And OPC_QUALITY_MASK) = OPC_QUALITY_GOOD Then &ldots;

  • Pole Quality

Pole zawierające tylko 2 bity jakości o wartościach OPC_QUALITY_GOOD, OPC_QUALITY_BAD lub OPC_QUALITY_UNCERTAIN.

Np.:

If Zmienna.Quality = OPC_QUALITY_GOOD Then ...

jest równoznaczne z

If (Zmienna.Status And OPC_QUALITY_MASK) = OPC_QUALITY_GOOD Then ...

  • Pole Substatus

Pole zawierające tylko 6 bitów jakości OPC z podstatusem. Może zawierać wartości:

dla jakości dobrych:

OPC_QUALITY_GOOD,

OPC_QUALITY_LOCAL_OVERRIDE

dla jakości złych:

OPC_QUALITY_BAD

OPC_QUALITY_CONFIG_ERROR

OPC_QUALITY_NOT_CONNECTED

OPC_QUALITY_DEVICE_FAILURE

OPC_QUALITY_SENSOR_FAILURE

OPC_QUALITY_LAST_KNOWN

OPC_QUALITY_COMM_FAILURE

OPC_QUALITY_OUT_OF_SERVICE

OPC_QUALITY_WAITING_FOR_INITIAL_DATA

dla jakości niepewnych:

OPC_QUALITY_UNCERTAIN

OPC_QUALITY_SENSOR_CAL

OPC_QUALITY_EGU_EXCEEDED

OPC_QUALITY_SUB_NORMAL

OPC_QUALITY_LAST_USABLE

  • Pole IsUTCTime

Wartość True oznacza, że czas próbki w polu Time jest wyrażony w UTC.

  • Pole IsMaster

Wartość True oznacza, że próbka pochodzi z archiwum oznaczonego jako Master.

  • Pola IsLow, IsHigh, IsConst

Wartość True oznacza, że w próbce zaznaczono przekroczenie dolnego lub górnego limitu lub jest to wartość stała.

UWAGA: Począwszy od wersji 6.1 AsScripter daje możliwość użycia w funkcji ReadProcessed obiektu Variable wszystkich trybów agregacji zgodnych z AsixConnect. W związku z powyższym obiekt Variable ma teraz 3 nowe pola pozwalające ustawić tryb agregacji:

  • Pole AggregateMode [image] - tryb agregacji dla metody ReadProcessed.

Wartość całkowita do odczytu i zapisu, określająca tryb agregacji.

Przyjmuje wartości AGGREGATE_MODE_ASKOM, AGGREGATE_MODE_OPC lub AGGREGATE_MODE_REPORT.

Wartość domyślna zgodna z ustawioną w parametrze AggregateMode za pomocą programu Architekt (opcja Tryb agregacji - patrz: pomoc do programu Architekt - Architekt.chm/pdf, rozdz. 3.15.2 Parametryzacja obsługi skryptów).

Zapis -1 powoduje przywrócenie wartości domyślnej.

AGGREGATE_MODE_ASKOM = 0

Znaczniki czasu agregatów, z wyjątkiem agregatu Start i Poprzedni_znany, wskazują koniec interwału a wynik jest:

• dobry, gdy udział próbek dobrych wynosi co najmniej QualityGoodThreshold,

• zły, gdy nie jest dobry i udział próbek złych wynosi co najmniej QualityBadThreshold,

• niepewny, gdy nie jest ani dobry, ani zły.

AGGREGATE_MODE_OPC = 1

Znaczniki czasu agregatów, z wyjątkiem agregatów End i Ostatni, wskazują początek interwału a wynik jest:

• dobry, gdy wszystkie próbki są dobre i żadnej próbki nie brakuje,

• zły, gdy wszystkie próbki są złe lub ich brak,

• niepewny w pozostałych przypadkach.

AGGREGATE_MODE_REPORT = 2

Znaczniki czasu wszystkich agregatów wskazują początek interwału a wynik jest:

• dobry, gdy udział próbek dobrych wynosi co najmniej QualityGoodThreshold,

• zły, gdy nie jest dobry i udział próbek złych wynosi co najmniej QualityBadThreshold,

• niepewny, gdy nie jest ani dobry, ani zły.

  • Pole QualityGoodThreshold [image] - próg jakości dla próbek dobrych dla metody ReadProcessed.

Wartość liczbowa do odczytu i zapisu.

Przyjmuje wartości od 0 do 1, zaokrąglone do 2 miejsc po przecinku.

Wartość domyślna zgodna z ustawioną w parametrze QualityGoodThreshold za pomocą programu Architekt (opcja Próg jakości dobrej - patrz: pomoc do programu Architekt - Architekt.chm/pdf, rozdz. 3.15.2 Parametryzacja obsługi skryptów).

Zapis -1 powoduje przywrócenie wartości domyślnej.

  • Pole QualityBadThreshold [image] - próg jakości dla próbek złych dla metody ReadProcessed.

Wartość liczbowa do odczytu i zapisu.

Przyjmuje wartości od 0 do 1, zaokrąglone do 2 miejsc po przecinku.

Wartość domyślna zgodna z ustawioną w parametrze QualityBadThreshold za pomocą programu Architekt (opcja Próg jakości złej - patrz: pomoc do programu Architekt - Architekt.chm/pdf, rozdz. 3.15.2 Parametryzacja obsługi skryptów).

Zapis -1 powoduje przywrócenie wartości domyślnej.

Metody

  • Metoda ArcParam

Postać wywołania:

obiekt.ArcParam( [param] )

gdzie: | obiekt | Obiekt Variable
 | param | określa sposób interpolacji wartości dla funkcji ArcReadAt:
 |  | INTR_LINEAR | interpolacja liniowa
 |  | INTR_PREV | interpolacja poprzednią wartością
 |  | INTR_NEXT | interpolacja następną wartością
 |  | INTR_NEAREST | interpolacja najbliższą wartością

Metoda zwraca wartość 0 jeśli zakończyła się pomyślnie i wartość ujemną w przypadku błędu.

  • Metoda ArcRead

Postać wywołania:

obiekt.ArcRead( [typ] )

gdzie: | obiekt | obiekt Variable
 | typ | typ operacji odczytu w stosunku do wskaźnika archiwum:
 |  | READ_CURR | będzie czytana bieżąca dana
 |  | READ_NEXT | będzie czytana następna dane

Jeśli parametr typ został pominięty to przyjmowana jest wartość READ_NEXT.

Metoda zwraca wartość 0 jeśli zakończyła się pomyślnie i wartość ujemną w przypadku błędu. Metoda może również zwracać wartości dodatnie, które mają następujące znaczenie:

STAT_NoData | Brak danych
STAT_EarlierTime | Próba odczytu przed początkiem archiwum
STAT_LaterTime | Próba odczytu poza końcem archiwum
STAT_Break | Dziura w archiwum
STAT_NotReady | Danych jeszcze nie sprowadzono. Wartość może zostać zwrócona w przypadku odczytu archiwum sieciowego.

Metoda powoduje ustawienie pól Value, Status i Time oraz pozostałych pól związanych ze statusem i czasem obiektu Variable wartościami pomiaru odczytanymi z archiwum.

  • Metoda ArcReadAt

Postać wywołania:

obiekt.ArcReadAt( czas )

gdzie: | obiekt | obiekt Variable
 | czas | określa czas danej (czas absolutny) lub wyrażony jako liczba milisekund [image] (uwaga: w przypadku drugiego sposobu nie wolno w ten sposób wyrazić czasu wcześniejszego niż 01.01.1980) (patrz: 5.20 Uwagi na temat czasu)

Metoda zwraca wartości takie jak funkcja ArcRead. Metoda powoduje ustawienie pól Value, Status i Time oraz pozostałych pól związanych ze statusem i czasem obiektu Variable wartościami odczytanymi z archiwum. Jeśli archiwum nie zawiera danej z chwili określonej parametrem czas, to pole Value zostanie ustawione na podstawie interpolacji innych wartości zapamiętanych w archiwum. Sposób tej interpolacji jest określony metodą ArcParam. Jeśli metoda ArcParam nie została wcześniej wywołana, to rezultat wywołania metody ArcReadAt jest niezdefiniowany. Po pomyślnym wykonaniu metody ArcReadAt, pole Time zawsze zawiera czas równy czasowi określonemu parametrem czas.

  • Metoda ArcSeek

Postać wywołania:

obiekt.ArcSeek( czas[, punkt_startowy] )

gdzie:

obiekt

obiekt Variable

czas

określa nową pozycję wskaźnika archiwum i jest czasem absolutnym w przypadku ORIGIN_SET. Czas absolutny podawany jest w formacie VT_DATE. W pozostałych przypadkach czas jest wartością numeryczną określającą przesunięcie w sekundach odniesione do bieżącej pozycji wskaźnika archiwum (dla ORIGIN_CUR) lub do końca archiwum (dla ORIGIN_END). Czas może być również wyrażony jako liczba milisekund [image] (uwaga: nie wolno w ten sposób wyrazić czasu wcześniejszego niż 01.01.1980) (Patrz: 5.20 Uwagi na temat czasu)

punkt_startowy

parametr określa punkt czasu do którego odnosi się parametr czas, i może przyjmować następujące wartości:

ORIGIN_SET

ORIGIN_CUR

ORIGIN_END

Jeśli parametr jest pominięty to przyjmuje się, że parametr ma wartość ORIGIN_SET, zaś parametr czas określa czas absolutny.

Metoda zwraca wartość 0 jeśli zakończyła się pomyślnie i wartość ujemną w przypadku błędu. Dodatkowe informacje na temat czasu znajdują się w Uwagi na temat czasu.

Metoda nie powoduje aktualizacji pól Value, Time i Status oraz pozostałych pól związanych ze statusem i czasem. Aby zaktualizować te pola należy wykonać metodę ArcRead.

  • Metoda ArcTell

Postać wywołania:

obiekt.ArcTell

gdzie:

obiekt

obiekt Variable

Metoda zwraca czas, na jaki jest ustawiony wskaźnik archiwum.

  • Metoda Read

Postać wywołania:

obiekt.Read( )

gdzie:

Obiekt

obiekt Variable

Metoda powoduje odczyt wartości z urządzenia zewnętrznego lub zmiennej umieszczonej w kanale NONE. Po wykonaniu tej metody, pola Value, Status i Time oraz pozostałe pola związane ze statusem i czasem obiektu Variable zostaną odpowiednio zaktualizowane. Jeśli pola te służyły uprzednio do przeglądu archiwum zmiennej, to po wykonaniu funkcji Read będą się one odnosić do wartości bieżących tzn. wartością pola Current będzie true.

Metoda zwraca 0 jeśli, operacja zapisu zakończyła się pomyślnie.

  • Metoda Write

Postać wywołania:

obiekt.Write( wartość[, status[,czas]] )

gdzie: | obiekt | obiekt Variable
 | wartość | wartość do zapisu
 | status | status zapisywanej wartości. Jeśli parametr jest pominięty, to przyjmuje się status "dana poprawna". Wykorzystywane są statusy OPC (patrz: Status danych.)
 | czas | stempel czasu zapisywanej wartości. Jeśli parametr jest pominięty to przyjmowany jest czas bieżący. Czas może być wyrażony jako liczba milisekund [image] (uwaga: nie wolno w ten sposób wyrazić czasu wcześniejszego niż 01.01.1980) (Patrz: 5.20 Uwagi na temat czasu).

Metoda pozwala na zapis wartości do urządzenia zewnętrznego lub zmiennej umieszczonej w kanale NONE. Parametr status i czas mają znaczenie tylko dla zmiennych znajdujących się w kanale NONE, który dodatkowo musi mieć określony parametr Zapis czasu i statusu.

Metoda zwraca 0 jeśli, operacja zapisu zakończyła się pomyślnie.

Metoda Write nie powoduje aktualizacji pól Value, Status i Time oraz pozostałych pól związanych ze statusem i czasem. Pole te mogą zostać zaktualizowane w wyniku wykonania metody Read lub w wyniku automatycznego odczytu nowej wartości przez moduł ASMEN (o ile pola te odnoszą się do wartości bieżących, a nie archiwalnych, tzn. jeśli pole Current ma wartość true).

  • Metoda ReadRaw

Postać wywołania:

obiekt.ReadRaw (czas_początku, czas_końca, dane)

gdzie:

obiekt

obiekt Variable

Czas_początku i Czas końca

muszą być typu Date lub String i są czasami lokalnymi lub UTC, w zależności od ustawienia pola UTCMode obiektu. Czas może być również wyrażony jako liczba milisekund [image] (uwaga: nie wolno w ten sposób wyrazić czasu wcześniejszego niż 01.01.1980) (Patrz: 5.20 Uwagi na temat czasu). Dla typu String przyjmuje się, że czas podany jest zgodnie z regułami określonymi dla czasu względnego OPC (patrz: Format czasu OPC)

dane

Po zakończeniu operacji czytania parametr dane zawiera tablicę przeczytanych próbek. Tablica zawiera tyle wierszy, ile jest przeczytanych próbek. Każdy wiersz zawiera 3 elementy:

0. wartość - typu Double; zawiera dane źródłowe skonwertowane do typu Double,

1. stempel czasu - typu Date, w konwencji zgodnej z ustawieniem pola UTCMode. (Patrz: 5.20 Uwagi na temat czasu).

2. jakość - typu Integer; zawiera 32-bitowy status OPC danych historycznych (Statusy OPC dla danych historycznych).

W tablicy zwracane są również wartości graniczne dla podanego okresu czasu. Jeżeli w archiwum nie zarejestrowano próbki dokładnie w chwili czasowej czas_początku, to zwracana jest ostania próbka sprzed tej chwili czasowej. Jeżeli w archiwum nie zarejestrowano próbki dokładnie w chwili czasowej czas_końca, to zwracana jest pierwsza próbka zarejestrowana za tą chwilą czasową. Jeżeli nie można pobrać z archiwum wartości granicznych, to zwracana jest próbka, której pole jakość ma wartość OPCHDA_NOBOUND.

Metoda umożliwia odczyt serii surowych danych archiwalnych.

ReadRaw czyta wartości, statusy i stemple czasu zmiennej z archiwum z podanego okresu. Czyta rzeczywiste wartości zapisane w archiwum, zwracając również wartości obejmujące końce przedziału.

  • Metoda ReadProcessed

Postać wywołania:

obiekt.ReadProcessed( czas_początku, czas_końca, nazwa_agregatu, interwał_agregacji, dane )

gdzie: | obiekt | obiekt Variable
 | Czas_początku i Czas końca | muszą być typu Date lub String i są czasami lokalnymi lub UTC, w zależności od ustawienia pola UTCMode obiektu. Dla typu String przyjmuje się, że czas podany jest zgodnie z regułami określonymi dla czasu względnego OPC. Czas może być również wyrażony jako liczba milisekund [image] (uwaga: nie wolno w ten sposób wyrazić czasu wcześniejszego niż 01.01.1980) (patrz: Format czasu OPC, 5.20 Uwagi na temat czasu).
 | interwał_agregacji | Parametr interwał_agregacji powinien zawierać długość interwału agregacji podaną jako typ Date lub String (czas względny OPC). Interwał agregacji będzie liczony zawsze od początku dnia w czasie UTC i nie powinien zawierać składników D, MO, Y
 | nazwa_agregatu | Parametr nazwa_agregatu powinien zawierać jedną z poniższych nazw agregatu (patrz: Tabela 1. Zestawienie agregatów zmiennych archiwalnych.).

Metoda umożliwia odczyt serii zagregowanych danych archiwalnych.

ReadProcessed oblicza agregaty danej zmiennej w podanym okresie.

Działanie metody uzależnione jest od ustawień pól: AggregateMode, QualityGoodThreshold, QualityBadThreshold.

  • Metoda ReadAttribute

Postać wywołania:

obiekt.ReadAttribute( nazwa_atrybutu )

gdzie: | obiekt | obiekt Variable
 | nazwa_atrybutu | Jako parametr nazwa_atrybutu należy przekazać nazwę atrybutu lub jedną ze stałych: atrDescription - opis zmiennej, atrEU - jednostka pomiarowa, atrRangeLo - dolny zakres pomiarowy, atrRangeHi - górny zakres pomiarowy, atrSampleRate - okres próbkowania, atrArchiveRate - okres archiwizacji;

Metoda umożliwia dostęp do atrybutów zmiennej zapisanych w bazie definicji zmiennych.

Dla danej zmiennej obiektu metoda zwraca wartość określonego atrybutu.

Zdarzenia

  • Zdarzenie OnRead

Zdarzenie jest generowane w chwili, gdy moduł ASMEN odczyta nową daną pomiarową. Funkcja reakcji na zdarzenie powinna mieć postać:

Listing 38. Przykład skryptu z funkcją reakcji na zdarzenie obiektu 'Variable'.

VBScript

JScript

Parametry funkcji określają odpowiednio wartość, status oraz czas danej pomiarowej. Wykorzystywane są statusy OPC (patrz: Status danych.)

Zdarzenie jest generowane tylko wtedy, gdy pole Current ma wartość true.

Składowe zarezerwowane

Składowe zarezerwowane mają nazwy: Extra, Explicite, Diagnostics, First, Last, Next, Previous, WithBreaks, SkipBreaks, NextBreak, PrevBreak, FirstBreak, LastBreak, Break, BreakEnd, Find, Search, Info, AtBreak, Move, AtData, Archive, MoveTo, Refresh, Open, ArcParam.


8 Akcja operatorska Skrypt

7 Akcja operatorska Skrypt

Skrypt może być uruchomiony także poprzez wykorzystanie akcji operatorskiej Skrypt. Deklarację akcji ułatwia edytor akcji dostępny w programie Architekt.

Składnia akcji jest następująca:

SKRYPT nazwa_pliku, parametry_skryptu parametry_wykonawcze

gdzie:

nazwa_pliku - określa nazwę pliku zawierającego skrypt. Jeżeli ścieżka dostępu nie zostanie podana, to przeszukiwane są katalogi ścieżki masek. Jeżeli nie podane zostanie rozszerzenie pliku, to dodawane jest vbs.

parametry_skryptu - parametry przekazywane do wykonywanego skryptu.

parametry wykonawcze - parametry przekazywane do modułu skryptów (a nie do skryptu) i określające parametry wykonywania skryptu różne od domyślnych.

Parametry wykonawcze podaje się w konwencji programu cscript, tj. są one poprzedzone podwójnym ukośnikiem.

Parametry wykonawcze:

//S - w danej chwili może być uruchomiony tylko jeden skrypt z parametrem //S, zawarty w podanym pliku; parametr ma znaczenie tylko w przypadku uruchamiania skryptu jako akcji operatorskiej systemu asix; moduł skryptów odrzuci próbę ponownego uruchomienia skryptu w sytuacji, gdy poprzednie uruchomienie skryptu z parametrem //S, zawartego w tym samym pliku, jeszcze się nie zakończyło; brak tego parametru powoduje, że można równocześnie uruchamiać wiele skryptów w oparciu o program zawarty w tym samym pliku.;

//X - po uruchomieniu skryptu jest również uruchamiany debugger (zainstalowany w systemie jako domyślny); debugger zatrzymuje wykonanie skryptu na pierwszej instrukcji skryptu;

//D - wystąpienie błędu w skrypcie powoduje uruchomienie debuggera;

//IT:nnn - ograniczenie czasu wykonania części inicjalizacyjnej wyrażone w milisekundach;

//T:nnn - ograniczenie czasu wykonania części zdarzeniowej wyrażone w milisekundach;

//E:nazwa - podaje nazwę języka skryptu (np. //E:JScript);

//Watek:nazwa[,pri] - podaje nazwę wątku, w którym wykonuje się skrypt oraz określa priorytet pri wątku; nazwa wątku może być dowolna i służy grupowaniu skryptów wykonywanych w jednym wątku;

priorytety wątku skryptu:

0 IDLE &endash; bezczynny,

1 LOWEST &endash; najniższy,

2 BELOW_NORMAL - poniżej normalnego,

3 NORMAL - normalny (domyślny),

4 ABOVE_NORMAL - powyżej normalnego,

5 HIGHEST &endash; najwyższy,

6 TIME_CRITICAL - krytyczny czasowo;

domyślnym priorytetem wątku jest priorytet 3 (normalny).

//U - podanie tego parametru spowoduje, że nie będą generowane zdarzenia „OnRead" oraz funkcje zdarzeń czasowych zdefiniowane metodami SetInterval i ExecuteAt, jeśli okna aplikacji asix są ukryte (np. za pomocą akcji operatorskiej UKRYJ).


1

Pomoc dla użytkowników systemu asix 6

www.asix.com.pl

Skrypty

Dok. Nr PLP6068

Wersja: 29-01-2010

ASKOM® i asix™ to zastrzeżone znaki firmy ASKOM Sp. z o. o., Gliwice. Inne występujące w tekście znaki firmowe bądź towarowe są zastrzeżonymi znakami ich właścicieli.

Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną lub inną powoduje naruszenie praw autorskich niniejszej publikacji.

ASKOM Sp. z o. o. nie bierze żadnej odpowiedzialności za jakiekolwiek szkody wynikłe z wykorzystywania zawartych w publikacji treści.

Copyright © 2010, ASKOM Sp. z o. o., Gliwice

ASKOM Sp. z o. o., ul. Józefa Sowińskiego 13, 44-121 Gliwice,

tel. +48 (0) 32 3018100, fax +48 (0) 32 3018101,

http://www.askom.com.pl, e-mail: office@askom.com.pl

Spis treści

1 Uwagi ogólne

2 Wymagania programowe

3 Uruchamianie i wykonywanie skryptów

3.1 Wątki

3.2 Kontrola czasu wykonania skryptu

3.3 Śledzenie zmian w pliku skryptu

3.4 Współpraca z debuggerem skryptów

4 Ogólna postać skryptu

4.1 Części skryptu

4.2 Deinicjalizacja skryptu

4.3 Dostęp do zasobów systemu ASIX

4.4 Reakcja na zdarzenia

5 Funkcje modelu obiektowego modułu skryptów

5.1 Dostęp do danych pomiarowych

5.2 Dostęp do danych archiwalnych

5.3 Odczyt serii danych surowych

5.3.1 Przykład użycia

5.4 Odczyt serii danych zagregowanych

5.4.1 Przykład użycia

5.5 Odczyt atrybutów zmiennych z bazy definicji zmiennych

5.5.1 Przykład użycia

5.6 Dostęp do informacji o bieżącym użytkowniku systemu asix

5.7 Status danych

5.8 Dynamiczne składowe obiektów

5.9 Przeliczanie i zapis danych pomiarowych

5.10 Zmienne tablicowe

5.11 Zmienne tablicowe i operacje na tekstach

5.12 Dostęp do systemu alarmów

5.13 Wykonywanie akcji operatorskich

5.14 Dostęp do zawartości pliku inicjalizacyjnego

5.15 Dostęp do parametrów umieszczonych w deklaracji skryptu

5.16 Zdarzenia związane z upływem czasu

5.17 Dostęp do zasobów zewnętrznych

5.18 Wymiana danych pomiędzy skryptami

5.19 Realizacja bibliotek funkcji

5.20 Uwagi na temat czasu

5.21 Format czasu OPC

6 Obiekty – model obiektowy modułu skryptów

6.1 Obiekt Application

6.2 Obiekt Alarms

6.3 Obiekt Asix

6.4 Obiekt GlobalData

6.5 Obiekt Info

6.6 Obiekt Panel

6.7 Obiekt Parameter

6.8 Obiekt Parameters

6.9 Obiekt Script

6.10 Obiekt Scripter

6.11 Obiekt ThreadGlobalData

6.12 Obiekt Variable

7 Parametryzacja modułu skryptów

8 Akcja operatorska Skrypt


3.1 WątkiW_tki

3.2 Wątki

Ponieważ skrypty mogą realizować zadania o różnych wymaganiach czasowych począwszy od przeliczania wartości często odczytywanych zmiennych procesowych po okresową generację raportów, moduł skryptów pozwala grupować skrypty o podobnych wymaganiach czasowych i podobnym stopniu ważności.

Każdy skrypt wykonuje się w kontekście jakiegoś wątku. Każdy wątek może zawierać wiele skryptów. Skrypty znajdujące się w oddzielnych wątkach wykonywane są współbieżnie. Skrypty znajdujące się w tym samym wątku wykonują się tylko wtedy, gdy nie wykonują się inne skrypty należące do tego samego wątku. Każdy wątek posiada określony priorytet, który decyduje o stopniu ważności wykonujących się w nim skryptów, tzn. skrypt znajdujący się w wątku o wyższym priorytecie może przerwać działanie każdego skryptu wykonującego się w wątku o niższym priorytecie. Takie przerwanie wystąpi zazwyczaj wtedy, gdy skrypt znajdujący się w wątku o wyższym priorytecie musi zareagować na wystąpienie jakiegoś zdarzenia. Takim zdarzeniem może być na przykład odczyt nowej wartości zmiennej procesowej.

Priorytet wątku jest określony wartością liczbową od 0 do 6. Wartości priorytetu odpowiadają wartościom priorytetów wątków systemu operacyjnego Microsoft Windows i mają następujące znaczenie:

0 &endash; bezczynny (ang. IDLE)

1 &endash; najniższy (ang. LOWEST)

2 &endash; poniżej normalnego (ang. BELOW NORMAL)

3 &endash; normalny (ang. NORMAL) - domyślny

4 &endash; powyżej normalnego (ang. ABOVE NORMAL)

5 &endash; najwyższy (ang. HIGHEST)

6 &endash; krytyczny czasowo (ang. TIME_CRITICAL)

Priorytet 3 (normalny) jest domyślnym priorytetem wątku, tj. wątek ma priorytet 3, jeśli w pliku konfiguracyjnym aplikacji systemu asix nie został określony inny priorytet.

Moduł skryptów tworzy wątki w chwili inicjalizacji. Wątki są usuwane w czasie kończenia aplikacji systemu asix. Każdy wątek (poza wątkiem domyślnym) ma swoją nazwę określoną w pliku konfiguracyjnym aplikacji asixa. Niezależnie od zapisów w w/w pliku konfiguracyjnym, moduł skryptów zawsze tworzy wątek domyślny. Wątek domyślny nie posiada nazwy i ma priorytet 3 (normalny). W wątku domyślnym wykonywane są wszystkie skrypty nie posiadające przypisania do określonego wątku.

Przypisanie skryptu do określonego wątku następuje poprzez podanie odpowiedniego parametru wykonawczego skryptu ustawianego za pomocą programu Architekt:

Architekt > Obszary i komputery > Parametry startowe > Skrypty > pole Parametry skryptu z wykorzystaniem 'Edytora parametrów wykonawczych skryptu' uruchamianego przyciskiem '...'.

Rys. Architekt - Edytor parametrów wykonawczych skryptu.

Parametr ma postać:

//wątek:nazwa_wątku[:priorytet]

gdzie:

Nazwa wątku - dowolnie wybrana nazwa wątku

Priorytet - liczba z zakresu od 0 do 6 określająca priorytet wątku

Ta sama nazwa wątku może wystąpić w deklaracjach wielu skryptów. Wszystkie takie skrypty będą wykonywane w tym samym wątku. Priorytet tego samego wątku można określać w jednej lub kilku deklaracjach. Jeśli występuje on w kilku deklaracjach, to musi mieć tą samą wartość.

Na podstawie analizy pliku konfiguracyjnego aplikacji moduł skryptów tworzy odpowiednie wątki oraz przypisuje do nich zadeklarowane skrypty.

PRZYKŁAD

Nazwa skryptu | Nazwa pliku skryptu | Parametry skryptu
raporter1 | raporty.vbs | //Thread:raporty,2
raporter2 | raporty.vbs | //Thread:raporty
przeliczniki | przelicznik.vbs | //Thread:przeliczniki,4
monitor | monitor.vbs |

W powyższym przykładzie zostaną utworzone trzy wątki: wątek domyślny o priorytecie 3 (normalny), wątek "raporty" o priorytecie 2 (poniżej normalnego) oraz wątek "przeliczniki" o priorytecie 4 (powyżej normalnego). Na podstawie programu skryptu zawartego w pliku o nazwie raporty.vbs zostaną utworzone dwa skrypty o nazwach "raporter1" oraz "raporter2". Oba skrypty będą wykonywane w wątku o nazwie "raporty". Na podstawie programu zawartego w pliku "przelicznik.vbs" zostanie utworzony skrypt o nazwie "przeliczniki". Skrypt będzie się wykonywał w wątku nazwie "przeliczniki" o priorytecie 4 (powyżej normalnego). W deklaracji skryptu "monitor" pominięto deklarację wątku - skrypt zostanie wykonany w wątku domyślnym, który ma priorytet 3 (normalny).

Priorytety skryptów należy dobierać w taki sposób, aby wykonywanie skryptów nie zakłócało pracy systemu asix. Główne zadanie systemu asix realizujące funkcje graficznego interfejsu użytkownika wykonuje się na priorytecie 3 (normalny). Skrypty pracujące w wątkach o tym samym lub wyższym priorytecie mogą spowodować spowolnienie odświeżania masek, jeśli realizacja zadań realizowanych przez te skrypty wymaga zbyt dużo czasu procesora. Szczególną ostrożność należy zachować w przypadku skryptów pracujących w wątkach o priorytetach wyższych niż normalny, ponieważ ich działanie może zakłócić funkcjonowanie innych komponentów systemu asix, takich jak moduł zbierania danych pomiarowych i moduł archiwizacji danych pomiarowych.

Skrypty należące do tego samego wątku są inicjalizowane w kolejności występowania deklaracji tych skryptów w pliku konfiguracyjnym aplikacji asixa. Kończenie skryptów wykonywane jest w odwrotnej kolejności. Kolejność inicjalizacji i kończenia skryptów może mieć istotne znaczenie dla skryptów wywołujących funkcje znajdujące się w innych skryptach i wymieniających dane z innymi skryptami.

Skrypty działające w różnych wątkach mogą wymieniać pomiędzy sobą dane. Jest również możliwe wywoływanie przez jeden skrypt funkcji, które znajdują się w innym skrypcie i w innym wątku.


3.4 Współpraca z debuggerem skryptów

3.5 Współpraca z debuggerem skryptów

Moduł skryptów systemu asix umożliwia uruchamianie skryptów pod kontrolą debuggera skryptów. Praca z debuggerem skryptów jest możliwa tylko wtedy, gdy w systemie został zainstalowany debugger skryptów. Opisane poniżej funkcje modułu skryptów w zakresie współpracy z debugger został przetestowane z wykorzystaniem Microsoft Script Debugger. Można również wykorzystywać debuggery zawarte w pakietach Excel, Word, InterDev i FrontPage. Można wykorzystywać debuggery zgodne z technologią ActiveX ® Scripting.

Głównym parametrem odpowiedzialnym za współpracę jest parametr Ustawienia debuggera w pliku konfiguracyjnym aplikacji:

  • Ustawienia debuggera - parametr określa zakres współpracy modułu skryptów z debuggerem skryptów

  • Uruchamiaj skrypty bez debuggera &endash; wybranie tej opcji oznacza, że debugger nie zostanie nigdy uruchomiony; w przypadku timeoutu lub błędu skryptu do panelu programu AS zostanie wyprowadzona informacja o błędzie z podaniem numeru linii i znak; parametry wykonawcze //X i //D podawane w deklaracji skryptu nie mają znaczenia, jeśli zadeklarowana zostanie opcja Uruchamiaj skrypty bez debuggera (deklaracja parametrów wykonawczych skryptu: Architekt > Obszary i komputery > Parametry startowe > Programy > pole Parametry skryptu);

  • Uruchamiaj skrypty pod kontrolą debuggera &endash; opcja umożliwia uruchamianie skryptów pod kontrolą debuggera;

  • Uruchamiaj skrypty i włączaj debugger w chwili inicjalizacji modułu skryptów;

Wartość domyślna: Uruchamiaj skrypty bez debuggera

Parametr ustawiany w module Architekt:

Architekt > Obszary i komputery > moduł Pozostałe > zakładka Parametry skryptów

Jeśli w deklaracji skryptu w pliku konfiguracyjnym aplikacji asixa podano parametr wykonawczy ”//X", to nastąpi zatrzymanie skryptu na pierwszej wykonanej w nim instrukcji. Dalsza praca skryptu jest kontrolowana za pośrednictwem debuggera. Parametr wykonawczy ”//X" ma znaczenie tylko wtedy, gdy parameter Ustawienia debuggera ma wartość Uruchamiaj skrypty pod kontrolą debuggera lub Uruchamiaj skrypty i włączaj debugger w chwili inicjalizacji modułu skryptów.

Kontrola czasu wykonania skryptu jest wyłączana w czasie, gdy skrypt jest zatrzymany w wyniku pracy krokowej lub ustawiania ”breakpoint’u" w debuggerze skryptów.


4.1 Części skryptu

Skrypt składa się zazwyczaj z części inicjalizacyjnej i części reagującej na zdarzenie. Skrypt może posiadać tylko część inicjalizacyjną. Dotyczy to zwłaszcza skryptów uruchamianych w wyniku akcji operatorskich. Wszystkie czynności w skryptach tego typu są realizowane w czasie uruchamiania skryptu. Pozostałe skrypty wykonują czynności inicjalizacyjne, w tym przyłączanie się do źródeł zdarzeń, a następnie przechodzą do fazy oczekiwania na zdarzenia.

Poniżej przedstawiono przykład skryptu posiadającego odrębną część inicjalizacyjną oraz część reagującą na zdarzenie.

Listing 1. Fragment skryptu posiadającego odrębną część inicjalizacyjną oraz część reagującą na zdarzenie polegające na pozyskaniu przez moduł ASMEN nowej wartości zmiennej procesowej.

VBScript

JScript


4.3 Dostęp do zasobów systemu ASIX

Dostęp do zasobów systemu asix odbywa się za pośrednictwem zestawu obiektów udostępnianych przez moduł skryptów. Każdy skrypt uruchamiany przez moduł skryptów ma bezpośredni dostęp do obiektu Asix - głównego obiektu udostępnianego przez moduł skryptów. Dostęp do innych obiektów odbywa się za pomocą obiektu Asix i innych obiektów pozyskanych za pomocą obiektu Asix.

Listing 3. Fragment skryptu przedstawiającego dostęp do obiektu Panel oraz wyprowadzenie za jego pomocą komunikatu o treści „komunikat".

VBScript

JScript

W powyższym przykładzie pokazano dostęp do obiektu Panel oraz wyprowadzenie za jego pomocą komunikatu o treści „komunikat". Przyporządkowanie obiektu (tutaj Panel) do zmiennej języka (w tym przypadku jest to zmienna „Panel") nie jest konieczne, ale może mieć wpływ na czas wykonania skryptu, jeśli następują częste odwołania do danego obiektu. Jeśli skrypt często wyprowadza komunikaty, to korzystniej jest przechowywać obiekt Panel w oddzielnej zmiennej.

Listing 4. Fragment skryptu wyprowadzającego komunikat bez użycia dodatkowej zmiennej.

VBScript

JScript

Powyżej przedstawiono przykład wyprowadzania komunikatu bez użycia dodatkowej zmiennej.

Jednym z najważniejszych obiektów udostępnianych przez moduł skryptów jest obiekt Variable, który reprezentuje zmienną procesową. Obiekt Variable jest zwracany przez obiekt Asix w wyniku wykonania funkcji Variables.

W poniższym przykładzie pokazano dostęp do obiektu reprezentującego zmienną.

Listing 5. Fragment skryptu realizującego dostęp do obiektu reprezentującego zmienną o nazwie „Emisja_CO2".

VBScript

JScript


4 Ogólna postać skryptu


5.1 Dostęp do danych pomiarowych

Metoda Variables obiektu Asix zapewnia dostęp do zmiennych procesowych systemu asix. W wyniku jej wykonania zostaje zwrócona wartość będąca obiektem reprezentującym zmienną. Argumentem jest nazwa oraz typ archiwum. W przypadku niepowodzenia, tj. np. w przypadku braku danej wartości w bazie danych ASMEN’a, metoda zwraca wartość pustą, co można wykorzystać w skrypcie do detekcji błędnych nazw zmiennych.

Listing 10. Przykład skryptu realizującego dostęp do zmiennej procesowej systemu asix wraz z detekcją błędnych nazw zmiennych.

VBScript

JScript

Każdorazowe wywołanie funkcji z tym samym argumentem powoduje zwrócenie nowego obiektu odwołującego się do tej samej zmiennej asixa. Czas życia takiego obiektu to czas istnienia odwołania do tego obiektu w skrypcie.

Obiekt Variable posiada składowe Value, Status i Time określające odpowiednio wartość, status i czas ostatnio odczytanej danej pomiarowej. Odczyt danych pomiarowych jest automatycznie realizowany przez moduł ASMEN systemu asix w cyklu odświeżania wynikającym z definicji zmiennej procesowej. Do odczytu aktualnej wartości pomiaru można również wykorzystać metodę Read obiektu Variable – wymusza to odświeżenie wartości zmiennej procesowej w chwili wykonania metody. Wartości pól Value, Status i Time nie ulegają zmianie w trakcie wykonywania bieżącego fragmentu skryptu tj. części inicjalizacyjnej skryptu, lub funkcji obsługi zdarzenia. Wyjątkiem od tej zasady może być wywołanie metody obiektu zewnętrznego, tj. obiektu spoza zestawu obiektów udostępnianych przez moduł skryptów lub tych metod modułu skryptów, których celem jest zmiana wartości tych pól (np.: Read, ArcRead, zapis do pola Current itd.).


5.2 Dostęp do danych archiwalnych

Jeśli argumentem funkcji Variables obiektu Asix jest nazwa zmiennej wraz z jednoliterowym kodem typu archiwum, to moduł skryptów będzie próbował otworzyć bazę pomiarów archiwalnych. Jeśli próba zakończy się pomyślnie, to wartością logiczną pola WithArchive obiektu Info będzie true (dostęp do obiektu Info następuje poprzez pole Info obiektu Variable). Można wtedy wykorzystać metody ArcRead, ArcReadAt, ArcSeek i ArcTell do przeglądu danych archiwalnych. Należy zwrócić uwagę, że wartości danych archiwalnych są zwracane przez obiekt Variable za pomocą składowych Value, Status i Time, które wykorzystywane są również do zwracania wartości bieżących. Aby uniknąć niejednoznaczności, obiekt Variable posiada pole Current, która ma wartość true, jeśli zwracane są wartości bieżące i false w przeciwnym wypadku. Wykonanie jakiejkolwiek funkcji dostępu do danych archiwalnych powoduje ustawienie tego pola na wartość false. Gdy pole Current ma wartość false, funkcja reakcji na zdarzenie OnRead nie jest wywoływana. Aby przywrócić dostęp do bieżących pomiarów, należ przypisać polu Current wartość logiczną true. Spowoduje to aktualizację pól Value, Status i Time wartościami bieżącymi.

Poniżej przedstawiono przykład skryptu odczytującego wartość zmiennej o nazwie „Emisja" z archiwum typu D. Odczytywana jest wartość z 20 stycznia 2002 z godziny 17:50:31. Przykładowy skrypt zawiera wywołanie metody ArcParam obiektu Variable z parametrem INTR_NEAREST. Wywołanie tej metody spowoduje zwrócenie najbliższej wartości, jeśli archiwum nie zawiera danej pomiarowej z określonej chwili. Jeśli odczyt wartości archiwalnej zakończy się pomyślnie, to do panelu kontrolnego zostanie wyprowadzona odczytana wartość.

Listing 11. Przykład skryptu odczytującego wartość zmiennej o nazwie „Emisja" z archiwum typu D.

VBScript

JScript


5.3.1 Przykład użycia

W poniższym przykładzie czytane są dane surowe archiwum D zmiennej Var z okresu od StartTime do EndTime.

Listing 12. Przykład skryptu odczytującego serię danych surowych z zadanego okresu czasu.


5.4.1 Przykład użycia

W poniższym przykładzie czytane są średnie 5-minutowe archiwum D zmiennej Var z okresu od StartTime do EndTime.

Listing 13. Przykład skryptu odczytującego serię zagregowanych danych z zadanego okresu czasu.


5.5.1 Przykład użycia

Listing 14. Przykład skryptu odczytującego z bazy definicji zmiennych atrybuty danej zmiennej.


5.6 Dostęp do informacji o bieżącym użytkowniku systemu asix

Informacje o bieżącym użytkowniku systemu asix są udostępnione jako nowe pola obiektu Asix:

obiekt.CurrentUserId – identyfikator bieżącego użytkownika

obiekt.CurrentUserName – nazwa bieżącego użytkownika

obiekt.CurrentUserLevel – poziom uprawnień bieżącego użytkownika


5.8 Dynamiczne składowe obiektów

Większość obiektów modelu obiektowego realizowanego przez moduł skryptów zezwala na dodawanie do obiektu nowych pól i metod. Pozwala to na powiązanie informacji z obiektem, którego one dotyczą. Pozwala to także na wzajemne powiązanie ze sobą obiektów. Przykładem zastosowania dynamicznych składowych i wzajemnego powiązania obiektów może być zadanie polegające na przeliczenie wartości każdej z określonego zestawu zmiennych (zmienne źródłowe) i zapisanie wyniku w innej zmiennej (zmienne docelowe). Z każdą zmienną źródłową powiązana jest określona zmienna docelowa, zaś przeliczenie wartości i zapis wyniku następuje w funkcji reakcji na zdarzenie OnRead. Zdarzenie OnRead jest generowane przez obiekt Variable po pozyskaniu przez moduł ASMEN nowych wartości pomiarowych.

Listing 15. Przykład skryptu zawierającego dynamiczne składowe obiektów.

VBScript

Jscript

W powyższym przykładzie zmienne źródłowe mają nazwy typu „Srcn", a zmienne docelowe „Dstn". Każdy obiekt reprezentujący zmienną źródłową posiada dynamicznie dodaną składową o nazwie „Dst". Składowa ta będzie przechowywać odsyłacz do obiektu reprezentującego zmienną docelową. W funkcji reakcji na zdarzenie OnRead (wspólnej dla wszystkich zmiennych źródłowych) następuje wykorzystanie składowej dynamicznej „Dst" do lokalizacji odpowiedniej zmiennej docelowej i zapisu do niej zanegowanej wartości zmiennej źródłowej. W przykładzie pokazano również sposób korzystania ze słów Me (VBScript) i this (JScript). Słowa te pozwalają na dostęp do obiektu, na rzecz którego wykonywana jest funkcja obsługi zdarzenia, a to z kolei pozwala napisać jedną uniwersalną funkcję obsługi zdarzenia dla wielu zmiennych. Oczywiście, w przypadku większej ilości zmiennych, zamiast szeregu deklaracji var VarSrcn, należałoby zmienne źródłowe umieścić w jakiejś strukturze (np. tablicy) gromadzącej wszystkie zmienne źródłowe. Dla zmiennych docelowych nie jest wymagana żadna struktura, ponieważ są one przechowywane w składowych dynamicznych „Dst" zmiennych źródłowych.

UWAGA Obiekty zezwalające na tworzenie dynamicznych składowych mogą rezerwować pewien zestaw nazw składowych, które zostaną wykorzystane w przyszłości. Zarezerwowanych nazw składowych nie wolno wykorzystywać w skrypcie. Każdy obiekt rezerwuje nazwy Diagnostics i Explicite.

UWAGA Należy tutaj zauważyć, że język VBScript nie rozróżnia wielkości liter w czasie dostępu do składowych obiektu. Jeśli w języku JScript utworzymy dwie składowe dynamiczne o nazwach „aa" i „AA":

obiekt.aa = 5;
obiekt.AA = 6;

to w języku VBScript będzie możliwy dostęp tylko do składowej o nazwie „aa", niezależnie od tego, czy użyje się konstrukcji „obiekt.aa" czy też „obiekt.AA".

W języku JScript składowe dynamiczne tworzone są poprzez użycie operatora dostępu do składowej („.") w instrukcji przypisania (jak w przykładzie powyżej). Jeśli składowa nie istnieje, to zostanie utworzona oraz zostanie do niej przypisana nowa wartość. W języku VBScript nie można użyć tej samej metody. Instrukcja przypisania do nieistniejącej składowej kończy się błędem. W tym celu, każdy obiekt zezwalający na dynamiczne dodawanie składowych udostępnia metodę Set, której wywołanie ma postać:

obiekt.Set(nazwa_składowej) = wartość

gdzie: nazwa_składowej to łańcuch znaków ujęty w cudzysłowy określający nazwę nowej składowej.

Jeśli w chwili wykonania metody Set, składowa o podanej nazwie nie istnieje, to zostanie ona utworzona.

Analogicznie do metody Set, każdy obiekt zezwalający na dodawanie składowych dynamicznych posiada metodę Get, która zwraca wartość składowej.

obiekt.Get(nazwa_składowej)

Korzystanie z metody Get zazwyczaj nie jest konieczne. Wyjątkiem jest operacja pobrania dynamicznej metody obiektu w języku VBScript, tj. wtedy gdy należy potraktować metodę jako pole i pobrać jego zawartość jako odsyłacz do metody.

Asix.GlobalData.Set(„Przelicznik") = GetRef(„Przelicznik") ‘metoda dynamiczna

Set Przelicznik = Asix.GlobalData.Get(„Przelicznik") ‘pobranie zawartości pola o nazwie Przelicznik

Przelicznik() ‘wywołanie funkcji

Ze względu na składnię języka VBScript, instrukcja:

Set Przelicznik = Asix.GlobalData.Przelicznik

nie pozwala na jednoznaczną interpretację jako pobranie pola, a nie jego wywołanie jako metody, ponieważ VBSvript pozwala pomijać nawiasy funkcji, które nie mają parametrów. W takiej sytuacji metoda Get pozwala uniknąć niejednoznaczności.

Z obu metod można korzystać w każdym języku skryptu. Metody można również wykorzystać do tworzenia oraz dostępu do składowych, których nazwy są sprzeczne z regułami języka skryptu.

Wartością składowej dynamicznej obiektu może być nie tylko dana prosta (liczba, tekst), ale także obiekt i metoda (funkcja).

W przypadku, gdy wartością składowej dynamicznej jest funkcja, to można ją wykorzystywać tak jak metodę obiektu, którego jest składową. W szczególności, jeśli słowa kluczowe Me języka VBScript i this języka Jscript są wykorzystane wewnątrz takiej funkcji, to odnoszą się do obiektu, którego funkcja jest składową.

PRZYKŁAD

Listing 16. Przykład skryptu zawierającego składową dynamiczną w formie metody o nazwie „Fun" dodaną do obiektu ‘Variable’.

VBScript

JScript

W powyższym przykładzie do obiektu Variable dodano składową dynamiczną w formie metody o nazwie „Fun". Wykonanie obu skryptów spowoduje wyprowadzenie do panelu kontrolnego systemu ASIX komunikatu o treści „Zmienna Emisja_CO2". Wywołanie tej funkcji jako funkcji samodzielnej (instrukcja „Fun()" a nie „Var.Fun()") zakończy się błędem, ponieważ w takim przypadku słowa kluczowe Me oraz this nie odnoszą się do obiektu Variable.

UWAGA Należy unikać tworzenia powiązań pomiędzy obiektami tworzących zamknięty cykl.


5.12 Dostęp do systemu alarmów

Model obiektowy modułu skryptowego umożliwia generację i sprawdzanie stanu alarmów systemu asix. Alarmy są identyfikowane za pomocą numerów i są zadeklarowane w odpowiednich plikach konfiguracyjnych. Informacje na ten temat można znaleźć w dokumentacji systemu asix.

Metody Raise, Cancel i State obiektu Asix służą odpowiednio do ustawiania, zerowania i sprawdzania stanu alarmu. Parametry funkcji Raise i Cancel pozwalają podać dwa parametry alarmu oraz czas (patrz: Uwagi na temat czasu).


5.14 Dostęp do zawartości pliku inicjalizacyjnego

5.14 Dostęp do zawartości pliku konfiguracyjnego

Model obiektowy umożliwia dostęp do zapisów w sekcjach pliku konfiguracyjnego aplikacji asix (pliki XML aplikacji systemu asix w wersjach od asix5). Umożliwia to metoda Parameters obiektu Asix. Metoda zwraca obiekt-kolekcję wszystkich parametrów option name umieszczonych w sekcji section name o nazwie określonej parametrem funkcji Parameters. Każdy element tej kolekcji jest obiektem zawierającym pola Name oraz Value, które zwracają nazwę parametru oraz jego wartość. Ponieważ pole Value jest polem domyślnym, to można jego nazwę pominąć. Obiekt zwracany przez funkcję Parameters, jako kolekcja, posiada pole Count określające ilość parametrów w sekcji (czyli ilość elementów kolekcji) oraz metodę Item, która pozwala na dostęp do parametru poprzez podanie jego numeru kolejnego (począwszy od wartości 1). Nazwy parametrów w sekcji pliku konfiguracyjnego mogą się powtarzać.

Listing 22. Przykład skryptu służącego do przeglądania sekcji o nazwie xxx pliku konfiguracyjnego.

VBScript

JScript

Listing 23. Przykład skryptu umożliwiającego dostęp do trzeciego parametru poprzez jego numer.

VBScript

JScript


5.15 Dostęp do parametrów umieszczonych w deklaracji skryptu

W deklaracji skryptu w pliku konfiguracyjnym aplikacji i w treści akcji SKRYPT można umieścić parametry przekazywane do skryptu.

Wewnątrz skryptu można odczytać te parametry wykorzystując pole Arguments obiektu Script (obiekt Script jest wartością pola Script obiektu Asix). Wartością pola Argument jest obiekt-kolekcja parametrów. Jako kolekcja, obiekt ten posiada pole Count oraz metodę Item.

Listing 24. Przykład skryptu wyprowadzającego wartości parametrów do panelu kontrolnego.

VBScript

Jscript

Parametry są również dostępne poprzez użycie numeru parametru (pierwszy ma numer 1).

Listing 25. Fragment skryptu deklarującego numer parametru.

VBScript

JScript

Kolekcja zawarta w polu Asix.Script.Argument ma takie same własności jak opisana w poprzednim punkcie kolekcja parametrów w sekcji pliku inicjalizacyjnego.


5.16 Zdarzenia związane z upływem czasu

Funkcje SetInterval i ExecuteAt obiektu Asix pozwalają powiązać wykonanie określonej funkcji z upływem czasu. Metoda SetInterval powoduje cykliczne wywoływanie funkcji określonej parametrem, a metoda ExecuteAt powoduje jednorazowe wykonanie funkcji o podanym czasie. Funkcje zwracają identyfikator powiązania funkcji z czasem, który można wykorzystać do anulowania takiego powiązania. Metoda SetInterval posiada dodatkowo parametr pozwalający na określenie wyrównania czasu w stosunku do pełnej wielokrotności interwału.

Metoda SetInterval ma postać:

SetInterval( funkcja, intervał[,przesunięcie])

Parametry czasowe są wyrażone w milisekundach.

Wywołanie w postaci SetInterval(funkcja,5000) spowoduje cykliczne wywoływanie funkcji co pięć sekund, natomiast wywołanie SetInterval( funkcja,5000,0) spowoduje, że funkcja będzie wywoływana o 00:00:00, 00:00:05, 00:00:10 itd. Wywołanie w postaci SetInterval(funkcja,5000,1000) spowoduje wywoływanie funkcji o 00:00:01, 00:00:06, 00:00:11 itd. Jeżeli Interval jest liczbą ujemną to funkcja wykona się tylko jeden raz.

Metoda ExecuteAt ma postać:

ExecuteAt( funkcja, czas )

Czas określony jest jako czas absolutny (patrz:Uwagi na temat czasu.).

Listing 26. Przykład skryptu cyklicznego wywoływania funkcji.

VBScript

JScript

Powiązanie funkcji z czasem usuwa się za pomocą funkcji ClearInterval.


5.17 Dostęp do zasobów zewnętrznych

Skrypty wykonywane przez moduł skryptów mogą mieć dostęp do zasobów zewnętrznych takich jak arkusze kalkulacyjne, poczta elektroniczna itp. Dostęp do zasobów zewnętrznych odbywa się za pomocą obiektów tworzonych przez funkcje wbudowane w język skryptów.

Poniżej pokazano uruchamianie programu Excel.

Listing 27. Skrypt uruchamiający program Excel.

VBScript

Jscript

Oprócz dostępu do obiektów zewnętrznych nie związanych bezpośrednio ze skryptami, istnieją obiekty, których głównym celem jest rozszerzenia zakresu funkcji realizowanych przez skrypt. Podstawowym przykładem takich obiektów jest FileSystemObject, który umożliwia dostęp do plików i katalogów.

Obiekt FileSystemObject tworzony jest w poniższy sposób.

Listing 28. Przykład skryptu tworzącego obiekt 'FileSystemObject'.

VBScript

Jscript

Innym przykładem są obiekty udostępniane przez Windows Script Host, które umożliwiają dostęp do zasobów sieciowych, rejestru systemu, uruchamianie programów i inne funkcje.

Poniżej podano listę niektórych obiektów.

WshShell - pozwala tworzyć procesy oraz skróty. Zapewnia dostęp do rejestru systemu operacyjnego. Pozwala zapisywać informacje do systemowego pliku log.

WshEnvironment - zapewnia dostęp do zmiennych środowiskowych.

WshSpecialFolders - zapewnia dostęp do katalogów takich jak „Pulpit", „Moje dokumenty" itp.

Poniżej zamieszczony został przykład dostępu do zmiennych środowiskowych systemu.

Listing 29. Przykład skryptu powodującego wyprowadzenie komunikatu o ilości procesorów systemu komputerowego.

VBScript

Jscript


5.18 Wymiana danych pomiędzy skryptami

Obiekt Asix posiada dwa pola GlobalData i GlobalThreadData, które umożliwiają wymianę danych pomiędzy skryptami. Oba pola zwracają obiekty, które posiadają tylko takie składowe, jakie zostały im przypisane przez skrypty. Składowe obiektu GlobalData są dostępne wszystkim skryptom obsługiwanym przez moduł skryptów. Ponieważ czas dostępu do obiektu jest długi, został wprowadzony obiekt ThreadGlobalData. Każdy wątek utworzony przez moduł skryptów posiada jeden własny obiekt ThreadGlobalData. Za pośrednictwem tego obiektu mogą być wymieniane dane pomiędzy skryptami należącymi do tego samego wątku. Czas dostępu do obiektu GlobalData jest około 30 razy dłuższy niż do obiektu GlobalThreadData.

Utworzenie nowej składowej obiektu globalnego następuje poprzez utworzenie nowej składowej dynamicznej w sposób opisany w punkcie 5.8. Dynamiczne składowe obiektów. Dane mogą być wymieniane pomiędzy skryptami napisanymi w różnych językach.


5.20.3 Konwersje czasu UTC

Począwszy od wersji AsSkryptera: dla 6.1 - od 6.1.0.651 lub dla wersji 6.0 - od 6.0.7.651 w obiekcie Asix znalazły się 2 nowe metody umożliwiające konwersję czasu lokalnego na UTC i odwrotnie:

LocalTime = Asix.UTCTimeToLocal( UTCTime )

Konwertuje czas UTC na lokalny. Wynik jest tego samego typu (Date lub liczba milisekund) co parametr.

UTCTime = Asix.LocalTimeToUTC( LocalTime [ , ExpectedUTCTime ] )

Konwertuje czas lokalny na czas UTC. Wynik jest tego samego typu (Date lub liczba milisekund) co parametry.

Dodatkowy parametr ExpectedUTCTime umożliwia prawidłową konwersję serii danych przy niejednoznaczności związanej z przestawieniem czasu z letniego na zimowy i oznacza jakiego w przybliżeniu wyniku się spodziewamy (+/- 0,5 h).

Przykład

Konwertujemy serię danych pochodzących z nocy 30/31.10.2010. Nastąpiło wtedy cofnięcie czasu lokalnego z 3:00 na 2:00.

Seria wygląda tak: 00:05, 01:02, 02:04 (czasu letniego), 02:05 (czasu zimowego), 03:01

' Konwersja

For n = 1 To 5

UTCTime[n] = Asix.LocalTimeToUTC( LocalTime[n] )

Next n

' Zapisze w UTCTime serię 22:05, 23:02, 01:04, 01:05, 02:01.

' 02:04 zostanie błędnie skonwertowane na 01:04, zamiast na 00:04, bo zarówno 02:04, jak i 02:05 potraktowano jako czas zimowy.

' Konwersja

CzasUTC = Now ' Tutaj tylko nadajemy zmiennej CzasUTC typ Date.

For n = 1 To 5

CzasUTC = Asix.LocalTimeToUTC( LocalTime[n], DateAdd("h", 1, CzasUTC) ) ' Oczekujemy kolejnej godziny.

UTCTime[n] = CzasUTC

Next n

' Zapisze w UTCTime serię 22:05, 23:02, 00:04, 01:05, 02:01.

' 02:04 zostanie teraz poprawnie skonwertowane na 00:04, bo oczekiwaliśmy, że wynik powinien być bliski 23:02 + 01:00 = 00:02.

' Dla 02:05 oczekiwaliśmy około 00:04 + 01:00 = 01:04 i dlatego otrzymaliśmy 01:05.


5 Funkcje modelu obiektowego modułu skryptów


6 Obiekty – model obiektowy modułu skryptów

Poniżej przedstawiono wszystkie obiekty udostępniane przez moduł skryptów.


7 Parametryzacja modułu skryptów

3.1 Deklaracja skryptów uruchamianych automatycznie

Deklaracja skryptów uruchamianych automatycznie podczas startu modułu wykonawczego systemu asix (dla pakietu asix5/6) odbywa się przy użyciu programu Architekt.

Patrz: Architekt - podręcznik użytkownika, rozdz. 3.4.2 Deklaracja programów startowanych jednocześnie z aplikacją \ Skrypty.