Witamy

>> Pomoc dla użytkowników systemu Asix - wersji 7

www.asix.com.pl

Asix.Evo - Techniki budowy diagramów

Dok. Nr PLH7E009

Wersja: 2013-12-10


1 Metody tworzenia uniwersalnych obiektów

W trakcie projektowania diagramów należy dążyć do tego, żeby możliwe było łatwe kopiowanie utworzonych obiektów, oraz żeby łatwo i szybko wprowadzać zmiany na poziomie całej aplikacji. Ten rozdział opisuje dostępne mechanizmy i techniki postępowania służące do osiągnięcia wspomnianego celu. W kolejnych rozdziałach techniki te będą konsekwentnie stosowane w opisywanych przykładach.


1.1 Sufiksowa notacja nazw zmiennych

Dobrze skonstruowany obiekt monitorujący stan zmiennej procesowej pozwala na wykonanie swojej kopii i przełączenie go na monitowanie innej zmiennej, poprzez zmianę tylko pojedynczej właściwości. Pierwszym z mechanizmów ułatwiających taką konstrukcję jest właściwość Zmienna główna i sufiksowa notacja nazw zmiennych.

Właściwości stanowe, grupa podstawowa
 | Tekst | =VarStringValue(V1)
 | Kolor | =Variable(V1)>50?Red:Black

Właściwości podstawowe
 | Główna zmienna | V1
Właściwości stanowe, grupa podstawowa
 | Tekst | #
 | Kolor | =Variable()>50?Red:Black

Powyższe fragmenty parametryzacji obiektu Tekst działają identycznie. W pierwszym przykładzie nazwa zmiennej jest użyta dwa razy. Zrobienie kopii i zmiana zmiennej wymagałaby ręcznej edycji dwóch właściwości. W drugim wariancie nazwa zmiennej użyta jest tylko raz. Użycie zmiennej głównej pozwala na zastosowanie bezparametrowej funkcji Variable oraz notacji skrótowej #, oznaczając odwołanie do sformatowanej wartości zmiennej głównej. Wykonanie kopii obiektu jest bardzo proste, co więcej będzie można też użyć funkcji edytora Grupowa zamiana zmiennych.

Właściwości podstawowe
 | Główna zmienna | V1
 | Zmienna sterowana | #Control
Właściwości stanowe, grupa podstawowa
 | Tekst | =VarStringValue(”#Value”)

Kolejny przykład pokazuje zastosowanie notacji sufiksowej bazującej na nazwie zmiennej głównej. Znak # użyty w kontekście nazwy zmiennej oznacza użycie wprost nazwy zmiennej głównej obiektu. W połączeniu z dodatkowym tekstem powoduje utworzenie nazwy zmiennej będącej połączeniem nazwy zmiennej głównej i podanego tekstu. W tym przykładzie nazwa zmiennej sterowanej to V1Control, a wyświetlany tekst, to wartość zmiennej V1Value. Ponieważ nigdzie nie ma bezpośredniego odwołania do zmiennej głównej, to V1 nie musi być nawet istniejącą zmienną.


1.2 Użycie atrybutów zmiennych

Kolejny mechanizm pozwalający na tworzenie uniwersalnych obiektów to atrybuty zmiennych procesowych.

Właściwości podstawowe
 | Główna zmienna | V1
Właściwości stanowe, grupa podstawowa
 | Tekst | #
 | Kolor | =Variable()>Attribute(LimitHi)?Red:Black

Z reguły każda zmienna będzie miała własny poziom limitu krytycznego. Podanie jego wartości wprost wymagałoby każdorazowej modyfikacji wyrażenia dla właściwości Kolor. Funkcja Attribute pobiera atrybut LimitHi zmiennej głównej obiektu. Po zmianie nazwy zmiennej głównej nowa wartość limitu zostanie pobrana automatycznie. Dodatkową korzyścią z użycia atrybutów zmiennej jest to, że późniejsza zmiana wartości limitów w bazie definicji zmiennych nie będzie wymagała modyfikacji diagramów.

W bazie definicji zmiennych można umieścić dowolne atrybuty z predefiniowanego zestawu. Można też dodawać własne atrybuty o dowolnym znaczeniu.


1.3 Właściwości globalne

Właściwości globalne definiowane są w osobnym panelu roboczym otwieranym za pośrednictwem panelu eksploratora. Właściwości globalne pozwalają na stworzenie zestawu parametrów, które definiują zachowanie i wygląd obiektów na wszystkich diagramach. Zmiana wartości właściwości globalnej jest natychmiast widoczna we wszystkich obiektach, które odwołują się do tej właściwości.

Właściwości stanowe, grupa podstawowa
 | Tekst | #
 | Kolor | !NormalColor

W powyższym przykładzie kolor tekstu wyświetlany jest w kolorze podanym we właściwości globalnej NormalColor. Późniejsza zmiana kolorystyki nie będzie wymagała zmiany w obiekcie.

Do wartości globalnej można odwołać się również przy pomocy funkcji Property.

Właściwości globalne zazwyczaj definiowane są w sposób bezpośredni. Możliwe są również inne sposoby, np. użycie wyrażenia.

=Color(Variable(),0,0)

Powyższe wyrażenie użyte we właściwości globalnej typu kolor, wylicza wartość koloru na podstawie wartości zmiennej głównej obiektu, który do właściwości się odwołuje. W dowolnym momencie można zmienić algorytm przeliczania, bez konieczności zmian w obiektach.

Jeżeli właściwość globalna nie jest zdefiniowana bezpośrednio, to należy się do niej odwoływać wyłącznie przez notację !.


1.4 Wzorce i parametryzowane diagramy

Wzorce i parametryzowane diagramy pozawalają tworzyć całe, predefiniowane zestawy obiektów do wielokrotnego użycia. Wzorce mogą być osadzane na diagramach, natomiast diagramy stanowią niezależną całość. Poprzez właściwą akcję otwarcia, diagramy parametryzowane mogą być użyte do pokazywania różnych danych (okienka typu „stacyjka”).

W obu tych mechanizmach projektant definiuje pewien zestaw parametrów, które sterują pracą obiektów w osadzonym wzorcu lub otwartym diagramie. Większość właściwości jest jednak zdefiniowana bezpośrednio we wzorcu. Późniejsza modyfikacja wzorca(diagramu) jest natychmiast uwzględniana w miejscu ich użycia.


2 Wyświetlenie wartości zmiennej procesowej w postaci tekstowej

Rozdział pokazuje w jaki sposób można wyświetlić wartość zmiennej procesowej w postaci tekstowej. Pokazane zostaną sposoby formatowania wyświetlanego tekstu oraz metody zmiany atrybutów wyświetlania w zależności od różnych warunków. W szczególności opisany zostanie sposób tworzenia obiektów wielostanowych.

W aplikacjach Asix.Evo do wyświetlania wszelkiego rodzaju tekstów, zarówno statycznych jak i dynamicznych, służy obiekt klasy Tekst.

Uwaga:

W przypadku potrzeby wyświetlenia wartości wielu zmiennych w postaci tabelarycznej można posłużyć się także obiektem klasy Tabela zmiennych.


2.1 Wyświetlenie sformatowanej wartości

Wariant A

Właściwości podstawowe
 | Główna zmienna | VA001
Właściwości stanowe, grupa podstawowa
 | Tekst | #

Wariant B

Właściwości stanowe, grupa podstawowa

Tekst

&VA001

Oba powyższe warianty parametryzacji powodują wyświetlenie wartości zmiennej VA001. Wartość zmiennej zostanie skonwertowana na tekst na podstawie atrybutu Format zapisanego w bazie definicji zmiennych. Na przykład, jeżeli format będzie postaci f2, to wartość zmiennej będzie przedstawiona z dwoma cyframi po przecinku. Jeżeli format w bazie zmiennych nie będzie zdefiniowany, to konwersja na tekst zostanie wykonana w sposób standardowy, zależny od typu wartości.

W wariancie A nazwa zmiennej podana jest we właściwości Główna zmienna, a tekst został określony poprzez notację skrótową #, oznaczającą pobranie wartości zmiennej głównej obiektu w postaci tekstowej.

W wariancie B użyta została tylko notacja skrótowa &nazwa_zmiennej. Oznacza ona pobranie wartości podanej zmiennej w postaci tekstowej. Z powodów, które zostaną podane później, zalecane jest stosowanie wzorca postępowania z wariantu A. Wariant B należy stosować tylko w najprostszych sposobach parametryzacji.

Wariant C

Właściwości podstawowe
 | Główna zmienna | VA001
Właściwości stanowe, stan podstawowy
 | Tekst | =VarStringValue()

Wariant jest identyczny w działaniu z wariantem A. Zamiast notacji skrótowej użyta została funkcja VarStringValue, która zwraca wartość zmiennej głównej obiektu w postaci tekstowej.

Wariant D

Właściwości podstawowe
 | Główna zmienna | VA001
Właściwości stanowe, stan podstawowy
 | Tekst | =Variable()

Wariant D różni się od poprzedniego użyciem funkcji Variable. Funkcja ta zwraca wartość zmiennej głównej w postaci liczbowej. Konwersja na tekst zostanie wykonana w sposób automatyczny, atrybut Format nie będzie miał znaczenia.

Wariant E

Właściwości podstawowe
 | Główna zmienna | VA001
Właściwości stanowe, stan podstawowy
 | Tekst | =”Temperatura = ” + VarStringValue()

Wyświetlony tekst będzie składał się z połączenia tekstu Temperatura = oraz sformatowanej wartości zmiennej VA001.

Wariant F

Właściwości podstawowe
 | Główna zmienna | VA001
Właściwości stanowe, stan podstawowy
 | Tekst | =Format("Temperatura = {0} \u00b0C", VarStringValue())

Sformatowana wartość zmiennej VA001 zostanie wstawiona do środka tekstu Temperatura = °C, w miejscu znacznika {0}. Funkcja Format pozwala w dowolny sposób tworzyć napisy na podstawie tekstu formatującego. W treści tekstu formatującego został pokazany sposób wstawiania do napisu znaku podanego w kodzie Unicode (\u00b0).

Wariant G

Właściwości podstawowe
 | Główna zmienna | VA001
Właściwości stanowe, stan podstawowy
 | Tekst | =Format("Temperatura = {0:f3} {1}", Variable(), Attribute(Unit))

Ten wariant działa podobnie do poprzedniego z dwoma różnicami. Liczbowa wartość zmiennej głównej jest przekazywana do funkcji Format, a sposób konwersji określa znacznik {0:f3}. Pozwala to na formatowanie inne niż podane w bazie zmiennych. Dodatkowo, opis jednostki pobierany jest z bazy zmiennych z atrybutu Unit(Jednostka) poprzez wywołanie funkcji Attribute. Przykład ten pokazuje jedną z korzyści ze stosowania właściwości Główna zmienna. Bez tego, analogiczne wyrażenie wyglądałoby tak:

=Format("Temperatura = {0:f2} {1}", Variable(VA001),Attribute(VA001,Unit))

Nazwa zmiennej byłaby użyta dwukrotnie. Znacznie trudniejsze jest przełączenie obiektu na monitorowanie wartości innej zmiennej.


2.2 Uzależnienie sposobu wyświetlenia tekstu od wartości

2.2 Uzależnienie sposobu wyświetlenia tekstu od wartości zmiennej

W wielu przypadkach, oprócz pokazania wartości zmiennej, konieczna jest kontrola atrybutów wyświetlania. Typowym przypadkiem jest kontrola stanów przekroczeń limitów, błędów pomiarowych itp.


2.2.1 Użycie wyrażeń warunkowych

Wariant A

Właściwości podstawowe
 | Główna zmienna | VA001
Właściwości stanowe, stan podstawowy
 | Tekst | #
 | Kolor | =Variable()>50?Red:Black

We właściwości Kolor zostało użyte wyrażenie warunkowe. Jeżeli wartość zmiennej głównej przekroczy 50, to wartość zmiennej zostanie wyświetlona w kolorze czerwonym.

Wariant B

Właściwości podstawowe
 | Główna zmienna | VA001
Właściwości stanowe, stan podstawowy
 | Tekst | #
 | Kolor | =Variable()>50?Red:Black
 | Styl czcionki | =Variable()>50?Bold:””

W wariancie B po przekroczeniu wartości 50 zmieniany jest kolor napisu oraz styl czcionki. Pomimo użycia mechanizmu zmiennej głównej, w dalszym ciągu rozwiązanie jest nieefektywne ze względu na dwukrotne użycie identycznego warunku logicznego. W przypadku, gdyby ten warunek musiał być zmieniony, nakład pracy i możliwość popełnienia błędu byłyby stosunkowo duże. Problem ten pozwala rozwiązać mechanizm stanów obiektu.


2.2.2 Użycie metody wielostanowej

Wariant C

Właściwości podstawowe
 | Główna zmienna | VA001
Właściwości stanowe, stan podstawowy
 | Tekst | #
 | Kolor | Black
Właściwości stanowe, stan numer 1
 | Warunek stanu | =Variable()>50
 | Kolor | Red
 | Styl czcionki | Pogrubienie

Każdy dodatkowo utworzony stan, oprócz pełnego zestawu właściwości stanu podstawowego, posiada dodatkową właściwość Warunek stanu. Jej wartość określa czy stan jest brany pod uwagę przy określaniu wartości właściwości. W przykładzie, gdy wartość zmiennej głównej przekroczy 50, stanowe definicje właściwości Kolor i Styl czcionki, będą miały pierwszeństwo przed definicjami dla stanu podstawowego. W efekcie uzyskany zostanie efekt jak w wariancie B, ale bez niepotrzebnego powtarzania warunku i bez wyrażeń warunkowych.


2.3 Zastosowanie limitów ostrzegawczych wartości zmiennej

Innym częstym problemem jest konieczność sygnalizacji przekroczeń wartości alarmowych. Wartości limitów alarmowych pomiaru niekiedy są przechowywane w innych zmiennych procesowych. Mogą być też zapisane w bazie zmiennych.


2.3.1 Zastosowanie notacji sufiksowej

W tym przykładzie zakładamy, że limity przechowywany są w zmiennych. Przy czy zachowana jest następująca konwencja nazewnicza: nazwy zmiennych limitów tworzone są przez dodanie sufiksów _lolo, _lo, _hi, _hihi do nazwy zmiennej pomiarowej.

Wariant A

Właściwości podstawowe
 | Główna zmienna | VA001
Właściwości stanowe, stan podstawowy
 | Tekst | #
 | Kolor | Black
Właściwości stanowe, stan numer 1
 | Warunek stanu | =Variable()<Variable(“#_lo”)
 | Kolor | Aqua
Właściwości stanowe, stan numer 2
 | Warunek stanu | =Variable()<Variable(“#_lolo”)
 | Kolor | Blue
Właściwości stanowe, stan numer 3
 | Warunek stanu | =Variable()>Variable(“#_hi”)
 | Kolor | Red
Właściwości stanowe, stan numer 4
 | Warunek stanu | =Variable()<Variable(“#_hihi”)
 | Kolor | Yellow

Utworzone zostały 4 stany kontrolujące przekroczenie 4 limitów. W wyrażeniach stanu porównywana jest wartość zmiennej głównej z wartością zmiennej limitu. Nazwy zmiennej typu #_lolo, to notacja sufiksowa, w której # reprezentuje nazwę zmiennej głównej.

Uzależnienie obiektu od nazw zmiennych jest minimalne, przełączenie obiektu na monitorowanie innej zmiennej wymaga jedynie zmiany nazwy zmiennej głównej.

Każdy ze stanów posiada własną definicje właściwości Kolor. Użyta do wyświetlenia zostanie wartość zdefiniowana dla stanu aktywnego. Jeżeli będzie więcej niż jeden aktywny stan, to wzięta zostanie wartość ze stanu o wyższym numerze. Dlatego, istotna jest kolejność definiowania stanów. Stan _lolo musi być definiowany po stanie _lo, a stan _hihi po stanie _hi.


1.3.2 Zastosowanie atrybutów zmiennej

2.3.2 Zastosowanie atrybutów zmiennej

Kolejny przykład zakłada, że wartości limitów przechowywane są w atrybutach w bazie zmiennych.

Wariant B

Właściwości podstawowe
 | Główna zmienna | VA001
Właściwości stanowe, stan podstawowy
 | Tekst | #
 | Kolor | Black
Właściwości stanowe, stan numer 1
 | Warunek stanu | =Variable()<Attribute(LimitLo)
 | Kolor | Aqua
Właściwości stanowe, stan numer 2
 | Warunek stanu | =Variable()<Attribute(LimitLoLo)
 | Kolor | Blue
Właściwości stanowe, stan numer 3
 | Warunek stanu | =Variable()>Attribute(LimitHi)
 | Kolor | Red
Właściwości stanowe, stan numer 4
 | Warunek stanu | =Variable()<Attribute(LimitHiHi)
 | Kolor | Yellow

Warunki stanu porównują wartość zmiennej z wartością odpowiedniego limitu pobranego z bazy zmiennych. Wartości limitów muszą być zapisane w bazie w postaci liczbowej.

Wariant C

Właściwości podstawowe
 | Główna zmienna | VA001
Właściwości stanowe, stan podstawowy
 | Tekst | #
 | Kolor | Black
Właściwości stanowe, stan numer 1
 | Warunek stanu | =Variable()<Variable(Attribute(LimitLo))
 | Kolor | Aqua
Właściwości stanowe, stan numer 2
 | Warunek stanu | =Variable()<Variable(Attribute(LimitLoLo))
 | Kolor | Blue
Właściwości stanowe, stan numer 3
 | Warunek stanu | =Variable()>Variable(Attribute(LimitHi))
 | Kolor | Red
Właściwości stanowe, stan numer 4
 | Warunek stanu | =Variable()<Variable(Attribute(LimitHiHi))
 | Kolor | Yellow

Warunki stanu porównują wartość zmiennej z wartością odpowiedniego limitu pobranego z bazy zmiennych. W tym przypadku jednak, wartości limitów zapisane w bazie są nazwami zmiennych (wartość atrybutu limitu jest przekazana do funkcji Variable).

Wariant D

Właściwości podstawowe
 | Główna zmienna | VA001
Właściwości stanowe, stan podstawowy
 | Tekst | #
 | Kolor | Black
Właściwości stanowe, stan numer 1
 | Warunek stanu | =Variable()<Asix6Attribute(LimitLo)
 | Kolor | Aqua
Właściwości stanowe, stan numer 2
 | Warunek stanu | =Variable()<Asix6Attribute(LimitLoLo)
 | Kolor | Blue
Właściwości stanowe, stan numer 3
 | Warunek stanu | =Variable()>Asix6Attribute(LimitHi)
 | Kolor | Red
Właściwości stanowe, stan numer 4
 | Warunek stanu | =Variable()<Asix6Attribute(LimitHiHi)
 | Kolor | Yellow

Ten przykład stanowi połączenie wariantów B i C. Funkcja Asix6Atrribute akceptuje zarówno limity liczbowe (zwracane bezpośrednio), jak i limity w postaci nazw zmiennych (zwracana jest wartość zmiennej). W bardziej skomplikowanych przypadkach można też użyć funkcję Asix6Limit.


2.4 Obsługa statusu monitorowanej zmiennej

Oprócz sygnalizacji przekroczeń, często wymagana jest również sygnalizacja problemów z odczytem zmiennych procesowych.

Wariant A

Właściwości podstawowe
 | Główna zmienna | VA001
Właściwości stanowe, stan podstawowy
 | Tekst | #
 | Kolor | Black
Właściwości stanowe, stan numer 1
 | Warunek stanu | =Variable()<Asix6Attribute(LimitLo)
 | Kolor | Aqua
Właściwości stanowe, stan numer 2
 | Warunek stanu | =Variable()<Asix6Attribute(LimitLoLo)
 | Kolor | Blue
Właściwości stanowe, stan numer 3
 | Warunek stanu | =Variable()>Asix6Attribute(LimitHi)
 | Kolor | Red
Właściwości stanowe, stan numer 4
 | Warunek stanu | =Variable()<Asix6Attribute(LimitHiHi)
 | Kolor | Yellow
Właściwości stanowe, stan numer 5
 | Warunek stanu | =VarIsNotGood()
 | Tekst | =VarStringValue() + “ ?”
 | Kolor przekreślenia | Violet

Stan numer 5 kontroluje status zmiennej głównej. Gdy jest on niepoprawny, do wartości dodawany jest znak zapytania, a wyświetlony tekst jest przekreślany. Niezależnie od statusu zmiennej, kontrola przekroczeń jest wykonywana w zwykły sposób.


3 Formatowanie wartości liczbowych

W rozdziale 2.1 Wyświetlenie sformatowanej wartości zostały omówione podstawowe zasady konwersji wartości liczbowych na teksty. W tym rozdziale zostanie dokładniej opisana postać łańcuchów formatujących sterujących sposobem konwersji.

Łańcuchy formatujące używane są w dwóch miejscach. Pierwsze z nich, to atrybut Format bazy definicji zmiennych. Stosowany jest w przypadku domyślnej konwersji na tekst (użycie odwołania #, &nazwa lub funkcji VarStringValue). Drugie miejsce to parametr formatujący funkcji Format.

Postać łańcuchów formatujących jest zgodna z formatem używanym w bibliotekach platformy .NET. Pełny opis formatu można znaleźć w dokumentacji .NET Framework dostępnej w Internecie.

Łańcuch formatujący używany w wywołaniach funkcji Format ma poniższą strukturę:

{indeks,długość_pola:format_pola}

W atrybucie Format bazy zmiennych należy stosować wyłącznie element format_pola.

Element indeks określa numer parametru wywołania funkcji Format, którego dotyczy dany łańcuch formatujący. Pierwszy parametr ma indeks 0.

Element długość_pola określa minimalną długość tworzonego tekstu. Jeżeli długość sformatowanego tekstu będzie krótsza od zadeklarowanej, to zostanie on uzupełniony odpowiednią liczbą spacji. Spacje są dodawane z lewej strony gdy pole ma wartość dodatnią, lub z lewej w przeciwnym przypadku.

Element format_pola określa sposób konwersji liczby na tekst. Sposób jego użycia pokażemy na przykładach.


3.1 Konwersja wartości numerycznych

W przypadku konwersji wartości numerycznych format pola składa się z jednoliterowego specyfikatora typu oraz liczbowego pola precyzji. Interpretacji pola precyzji zależy od użytego typu.

Specyfikator typu | Opis | Przykład
D , d | Formatowanie liczb całkowitych. Można stosować dla wartości zmiennoprzecinkowych, ale w tym przypadku zostanie wykonane zaokrąglenie do liczby całkowitej. Pole precyzji określa minimalną liczbę cyfr, w razie konieczności zostaną dodane zera nieznaczące. | ”D” 1234 -> 1234 ”D” 1234,56 -> 1235 ”D6” 1234 -> 001234
E , e | Formatowanie liczb zmiennoprzecinkowych w formie ekspotencjalnej. Pole precyzji określa liczbę cyfr ułamkowych. | ”E” 1234,56 -> 1,234560E+003 ”e2” 1234,56 -> 1,23e+003
F , f | Formatowanie liczb zmiennoprzecinkowych w postaci części całkowitej i ułamkowej rozdzielonych systemowym separatorem. Pole precyzji określa liczbę cyfr ułamkowych. | ”F” 1234,567 ->1234,57 ”F4” 1234,567 ->1234,5670 ”F1” 1234,567 ->1234,6
N , n | Formatowanie liczb zmiennoprzecinkowych w postaci części całkowitej i ułamkowej rozdzielonych systemowym separatorem. Oprócz tego grupy cyfr także zostaną rozdzielone separatorem. Pole precyzji określa liczbę cyfr ułamkowych. | ”N” 1234,567 ->1 234,57 ”N0” 1234,567 ->1 235
P , p | Formatowanie liczb zmiennoprzecinkowych lub całkowitych w postaci procentowej z dodanym znakiem %. Wartość przed sformatowaniem zostanie pomnożona przez 100.Pole precyzji określa liczbę cyfr ułamkowych. | ”P” 0,567 ->56,70% ”P1” 0,567 ->56,7%
X , x | Formatowanie liczb całkowitych w postaci szesnastkowej. Można stosować dla wartości zmiennoprzecinkowych, ale w tym przypadku zostanie wykonane zaokrąglenie do liczby całkowitej. Pole precyzji określa minimalną liczbę cyfr, w razie konieczności zostaną dodane zera nieznaczące. | ”X” 1234 ->4D3 ”x4” 1234 ->04d3

Oprócz formatowania opisanego powyżej można też użyć tzw. Custom Numeric Format Strings. Pełny opis znajduje się w dokumentacji platformy .NET Framework.


3.2. Konwersja wartości typu DateTime

W przypadku konwersji wartości typu DateTime można stosować standardowe formaty predefiniowane lub swobodnie tworzone formaty własne.

Poniższa tabelka pokazuje przykład formatowania standardowego.

Specyfikator typu | Opis | Przykład
d | Krótka data | 2012-02-16
D | Długa data | 16 lutego 2012
f | Długa data + krótki czas | 16 lutego 2012 16:33
F | Długa data + krótki czas | 16 lutego 2012 16:33:48
g | Pełna data + krótki czas | 2012-02-06 16:33
G | Pełna data + długi czas | 2012-02-06 16:33:48
M, m | Miesiąc + dzień | 16 lutego
t | Krótki czas | 16:33
T | Długi czas | 16:33:48
Y, y | Rok + miesiąc | luty 2012

Jeżeli powyższe sposoby formatowania są niewystarczające , to można stosować formaty własne. Taki format zdefiniowany jest sekwencją specyfikatorów opisujących poszczególne pola tworzonego tekstu. Na przykład format „dddd dd MMMM yyyy HH:mm:ss.fff” powoduje utworzenie tekstu „czwartek 16 lutego 2012 16:33:48.240”.

Poniższa tabelka opisuje podstawowe specyfikatory składowe formatów własnych.

Specyfikator typu | Opis
d | Dzień miesiąca jedno lub dwucyfrowy
dd | Dzień miesiąca dwucyfrowy
ddd | Skrócona nazwa dnia tygodnia
dddd | Pełna nazwa dnia tygodnia
f | Ułamkowa część sekundy, w zależności od ilości specyfikatorów f można uzyskać różną dokładność czasu.
H | Godzina, jedno lub dwucyfrowa
HH | Godzina, dwucyfrowa (duże H - format 24h; małe h - format 12h)
m | Minuta , jedno lub dwucyfrowa
mm | Minuta , dwucyfrowa
M | Numer miesiąca, jedno lub dwucyfrowy
MM | Numer miesiąca, dwucyfrowy
MMM | Skrócona nazwa miesiąca
MMMM | Pełna nazwa miesiąca
s | Sekunda , jedno lub dwucyfrowa
ss | Sekunda, dwucyfrowa
yy | Dwie ostatnie cyfry numeru roku
yyyy | Numer roku
znaki neutralne | Kopiowane wprost do teksu wynikowego
znaki wewnątrz apostrofów ‘ ’ | Kopiowane wprost do teksu wynikowego


4 Animacja wyglądu obiektów

W wielu aplikacjach występuje potrzeba przedstawienia na diagramach wrażenia ruchu wybranych elementów lub dynamicznej sygnalizacji niektórych stanów. Rozdział ten opisuje w jaki sposób zrealizować wspomnianą funkcjonalność.


4.1 Animowane obrazki

Najprostszą metodą animacji jest użycie animowanych obrazków w formacie GIF. Jedyne co należy wykonać, to użyć nazwę animowanego obrazka we właściwości Nazwa obrazu obiektu klasy Obraz.

Właściwości podstawowe
 | Główna zmienna | VA001
Właściwości stanowe, stan podstawowy
 | Nazwa obrazu | NoFire
Właściwości stanowe, stan numer 1
 | Warunek stanu | =Variable()&1
 | Nazwa obrazu | Fire

Jeżeli najmłodszy bit zmiennej głównej jest ustawiony, to aktywny staje się stan numer 1, w efekcie czego wyświetlony zostanie animowany obrazek Fire.


4.2 Animacja ruchu rurociągów, taśmociągów i linii

Niektóre klasy obiektów przygotowane są wstępnie do animacji ich ruchu. Parametryzacja ruchu polega na odpowiednim ustawieniu właściwości odpowiadających za wygląd obiektu oraz dynamicznej zmianie właściwości modyfikującej przesunięcie wyświetlanego kształtu. Z reguły do animacji wykorzystywana jest zmienna wewnętrzna Counter, która jest automatycznie inkrementowana ze stałym cyklem.


4.2.1 Rurociąg

Właściwości podstawowe
 | Główna zmienna | VA001
Właściwości stanowe, stan podstawowy
 | Kolor pasków | Blue
 | Offset wypełnienia | 0
Właściwości stanowe, stan numer 1
 | Warunek stanu | =Variable()&1
 | Offset wypełnienia | =Variable(Counter)
Właściwości stanowe, stan numer 2
 | Warunek stanu | =Variable()&2
 | Offset wypełnienia | =-Variable(Counter)*2
Właściwości stanowe, stan numer 3
 | Warunek stanu | =Variable()&4
 | Offset wypełnienia | =-Variable(Counter)
Właściwości stanowe, stan numer 4
 | Warunek stanu | =Variable()&8
 | Offset wypełnienia | =-Variable(Counter)*2

Ustawienie właściwości Kolor pasków powoduje, że rurociąg wyświetlany jest w postaci paskowanej. Zmiana właściwości Offset wypełnienia powoduje przesuwanie pasków, co pozwala na uzyskanie efektu przepływu w rurociągu. W zależności od ustawionego bitu zmiennej głównej, właściwość Offset wypełnienia jest zmieniana w różny sposób: mnożenie (lub ewentualne dzielenie) wartości zmiennej Counter steruje szybkością ruchu, zmiana znaku wyrażenia steruje kierunkiem ruchu.


4.2.2 Taśmociąg

Właściwości podstawowe
 | Główna zmienna | VA001
 | Styl rolki początkowej | Napęd
 | Styl rolki końcowej | Napęd
 | Taśmociąg zgrzebłowy | Tak
Właściwości stanowe, stan podstawowy
 | Przesunięcie taśmy | 0
 | Obrót napędu początkowego | 0
 | Obrót napędu końcowego | 0
Właściwości stanowe, stan numer 1
 | Warunek stanu | =Variable()&1
 | Przesunięcie taśmy | =Variable(Counter)
 | Obrót napędu początkowego | =Variable(Counter)
 | Obrót napędu końcowego | =Variable(Counter)

Ustawienia właściwości Styl rolki … i Taśmociąg zgrzebłowy powodują wyświetlenie taśmociągu w sposób pozwalający na animację obrotu rolek końcowych oraz ruchu taśmy. Jeżeli najmłodszy bit zmiennej głównej jest ustawiony, to aktywny staje się stan numer 1, w którym wykonywana jest animacja ruchu. Zmiana właściwości Przesunięcie taśmy powoduje przesuwanie taśmociągu. Zmiana właściwości Obrót napędu … pozwala na animację obrotu odpowiedniej rolki końcowej.


4.2.3 Linia

Właściwości podstawowe
 | Główna zmienna | Speed
 | Styl pasków | Kreska
Właściwości stanowe, stan podstawowy
 | Kolor pasków | Blue
 | Offset wypełnienia | =Variable()

Ustawienie właściwości Styl pasków i Kolor pasków powoduje wyświetlenie linii w postaci paskowanej. Offset wypełnienia pobierany jest z wartości zmiennej Speed. Szybkość przesuwu pasków jest bezpośrednio zależna od szybkości zmian zmiennej – program sterownika może płynnie sterować szybkością ruchu. Brak zmian zmiennej Speed powoduje zatrzymanie ruchu.


4.3 Migotanie poprzez zmianę właściwości obiektów

Najbardziej uniwersalną metodę animacji jest cykliczna zmiana wybranej właściwości obiektu. Metodę tę można stosować dla obiektu dowolnej klasy oraz wykorzystywać dowolną właściwość odpowiedzialną za wygląd obiektu. Najczęściej zmiana właściwości jest synchronizowana wartością funkcji IsBlinkOff. Funkcja ta zwraca cyklicznie wartości true i false. Standardowy okres zmian to 500ms, ale można go zmienić w ustawieniach aplikacji. Wykorzystanie funkcji IsBlinkOff zapewnia identyczne tempo migotania wszystkich obiektów.

Poniżej pokazano kilka wariantów realizacji funkcji migotania.

Wariant A

Właściwości podstawowe
 | Główna zmienna | VA001
Właściwości stanowe, stan podstawowy
 | Widoczny | TAK
Właściwości stanowe, stan numer 1
 | Warunek stanu | =Variable()==3
 | Widoczny | =IsBlinkOff()

Powyższy schemat można zastosować dla obiektu dowolnej klasy. Jeżeli zmienna główna ma wartość 3, to aktywny stan numer 1 powoduje, poprzez zmianę właściwości Widoczny, cykliczne pokazywanie i ukrywanie całego obiektu.

Wariant B

Właściwości podstawowe
 | Główna zmienna | VA001
Właściwości stanowe, stan podstawowy
 | Kolor | Blue
 | Tekst | #
Właściwości stanowe, stan numer 1
 | Warunek stanu | =IsAlarm("A_"+Attribute(Name))
 | Kolor | =IsBlinkOff()?Red:Green

W przykładzie B modyfikowany jest kolor wyświetlenia tekstu w obiekcie Tekst. W stanie normalnym wyświetlana jest wartość zmiennej głównej w kolorze niebieskim. Jeżeli aktywny jest alarm o identyfikatorze A_VA001 ( utworzonym na podstawie nazwy zmiennej głównej), to wartość zmiennej wyświetlana jest naprzemiennie w kolorach czerwonym i zielonym. Wyborem koloru steruje wyrażenie warunkowe wykorzystujące funkcję IsBlinkOff.

Wariant C

Właściwości podstawowe
 | Główna zmienna | VA001
Właściwości stanowe, stan podstawowy
 | Nazwa obrazu | wizard
 | Jasność | 0
Właściwości stanowe, stan numer 1
 | Warunek stanu | =Variable()==3 && IsBlinkOff()
 | Jasność | -0,5

W przykładzie C migotanie jest realizowane poprzez zmianę jasności wyświetlanego obrazka w obiekcie klasy Obraz. W tym przykładzie funkcja IsBlinkOff jest umieszona w wyrażeniu warunku stanu razem ze sprawdzeniem wartości zmiennej głównej. Jeżeli wartość zmiennej głównej jest równa 3, to w zależności od aktualnej wartości funkcji IsBlinkOff, jasność obrazka pobierana jest ze stanu podstawowego lub stanu numer 1.


4 Zasady otwierania i zamykania okien synoptycznych

5 Zasady otwierania i zamykania okien synoptycznych

Jednym z kluczowych elementów każdej aplikacji jest konstrukcja systemu nawigacji pomiędzy poszczególnymi diagramami aplikacji. Do otwierania i zamykania okien i diagramów służą akcje operatorskie OpenWindow, OpenDiagram i CloseWindow. Wybrane okna mogą być także otwierane automatycznie w trakcie uruchomienia aplikacji.

Akcje operatorskie mogą być podpięte do zdarzeń związanych z obsługą myszki, np. zdarzenia Włączenie przycisku obiektu klasy Przycisk lub zdarzeń Kliknięcie lewym przyciskiem itp. dla innych klas. Akcje przełączania okien i diagramów mogą być też użyte w definicjach menu aplikacji i klawiszy globalnych.


5.1.1 Otwarcie okna w trakcie startu aplikacji

Wybrane okna mogą zostać uruchomione w trakcie startu aplikacji. W tym celu należy:

  1. W panelu edycyjnym Ustawienia stanowisk w zakładce Okna startowe zaznaczyć okna, które mają zostać uruchomione w trakcie startu aplikacji. Ustawienie okien startowych jest specyficzne dla stanowiska. Wybór okien należy wykonać osobno dla każdego stanowiska lub ustawić jena poziomie obszaru.

  2. W ustawieniach wszystkich paneli wchodzących w skład okien startowych odpowiednio ustawić właściwość Domyślny diagram.

  3. Jeżeli domyślne diagramy posiadają parametry, to ich początkowe wartości należy podać jako wartości domyślne. Nie ma możliwości jawnego podania parametrów w przypadku okna uruchamianego na starcie.

W typowym przypadku na starcie aplikacji otwierane jest jedno okno startowe na każdym dostępnym monitorze.


5.2 Kontrola położenia i rozmiaru okien

4.2 Kontrola położenia i rozmiaru okien

Miejsce otwarcia nowych okien jest deklarowane bezpośrednio w akcjach OpenWindow i OpenDiagram. Pozycja może być deklarowana na cztery sposoby:

  1. Współrzędne podane bezpośrednio

  2. Współrzędne wynikające z definicji okna – stała $Default

  3. Współrzędne wynikające z aktualnej pozycji myszki – stała $CursorLocation

  4. Współrzędne wynikające z pozycji okna, z którego wykonano akcję otwarcia – stała $ActiveLocation

We wszystkich wariantach wywołania akcji otwarcia, jeżeli dojdzie do wykrycia sytuacji, że właściwe okno jest już otwarte, to nastąpi korekta pozycji istniejącego okna zgodnie z podanymi parametrami współrzędnych.

Przykład 1

OpenDiagram(machine,”mid=8”,stacyjka,$Normal, $ActiveLocation, $ActiveLocation,”FixedSize”, $Closable)

Akcja otwiera diagram machine w miejscu okna, z którego akcja została zainicjowana. Dodatkowo parametr $Closable spowoduje, że to okno zostanie zamknięte. Takie użycie akcji pozwala na uzyskanie efektu samowymieniających się okien – nawet po zmianie przez użytkownika pozycji pierwszego okna, drugie zostanie otwarte w jego miejscu. Podobny efekt można uzyskać stosując wymianę diagramu w panelu okna stale otwartego.

Tryby $CursorLocation i $ActiveLocation w sposób naturalny otwierają okno na ekranie aktualnie używanym. Tryb $Default używa monitora z góry określonego. W trybie współrzędnych podawanych bezpośrednio można dynamicznie wyliczać właściwą pozycję.

Przykład 2.

OpenWindow(okno1,info,machine,”mid=8”,false,XOnScreen(0,0),YOnScreen(100,0),$None)

Użycie funkcji XOnScreen i YOnScreen pozwala wyliczyć pozycję w zależności od wybranego monitora. Drugi parametr obu funkcji określa numer monitora (0 oznacza monitor kursora myszki). Pokazana akcja otworzy okno na monitorze kursora myszki, przy lewej krawędzi ekranu, od linii numer 100.

Rozmiar otwieranych okien wynika z rozmiaru predefiniowanego okna (OpenWindow) lub rozmiary diagramu (OpenDiagram). Można jednak zmienić rozmiar po operacji otwarcia okna przy pomocy akcji SetWindowSize.


5.3 Zamykanie okien i diagramów

Okna mogą być zamykane na kilka sposobów. Są to:

  1. Zamknięcie okna przez użytkownika standardowymi metodami systemowymi, typu przycisk zamknięcia na ramce okna.

  2. Automatyczne zamknięcie ze względu na otwarcie diagramu akcją OpenDiagram w trybie $Temp.

  3. Użycie trybu wymiany innego niż $None w akcjach OpenDiagram i OpenWindow.

  4. Użycie akcji CloseWindow.

Przykład 1.

OpenWindow(okno1,info,machine,”mid=8”,false,$CursorLocation,$CursorLocation,$Closable)

Akcja wykonuje otwarcie okna okno1, a następnie zamyka wszystkie okna bez blokady zamknięcia, które znajdują się na ekranie, na którym okno zostało otwarte (w tym przypadku ekran kursora myszki). Można użyć też stałej $ExceptCurrent. Działanie jest podobne, ale nie zostanie zamknięte okno, z którego akcję wykonano.

Okna zablokowne to te, które mają ustawioną właściwość Zezwolenie na zamykanie na Nie.

Przykład 2.

CloseWindow(null,false)

Akcja zamyka okno w kontekście którego została wykonana (okno bieżące).

Przykład 3.

CloseWindow(”ST*”,true,-1)

Akcja zamyka wszystkie okna o nazwie zaczynającej się od ST na wszystkich monitorach. Można też zamykać okna tylko na wskazanym monitorze lub monitorze kursora myszki (ostatni parametr równy 0).


5.4 Kontrola wzajemnego przesłaniania okien synoptycznych

Kolejnym istotnym elementem przy projektowaniu systemu okien jest kontrola ich wzajemnego przesłaniania. W typowym przypadku okno aktywne jest wyświetlane powyżej wszystkich innych okien aplikacji. W niektórych przypadkach może to być niekorzystne. Na przykład w przypadku konieczności wyświetlenia kilku okien typu stacyjka na tle dużego okna startowego standardowe zasady działania są niewystarczające.

Można jawnie kontrolować wzajemne przesłanianie przy pomocy właściwości okna Zawsze pod spodem i Zawsze na wierzchu. Można też stosować w akcji OpenDiagram atrybut TopMost. Okna „na wierzchu” wyświetlane są zawsze ponad normalnymi oknami, nawet wtedy, gdy nie są aktywne. Okna „pod spodem” zawsze są poniżej wszystkich innych okien.

Powyższe uwagi dotyczą także wszystkich innych okien uruchomionych na komputerze, niekoniecznie będących oknami aplikacji Asix.Evo. Z tego względu należy zachować dużą ostrożność w użyciu masek „na wierzchu”. Mogą one przesłonić inne ważne okna. Nie należy otwierać w tym trybie dużych okien. Bezpieczniejszym rozwiązaniem jest otwarcie okien startowych aplikacji w trybie „pod spodem” i nie używanie okien „na wierzchu”.


6 Organizacja operacji sterujących

Istotnym elementem prawie każdej aplikacji jest wprowadzenie mechanizmów służących wykonywaniu operacji sterujących pracą kontrolowanego obiektu. Niektóre obiekty posiadają wbudowane mechanizmy sterujące, np. Tekst, Przycisk, Słupek. W przypadku innych obiektów, można je rozszerzyć o funkcje sterowania korzystając z obsługi zdarzeń i funkcji SetVariable. Przykłady takich parametryzacji są opisane w innych rozdziałach dokumentacji.

W tym rozdziale zajmiemy się ogólnymi zasadami organizacji operacji sterujących w aplikacji.


6.1 Sterowania natychmiastowe

Najprostszym trybem wykonania operacji sterującej jest tzw. tryb natychmiastowy. Zaraz po wybraniu lub wprowadzeniu nowej nastawy, bez żadnego dodatkowego potwierdzenia, wysyłana jest do zmiennej sterowanej odpowiednio wartość.

Parametryzacja trybu natychmiastowego ogranicza się do określenia nazwy zmiennej sterowanej oraz wyboru trybu.

Właściwości podstawowe
 | Aktywny | Tak
 | Główna zmienna | Level
 | Zmienna sterowana | LevelSet
 | Sterowanie natychmiastowe | Tak

Właściwość Aktywny ustawiana na Tak włącza funkcje interaktywne obiektów, w szczególności funkcje sterujące. Właściwość Sterowanie natychmiastowe równa Nie, forsuje pracę w trybie natychmiastowym bez potwierdzania.

W pokazanym przykładzie nazwa zmiennej sterowanej podana jest bezpośrednio we właściwości Zmienna sterowana. Jest to parametryzacja poprawna, ale ze względu na ogólne zalecenie, żeby parametryzacja obiektu była sterowana wyłącznie przez nazwę zmiennej głównej i jej parametry, to zalecane są raczej poniższe konstrukcje.

Właściwości podstawowe
 | Aktywny | Tak
 | Główna zmienna | Level
 | Zmienna sterowana | #Set
 | Sterowanie natychmiastowe | Tak

Nazwa zmiennej sterowanej powstaje ze złożenia nazwy zmiennej głównej i sufiksu Set. W szczególności, użycie tylko znaku #, oznaczałoby, że nazwa zmiennej sterowanej jest taka sama jak nazwa zmiennej głównej.

Właściwości podstawowe
 | Aktywny | Tak
 | Główna zmienna | Level
 | Zmienna sterowana | @ControlVariable
 | Sterowanie natychmiastowe | Tak

Nazwa zmiennej sterowanej pobierane jest z atrybutu ControlSetVariable bazy zmiennych z wiersza opisującego definicję zmiennej Level. Atrybut ControlSetVariable nie należy do zestawu atrybutów standardowych – musi być dodany do bazy zmiennych na etapie jej tworzenia.


6.2 Sterowania opóźnione (z potwierdzeniem)

Tryb sterowania opóźnionego włączane jest poprzez ustawienie właściwości Sterowanie natychmiastowe na wartość Nie. Tryb stosowane jest wtedy, gdy chcemy uniknąć przypadkowego wysterowania lub wtedy, gdy chcemy wykonać w tym samym momencie całą grupę sterowań.

Parametryzacja opóźnionych sterowań składa się z dwóch elementów: sygnalizacji oczekiwania na wykonanie sterowania oraz zainicjowanie operacji wysłania danych.

Sygnalizacja stanu oczekiwania bazuje na użyciu funkcji HasWaitingControl. Obiekt oczekujący na sygnał wysłania powinien zmodyfikować swoje właściwości związane z wyglądem.

Właściwości stanowe, stan podstawowy
 | Tekst | Stan nierozpoznany
 | Kolor | =HasWaitingControl()?Red:Black

W tym przykładzie obiekt Tekst zmienia kolor w trybie oczekiwania. Wykorzystane jest tutaj wyrażenie warunkowe. Jest to najprostsza forma, ale ma zastosowanie wtedy, gdy obiekt nie posiada innych stanów zmieniających właściwość koloru. Jest też niewygodna gdyby chcieliśmy zmienić więcej niż jedną właściwość.

Właściwości stanowe, stan x
 | Warunek stanu | =HasWaitingControl()
 | Kolor | Cyan

Łatwiej jest użyć dodatkowego stanu z warunkiem HasWaitngControl. Stan ten należy ustawić jako ostatni stan obiektu (a przynajmniej po wszystkich stanach modyfikujących te same właściwości).

Wykonanie oczekujących operacji sterujących inicjowane jest przy pomocy akcji SendControls. W zależności od użytego parametru akcji, przycisk (lub inny obiekt) wykonujący akcję może powodować wysłanie sterowań ze wszystkich diagramów ($All), z bieżącego okna ($Window), z bieżącego diagramu ($Diagram) lub z obiektów o określonej nazwie.

Właściwości podstawowe
 | Aktywny | Tak
 | Typ kursora | Hand
 | Typ przycisku | Przycisk prostokątny 3d
 | Tryb przełącznika | Nie
Właściwości stanowe, stan podstawowy
 | Włączony | Nie
 | Kolor wyłączenia | =HasWaitingControl(”*”)?LightCoral:LightGray
 | Tekst wyłączenia | Wyślij
Zdarzenia
 | Wyłączenie przycisku | ^SendControls($Diagram)

Pokazany fragment parametryzacji obiektu Przycisk inicjuje wysłanie sterowań z diagramu, na którym został umieszczony. Dodatkowo sygnalizowany jest stan, czy są oczekujące sterowania. Wywołanie funkcji HasWaitingControl z parametrem wzorca nazwy obiektu pozwala na sprawdzenie czy istnieją obiektu o zgodnej nazwie oczekujące na wykonanie sterowania. Parametr * oznacza wszystkie obiekty niezależnie od nazwy. Mechanizm ten działa jednak tylko, dla obiektów znajdujących się na tym samym diagramie. Nie może być używany w przypadku globalnej inicjacji sterowań z innych diagramów.

Dostępny jest również mechanizm anulowania oczekujących sterowań. Do tego celu służy akcja CancelControls używana w podobny sposób jak akcja SendControls.


6.3 Sterowanie przy pomocy akcji operatorskiej SetVariable

W przypadku stosowania metod wysyłania nastaw nieopartych na wbudowanych mechanizmach obiektów konieczne jest użycie akcji operatorskiej SetVariable. Funkcja występuje w dwóch wariantach.

SetVariable(Alfa,1)

Ten wariant ustawia zmienną Alfa bezpośrednio na wartość 1.

SetVariable(Alfa,1,0xf)

Ten wariant ustawia wykonuje modyfikacje bitów zmiennej Alfa. Cztery najmłodsze bity są ustawiane na wartość 0001. Należy pamiętać o tym, że sterowania bitowe są mocno nieefektywne pod względem czasu wykonania i obciążenia łącza.

Chociaż bezpośrednie podanie nazwy zmiennej jest poprawne, to należy się starać o ile jest to możliwe stosować konwencję kontekstową.

SetVariable(””,1)

SetVariable(”#”,1)

SetVariable(”#Set”,1)

W kolejnych przykładach użyto: nazwy zmiennej sterowanej obiektu, nazwy zmiennej głównej obiektu, nazwy złożonej z nazwy zmiennej głównej i sufiksu Set. Warto zdefiniować zmienną główną także dla obiektów, które służą tylko do sterowania i użyć jej w akcji SetVariable.


6.4 Kontrola ważności sterowań

W przypadku sterowań z opóźnieniem istotne jest określenie jak długo wprowadzona nastawa jest ważna. Można dodać do aplikacji przycisk wykonujący akcję CancelControls. Pozwoli to operatorowi wycofać sterowanie bez zamykania diagramu. Istnieje też metoda automatyczna. W panelu Ustawienia stanowiska w zakładce Ustawienia można podać czas ważności sterowania w polu Limit czasu sterowania. W przypadku jego ustawienia wartości nastaw tracą ważność po upłynięciu podanego czasu.

Problem może też stanowić przypadek jest nastawa wybrana na diagramie typu stacyjka pozostaje ważna, ale sama stacyjka została przesłonięta innym oknem (czyli użytkownik nie widzi sygnalizacji sterowania). Rozwiązaniem jest użycie akcji SendControls z parametrem $AllVisible. Powoduje to, że sygnał wysłania dotyczy tylko obiektów na oknach, które nie są żaden sposób przesłonięte przez inne okno.


6.5 Kontrola uprawnień

W wielu aplikacjach bardzo istotna jest kontrola uprawnień aktualnie zalogowanego użytkownika do wykonywania operacji sterujących. W systemie zabezpieczeń istnieje uprawnienie Prawo wysyłania sterowań. Użytkownik musi pełnić rolę, w której wspomniane uprawnienie jest aktywne. Jeżeli tak nie będzie, to każde sterowanie przez niego wykonane zakończy się błędnie.

Z punktu widzenia bezpieczeństwa wystarczy odpowiednio sparametryzować system zabezpieczeń. Lepiej jest jednak zatroszczyć się kontrolę uprawnień zanim jeszcze dojdzie do próby wykonania sterowania. Obiekty posiadają dwie właściwości, które mogą być wykorzystane do tego celu: Aktywny i Widoczny. Obie właściwości są typu logicznego. Ustawiając właściwość Aktywny na false (NIE) blokuje wbudowane funkcje sterujące obiektów, a także reakcje na przyciśnięcie klawiszy myszki. Przy pomocy właściwości Widoczny można całkowicie ukryć niepożądane obiekty.

Właściwa procedura postepowania to zdefiniowanie roli, w której uprawnienie Prawo wysyłania sterowań jest aktywne, a następnie przyłączenie do niej wszystkich użytkowników, którzy mają mieć możliwość wykonywania sterowań. Potem wystarczy użyć wyrażenia wykorzystującego funkcję HasRole we właściwościach Aktywny lub Widoczny obiektów związanych z operacjami sterującymi.

Właściwości podstawowe
 | Aktywny | =HasRole(SuperOperator)
 | Główna zmienna | AlarmLimit
 | Zmienna sterowana | #
Właściwości stanowe, stan podstawowy
 | Tekst | #

Powyższy przykład pokazuje fragment parametryzacji obiekt Tekst. Jeżeli zalogowany użytkownik nie będzie pełnił roli SuperOperator, to obiekt będzie wyświetlał wartość nastawy, ale nie pozwoli na jej zmianę.

Ten sam mechanizm można także zastosować w trochę innym schemacie pracy. Załóżmy, że standardowy operator ma możliwość sterowania. Chcemy jednak, aby niektóre sterowania były dostępne tylko niektórym operatorom. W tym celu tworzymy dodatkową rolę (nie musi ona nawet mieć żadnych aktywnych uprawnień), przydzielamy ją właściwym użytkownikom i przy pomocy funkcji H asRole blokujemy newralgiczne obiekty.


6.5.1 Podwójne potwierdzanie operacji sterujących

Czasem potrzebny jest trochę inny tryb pracy, w którym operator prowadzi proces, ale wykonanie niektórych operacji wymaga dodatkowego potwierdzenia innej osoby. Nie chcemy jednak zmieniać zalogowanego użytkownika. W tym celu użyjemy akcję operatorską ConfirmRole.

Właściwości podstawowe
 | Aktywny | Tak
 | Typ kursora | Hand
 | Typ przycisku | Przycisk prostokątny 3d
 | Tryb przełącznika | Nie
Właściwości stanowe, stan podstawowy
 | Włączony | Nie
 | Tekst wyłączenia | Wyślij
Zdarzenia
 | Wyłączenie przycisku | ^Actions(ConfirmRole(Kierownik,$Always), SendControls($All))

Powyższy przykład to modyfikacja przycisku wysyłającego sygnał wykonania opóźnionych sterowań. Wykonywana akcja jest w tym przypadku złożeniem dwóch akcji ConfirmRole i SendControls. Użycie akcji ConfirmRole spowoduje otwarcia okna logowania. Po autoryzowaniu się użytkownika nastąpi sprawdzenie, czy pełni on rolę podaną w wywołaniu. Jeżeli tak, to kolejne akcje złożenia są wykonywane w kontekście nowego użytkownika. Po zakończeniu wszystkich akcji kontekst użytkownika zostanie odtworzony do stanu przed operacją. Błędna autoryzacja lub nie pełnienie wymaganej roli powoduje przerwanie wykonywania złożenia akcji. Zamiast akcji Actions można też stosować mechanizm akcji złożonych inicjowany wywołaniem ActionSet.

Taki sposób użycia akcji SendControls pozwala chronić obiekty z wbudowanymi mechanizmami sterującymi, np. Tekst, czy Słupek. Obiekty wykonujące sterowania (lub inne czynności) przy pomocy bezpośredniego wykonania akcji chroni się w podobny sposób.

Właściwości podstawowe
 | Aktywny | Tak
 | Tryb przełącznika | Nie
Właściwości stanowe, stan podstawowy
 | Włączony | Nie
 | Tekst wyłączenia | Włącz
 | Tekst włączenia |
Zdarzenia
 | Wyłączenie przycisku | ^Actions(ConfirmRole(Kierownik,$Always), SendControls($Diagram))

W tym przypadku obiekt przycisk w obsłudze zdarzenia Wyłączenie przycisku żąda weryfikacji roli użytkownika.

Akcja ConfirmRole ma też inne zastosowania. Możemy jej użyć jeżeli chcemy, żeby przez wykonaniem operacji zalogowany operator ponownie się autoryzował. Pozwoli to zabezpieczyć się przed sytuacją, że przy chwilowo nieobecnym operatorze, do komputera podeszła przypadkowa osoba.


7 Parametryzacja funkcji interaktywnych w obiektach pasywnych

Duża część z dostępnych klas obiektów nie posiada żadnych wbudowanych mechanizmów interakcji z użytkownikiem. Ich standardowa funkcjonalność ogranicza się do wyświetlania informacji. Jednak istnieje możliwość dodania własnych funkcji interaktywnych do obiektów każdego typu. Można też rozszerzyć funkcje interaktywne dla obiektów, które już takie funkcje posiadają (np. Przycisk).

Dodanie funkcji interaktywnych do obiektu opiera się głównie na obsłudze zdarzeń związanych z operacjami myszki (np. Kliknięcie prawym przyciskiem) i przyciśnięciami klawiszy. Uzupełnieniem jest zbiór funkcji zwracających stan myszki i klawiatury (np. IsMouseOver i IsShiftPressed), które użyte w definicjach właściwości obiektów, pozwalają uzależnić wygląd obiektów od działań operatora.


7.1 Nawigacja poprzez tekstowe łącza

Efekt, który chcemy uzyskać w tym przykładzie, to użycie na diagramach tekstowych łączy podobnych do łączy używanych w przeglądarce. Jako obiekt bazowy zostanie użyty obiekt klasy Tekst wyświetlający statyczny napis. Kliknięcie na napisie ma spowodować wykonanie akcji. Jednocześnie chcemy, żeby aktywność łącza była pokazywana wizualnie.

Właściwości podstawowe
 | Aktywny | Tak
 | Typ kursora | Hand
Właściwości stanowe, stan podstawowy
 | Tekst | Schemat wentylatora
Właściwości stanowe, stan numer 1
 | Warunek stanu | =IsMouseOver()
 | Kolor | Blue
 | Styl czcionki | Podkreślenie
Zdarzenia
 | Kliknięcie lewym przyciskiem | ^OpenWindow(null,Info,Wentylator,null)

Właściwość Aktywny ustawiona na Tak włącza pełną obsługę funkcji interaktywnych. Bez tego działałaby tylko obsługa zdarzenia kliknięcia przyciskiem myszki.

Właściwość Typ kursora określa postać kursora myszki w momencie najechania kursorem w obszar zajmowany przez obiekt.

Grupa stanowa kontrolowana wyrażeniem warunku =IsMouseOver() uaktywnia się w momencie najechania kursorem myszki w obszar obiektu. W efekcie tego kolor tekstu zmieniany jest na niebieski, a tekst wyświetlany jest z podkreśleniem.

Akcja OpenWindow w obsłudze zdarzenia Kliknięcie lewym przyciskiem powoduje otwarcie diagramu Wentylator w panelu Info bieżącego okna.


7.2 Podłączenie menu kontekstowego do obiektu

Chcemy uzyskać powszechnie używany mechanizm tak zwanego menu kontekstowego. Przyciśnięcie prawego przycisku myszki w momencie, gdy jej kursor znajduje się obszarze obiektu, ma spowodować wyświetlenie menu kontekstowego.

Jako obiekt bazowy może zostać użyty obiekt dowolnej klasy (za wyjątkiem obiektów kontrolkowych, np. Przeglądarka, które przejmują obsługę myszki). Rozpoczynamy od utworzenia i zdefiniowania menu kontekstowego. Użycie menu w obiekcie wymaga jedynie użycia akcji ShowMenu w obsłudze zdarzenia Wciśnięcie prawego przycisku.

Właściwości podstawowe
 | Zmienna główna | P1000
Zdarzenia
 | Wciśnięcie prawego przycisku | ^ShowMenu(MenuCtx,"v="+Attribute(Name))

Akcja ShowMenu otwiera menu o nazwie MenuCtx, przekazując mu jako parametr nazwę zmiennej głównej obiektu, w kontekście którego menu zostało otwarte.


7.3 Strefy aktywności diagramu

W kolejnym przykładzie chcemy stworzyć mechanizm polegający na tym, że kliknięcie w wybranym obszarze diagramu spowoduje wykonanie właściwej akcji operatorskiej. W aktywnym obszarze diagramu może znajdować się dowolny zestaw obiektów. Obszar aktywny ma zostać uwidoczniony dopiero w momencie najechania na niego kursorem myszki. Poniższa ilustracja pokazuje obszar aktywności na tle dużego obrazka.

Jako obiekt, na bazie którego utworzymy strefę aktywności użyjemy obiekt klasy Kształt.

Właściwości podstawowe
 | Aktywny | Tak
 | Typ kursora | Hand
 | Typ kształtu | Prostokąt
 | Promień zaokrąglenia | 15
Właściwości stanowe, stan podstawowy
 | Kolor | Transparent
Właściwości stanowe, stan numer 1
 | Warunek stanu | =IsMouseOver()
 | Kolor | Turquoise
 | Przezroczystość | 0,4
Zdarzenia
 | Kliknięcie lewym przyciskiem | ^OpenWindow(null,Info,Askom,null)

Właściwość Aktywny ustawiona na Tak włącza pełną obsługę funkcji interaktywnych. Bez tego działałaby tylko obsługa zdarzenia kliknięcia przyciskiem myszki.

Właściwość Typ kursora określa postać kursora myszki w momencie najechania kursorem w obszar zajmowany przez obiekt.

W grupie podstawowej właściwość Kolor ustawiona jest na Transparent. Powoduje to, że w normalnym stanie obiekt pozostaje niewidoczny. Grupa stanowa kontrolowana wyrażeniem warunku =IsMouseOver() uaktywnia się w momencie najechania kursorem myszki w obszar obiektu. W efekcie tego zmienia się kolor obiektu i kształt staje się widoczny. Jednocześnie ustawienie stopnia przezroczystości powoduje, że obiekty położone pod kształtem pozostają widoczne.

Akcja OpenWindow w obsłudze zdarzenia Kliknięcie lewym przyciskiem powoduje otwarcie diagramu Askom w panelu Info bieżącego okna w momencie kliknięcia przyciskiem myszki w obszarze obiektu.


7.4 Operacje samopowtarzalne

Większość zdarzeń związanych z obsługą myszki ma charakter jednorazowy. W zestawie zdarzeń jest jednak para zdarzeń Trzymanie lewego przycisku i Trzymanie prawego przycisku, które są wywoływane wielokrotnie, dopóki wciśnięty jest odpowiedni przycisk i kursor myszki jest w obszarze obiektu.

Wykorzystamy zdarzenie Trzymanie lewego przycisku do inkrementacji wartości zmiennej wykonywanej w trakcie wciśnięcia przycisku. Użyty zostanie obiekt klasy Obraz.

Właściwości podstawowe
 | Aktywny | Tak
 | Typ kursora | UpArrow
 | Zmienna główna | P1000
Właściwości stanowe, stan podstawowy
 | Obrazek | UpHand
Zdarzenia
 | Trzymanie lewego przycisku | ^SetVariable("#",Variable()+1)

Właściwość Aktywny ustawiona na Tak włącza pełną obsługę funkcji interaktywnych. Właściwość Typ kursora określa postać kursora myszki w momencie najechania kursorem w obszar zajmowany przez obiekt.

Akcja w obsłudze zdarzenia zmienia wartość zmiennej głównej (użyto skróconej nazwy #), poprzez zwiększenie jej poprzedniej wartości, odczytywanej funkcją Variable(), o jeden.

Okres zdarzenia przytrzymania deklarowany jest w ustawieniach stanowiska.

Alternatywą do pokazanej tutaj metody powtarzania akcji jest użycie obiektu klasy Przycisk, który ma mechanizm powtarzania wbudowany bezpośrednio w swoją logikę działania.


7.5 Obsługa klawiatury

Oprócz obsługi zdarzeń pochodzących od myszki można też reagować na zdarzenia przyciśnięcia klawiszy klawiatury. Przykład pokazuje obiekt klasy Obraz, który w reakcji na przyciśnięcie klawisza 'q' inkrementuje wartość zmiennej, a po przyciśnięciu klawisza 'w' ją dekrementuje.

Właściwości podstawowe
 | Aktywny |  | Tak
 | Zmienna główna |  | P1000
Właściwości stanowe, stan podstawowy
 | Obrazek |  | Arrows
Właściwości stanowe, stan numer 1
 | Warunek stanu | =IsSelected()
 | Barwa | 0,5
Zdarzenia
 | Wciśnięcie klawisza |  | ^Actions( Perform(LastKeyPressed()==Q,SetVariable("#",Variable()+1),Nothing()), Perform(LastKeyPressed()==W,SetVariable("#",Variable()-1),Nothing()) )

Właściwość Aktywny ustawiona na Tak włącza pełną obsługę funkcji interaktywnych. Pozwala na wyselekcjonowanie obiektu przez użytkownika.

Grupa stanowa kontrolowana wyrażeniem warunku =IsSelected() uaktywnia się, gdy obiekt zostanie wybrany przez użytkownika. W efekcie tego zmieniany jest wygląd obrazka przez modyfikację właściwości Barwa.

Akcja Actions w obsłudze zdarzenia jest złożeniem dwóch warunkowych akcji Perform. Z kolei każda z akcji Perform sprawdza, czy przyciśnięty został właściwy klawisz i jeżeli test wypadł pomyślnie, to inkrementuje lub dekrementuje wartość zmiennej głównej.

Alternatywnymi metodami obsługi klawiatury są tzw. klawisza globalne deklarowane dla całej aplikacji oraz skróty klawiszowe obiektów klasy Przycisk. Podstawową różnicą w działaniu skrótów obiektu Przycisk jest to, że te skróty działają także wtedy, gdy obiekt nie jest wyselekcjonowany.


8 Wykorzystanie efektu przezroczystości

Jednym z mechanizmów, które można wykorzystać przy tworzeniu aplikacji jest przezroczystość obiektów i okien. Pozwala ona uzyskać ciekawe efekty graficzne oraz efektywnie wykorzystać powierzchnię ekranu poprzez wyświetlanie kilku informacji jednej nad drugą.


8.1 Przezroczystość okien

Stopień przezroczystości okna jest deklarowany we właściwości Przezroczystość. Przyjmuje ona wartości od 0 do 1, gdzie wartość 0 oznacza okno całkowicie przezroczyste, a wartość 1 okno bez efektu przezroczystości. Ustawienie wartości mniejszej od 1 powoduje, że całe okno (ramka i wyświetlany diagram z obiektami) są przezroczyste. Nie ma znaczenia sposób zdefiniowania obiektów diagramu.


8.2 Przezroczystość obiektów

Każdy obiekt może mieć indywidualnie kontrolowany stopień przezroczystości. Jest on ustawiony we właściwości Przezroczystość, znajdującej się w grupie właściwości stanowych. Przyjmuje ona wartości od 0 do 1, gdzie wartość 0 oznacza obiekt całkowicie przezroczysty, a wartość 1 obiekt nieprzezroczysty. Efekt przezroczystości dotyczy wszystkich graficznych elementów obiektu.

Właściwości podstawowe
 | Zmienna główna | TranspValue
Właściwości stanowe, stan podstawowy
 | Przezroczystość | #

Stopień przezroczystość jest sterowany wartością zmiennej TranspValue. Połączone z mechanizmem ustawiania zmiennej (np. obiekt Słupek z włączonym suwakiem) pozwala na płynne sterowanie stopniem przezroczystości obiektu przez użytkownika.


8.3 Ukrywanie obiektów

Czasami zachodzi potrzeba całkowitego ukrycia obiektu. Można to wykonać na dwa sposoby.

Właściwości podstawowe
 | Zmienna główna | P1000
Właściwości stanowe, stan podstawowy
 | Widoczny | Nie
 | Tekst | Błąd pomiaru
Właściwości stanowe, stan numer 1
 | Warunek stanu | =VarIsNotGood()
 | Widoczny | Tak

W tym przykładzie obiekt Tekst pozostaje zazwyczaj niewidoczny. Dopiero w momencie, gdy kontrolowana zmienna ma niepoprawny status, zmieniana jest wartość atrybutu Widoczny i obiekt wyświetla ostrzeżenie o błędzie odczytu zmiennej.

Właściwości podstawowe
 | Zmienna główna | P1000
Właściwości stanowe, stan podstawowy
 | Tekst | Błąd pomiaru
 | Przezroczystość | 0
Właściwości stanowe, stan numer 1
 | Warunek stanu | =VarIsNotGood()
 | Przezroczystość | 1

Ten przykład wizualnie działa w sposób identyczny do poprzedniego. Do ukrywania obiektu wykorzystywana jest przezroczystość. Różnica polega na tym, że obiekt przezroczysty (nawet całkowicie) pozostaje na diagramie i może reagować na przyciśnięcie klawiszy myszki. Obiekt z ustawioną właściwością Widoczny takiej możliwości nie ma.


8.4 Wykorzystanie koloru Transparent

Kolejnym elementem wpływającym na widoczność obiektu jest użycie koloru Transparent. Wybór tego koloru we właściwości związanej z pewnym elementem składowym obiektu, z reguły powoduje, że ten element nie jest wyświetlany.

Właściwości stanowe, stan podstawowy
 | Widoczny | Tak
 | Kolor wskazówki | Red
 | Kolor tła | Transparent
 | Kolor otoczki | Transparent
 | Kolor podziałki | Transparent
 | Kolor czcionki | Transparent
 | Przezroczystość | 1

Pokazana powyżej parametryzacja obiektu Miernik powoduje, że wyświetlana jest tylko wskazówka miernika. Nakładając taki obiekt na inny, w pełni widoczny miernik, można uzyskać efekt miernika z dwoma wskazówkami.


9. Sterowanie zachowaniem obiektów

W tym rozdziale opiszemy metody zmiany wyglądu lub zachowania się obiektów w reakcji na interaktywne działania operatora. Metody tu opisane pozwalają na dostosowanie wyglądu diagramu w trakcie jego wyświetlania w trybie wykonania aplikacji.


9.1 Użycie zmiennych wirtualnych

Typowym mechanizmem, który możemy użyć to sterowanie wyglądem lub zachowaniem obiektów poprzez dodatkowe zmienne zdefiniowane w kanale wirtualnym (typu None). Obiekty kontrolowane uzależniają swój stan od takich zmiennych, a wartości zmiennych są sterowane za pośrednictwem innych obiektów. Cechą tej metody jest to, że wybrane przez użytkownika ustawienia są trwałe, po kolejnym zamknięciu i otwarciu diagramu pozostają niezmienione.

W metodzie zmiennych wirtualnych istotne jest też poprawne ustawienie wartości początkowych. Można tu zastosować akcję SetVariable wykonywaną w ramach zadania terminarza wykonywanego na starcie aplikacji lub w obsłudze zdarzenia Otwarcie diagramu.

Właściwości podstawowe
 | Główna zmienna | A1000
Właściwości stanowe, stan podstawowy
 | Widoczny | =Variable(ShowNames)
 | Tekst | @Name

Pokazy wyżej fragment obiektu tekst uzależnia swój stan widoczności od wartości zmiennej wirtualnej ShowNames. Jeżeli jest ona niezerowa, to wyświetla na diagramie nazwę zmiennej.

Właściwości podstawowe
 | Aktywny | Tak
 | Główna zmienna | ShowNames
 | Zmienna sterowana | #
 | Typ kursora | Hand
 | Typ przycisku | Standardowy przycisk Windows
 | Tryb przełącznika | Nie
 | Sterowanie natychmiastowe | Tak
Właściwości stanowe, stan podstawowy
 | Włączony | Nie
 | Wartość wyłączenia | 1
 | Tekst wyłączenia | Pokaż nazwy
Właściwości stanowe, stan 1
 | Warunek stanu | =Variable()==0
 | Wartość wyłączenia | 0
 | Tekst wyłączenia | Ukryj nazwy

Powyższy obiekt klasy Przycisk służy do przełączania wartości zmiennej ShowNames z 0 na 1 lub na odwrót, w efekcie włączając lub wyłączając pokazywanie na diagramie obiektów wyświetlających nazwy zmiennych.


9.2 Modyfikacja właściwości obiektów

Kolejną metoda sterowania obiektami w trakcie pracy jest zastosowanie akcji operatorskiej SetProperty. Akcja ta pozwala zmienić wartość dowolnej właściwości w dowolnym nazwanym obiekcie. Zmiana dotyczy jednak tylko wartości właściwości. Po kolejnym zamknięciu i otwarciu diagramu, wartości właściwości zostaną ponownie wyliczone na podstawie ich definicji zapisanych w pliku diagramu.

Właściwości podstawowe
 | Nazwa elementu | Chart
 | Wyświetlaj legendę | Nie

Powyższy fragment definicji obiektu klasy Wykres pokazuje obiekt o nazwie Chart, który w normalnym stanie nie wyświetla legendy.

Właściwości podstawowe
 | Aktywny | Tak
 | Typ kursora | Hand
 | Typ przycisku | Standardowy przycisk Windows
 | Tryb przełącznika | Nie
 | Sterowanie natychmiastowe | Tak
Właściwości stanowe, stan podstawowy
 | Włączony | Nie
 | Tekst wyłączenia | Pokaż legendę
Zdarzenia
 | Wyłączenie przycisku | ^SetProperty(Chart,ShowLegend,true)

Właściwości podstawowe
 | Aktywny | Tak
 | Typ kursora | Hand
 | Typ przycisku | Standardowy przycisk Windows
 | Tryb przełącznika | Nie
 | Sterowanie natychmiastowe | Tak
Właściwości stanowe, stan podstawowy
 | Włączony | Nie
 | Tekst wyłączenia | Ukryj legendę
Zdarzenia
 | Wyłączenie przycisku | ^SetProperty(Chart,ShowLegend,false)

Powyższa para obiektów Przycisk zmienia wartość właściwości ShowLegend wszystkich obiektów, których nazwa jest równa Chart. W efekcie przyciski sterują pokazywaniem legendy przez obiekty wykresów umieszczonych na diagramie.


10 Zastosowania obiektów klasy Przycisk

Jednym z częściej stosowanych obiektów w aplikacjach jest obiekt klasy Przycisk. Zakres jego użycia jest bardzo szeroki, od organizacji schematu przełączania okien aplikacji po różnorodne sterowania zmiennymi procesowymi.


10.1 Przycisk jednopozycyjny

Najprostszym i prawdopodobnie najczęstszym przypadkiem jest użycie w trybie jednopozycyjnym. Działa wtedy w sposób podobny do standardowych przycisków systemu Windows. Przycisk pozostaje w trybie wyciśniętym. W momencie wciśnięcia przycisku myszki zmienia stan na wciśnięty, a w momencie puszczenia powraca automatycznie do stanu wyciśniętego. W trakcie tego procesu wykonywana jest akcja realizująca funkcję przycisku.

Ten tryb pracy wykorzystywany jest do prostych jednorazowych operacji, np. przełączania okien lub bezwarunkowych operacji sterujących.


10.1.1 Przycisk jednopozycyjny wykonujący akcję operatorską

Właściwości podstawowe
 | Aktywny | Tak
 | Typ kursora | Hand
 | Typ przycisku | Przycisk prostokątny 3d
 | Płaski | =!IsMouseOver()
 | Tryb przełącznika | Nie
 | Skrót klawiszowy | Alt+Q
Właściwości stanowe, stan podstawowy
 | Włączony | Nie
 | Kolor włączenia | LightGreen
 | Tekst wyłączenia | Schemat
 | Tekst włączenia |
Zdarzenia
 | Wyłączenie przycisku | ^OpenWindow(null,Info,Schemat,null)

Właściwość Typ kursora powoduje, że kursor myszki zmienia się po najechaniu na obszar przycisku informując o gotowości do wykonania operacji. Właściwość Typ przycisku określa kształt przycisku. Jednocześnie wyrażenie użyte we właściwości Płaski powoduje, że dopóki kursor myszki nie najedzie na obiekt, to przycisk wyświetlany jest w postaci płaskiej. Dopiero po najechaniu obiekt wyświetli się w pełnej formie trójwymiarowej. Oczywiście można tego efektu nie stosować i ustawić wartość właściwości Płaski na Nie.

Ustawienie właściwości Tryb przełącznika na Nie powoduje, że przycisk pracuje w trybie jednopozycyjnym. Podanie skrótu klawiszowego powoduje, że oprócz użycia myszki, użytkownik może wykonać operację przy pomocy klawiatury.

Właściwość Włączony określa w jaki sposób wyświetlić przycisk. W przypadku trybu jednopozycyjnego powinna to być wartość Nie.

Większość właściwości stanowych określa atrybuty wyświetlania obiektu. Z reguły występują parami, dla stanu wciśnięcia i wyciśnięcia przycisku. W pokazanym przykładzie Tekst wyłączenia określa opis przycisku. Brak podanego tekstu dla właściwości Tekst włączenia powoduje, że niezależnie od stanu przycisku będzie wyświetlany zawsze tekst wyłączenia.

Użycie właściwości Kolor włączenia powoduje, że w momencie chwilowego wciśnięcia przycisku, kolor jego tła zmieni się sygnalizując dodatkowo wykonanie operacji. Ustawienie koloru i jakichkolwiek innych atrybutów włączenia nie jest oczywiście konieczne.

Akcja operatorska podana w obsłudze zdarzenia Wyłączenie przycisku wymienia diagram w panelu Info bieżącego okna. W przypadku obiektów Przycisk należy korzystać ze zdarzeń dedykowanych dla tej klasy obiektów, czyli Włączenie przycisku i Wyłączeniu przycisku. Chociaż w niektórych przypadkach podobne działanie można uzyskać stosując uniwersalne zdarzenia obsługi myszki (Kliknięcie lewym przyciskiem itp.), to lepiej stosować zdarzenia dedykowane, które uwzględniają stan przycisku.


10.1.2 Przycisk jednopozycyjny wykonujący operację sterującą

W przypadku konieczności wykonania operacji związanych z wysłaniem wartości sterujących do zmiennych procesowych można stosować parametryzację opartą o wykonanie akcji operatorskiej SetVariable. Z reguły łatwiej jest jednak wykorzystać funkcjonalność wbudowaną w obiekt przycisk, przeznaczoną do wykonywania bezpośrednich sterowań.

Właściwości podstawowe
 | Aktywny | Tak
 | Zmienna sterowana | Command
 | Typ kursora | Hand
 | Typ przycisku | Przycisk prostokątny 3d
 | Tryb przełącznika | Nie
Właściwości stanowe, stan podstawowy
 | Włączony | Nie
 | Wartość wyłączenia | 0x8
 | Tekst wyłączenia | Włącz
 | Tekst włączenia |

Zdefiniowanie właściwości Wartość wyłączenia powoduje, że w trakcie cyklu włączenie/wyłączenie przycisku, do zmiennej sterowanej Command zostanie wysłana podana szesnastkowo wartość 0x8 (16).

Właściwości podstawowe
 | Aktywny | Tak
 | Główna zmienna | Level
 | Zmienna sterowana | #
 | Typ kursora | Hand
 | Typ przycisku | Przycisk prostokątny 3d
 | Tryb przełącznika | Nie
Właściwości stanowe, stan podstawowy
 | Włączony | Nie
 | Wartość wyłączenia | =Variable()+1
 | Tekst wyłączenia | Podwyższ
 | Tekst włączenia |

W kolejnym przykładzie wartość wyłączenia jest tworzona dynamicznie. Jest ona równa aktualnej wartości zmiennej głównej powiększonej o 1. Wciśnięcie i puszczenie przycisku spowoduje zwiększenie wartości zmiennej głównej o 1. Nazwa zmiennej sterowanej zdefiniowana jest przez # - oznacza to użycie nazwy zmiennej głównej.


10.2 Przycisk jednopozycyjny z powtarzaniem

Obiekt Przycisk pozwala też na pracę w trybie automatycznego powtarzania operacji sterującej lub akcji operatorskiej.

Właściwości podstawowe
 | Aktywny | Tak
 | Główna zmienna | Level
 | Zmienna sterowana | #
 | Typ kursora | Hand
 | Typ przycisku | Przycisk prostokątny 3d
 | Tryb przełącznika | Nie
 | Z powtarzaniem | Tak
Właściwości stanowe, stan podstawowy
 | Włączony | Nie
 | Wartość włączenia | =Variable()+1
 | Wartość końca powtarzania | 0
 | Tekst wyłączenia | Podwyższ
 | Tekst włączenia |

Tryb powtarzania został włączony poprzez ustawienie właściwości Z powtarzaniem. W trakcie przytrzymania wciśniętego przycisku wartość zdefiniowana w Wartość włączenia zostanie wielokrotnie wysłana do zmiennej sterowanej (tożsamej ze zmienną główną). W efekcie wartość zmiennej będzie inkrementowana w sposób ciągły. W momencie puszczenia przycisku zostanie wysłana wartość zdefiniowana we właściwości Wartość końca powtarzania. Podobny schemat dotyczy działań opartych na obsłudze zdarzeń. Cyklicznie wykonywane jest zdarzenie Włączenie przycisku, a sekwencja kończona jest zdarzeniem Koniec powtarzania.

Okres powtarzania sterowania lub akcji jest zdefiniowany w panelu parametrów stanowisk w zakładce Ustawienia.


10.3 Przycisk jednopozycyjny z blokadą

W przypadku ważnych sterowań istotne może być zapobieżenie przypadkowemu przyciśnięciu przycisku. Jeżeli nie chcemy korzystać z opisanego dalej mechanizmu opóźnionych sterowań, to można połączyć przyciśnięcie przycisku z wymaganiem jednoczesnego przyciśnięcia klawisza klawiatury.

Właściwości podstawowe
 | Aktywny | =IsAltPressed()
 | Główna zmienna | Level
 | Zmienna sterowana | #
 | Typ kursora | Hand
 | Typ przycisku | Przycisk prostokątny 3d
 | Tryb przełącznika | Nie
Właściwości stanowe, stan podstawowy
 | Włączony | Nie
 | Wartość wyłączenia | =Variable()+1
 | Kolor wyłączenia | =IsAltPressed()?LightGreen:LightGray
 | Tekst wyłączenia | Podwyższ
 | Tekst włączenia |

Jest to modyfikacja wcześniejszego przykładu zwykłego przycisku jednopozycyjnego inkrementującego wartość zmiennej. Właściwość Aktywny jest równa true (TAK) tylko wtedy, gdy użytkownik przyciska klawisz Alt. I tylko wtedy obiekt pozwala na wciśnięcie przycisku. Dodatkowo Kolor wyłączenia jest także modyfikowany w zależności do stanu klawisza Alt w celu sygnalizacji aktywności przycisku.


10.4 Przycisk dwupozycyjny

W kolejnym przykładzie zbudujemy przycisk dwupozycyjny, w którym o stanie wciśnięcia będzie decydowała wartość zmiennej procesowej. W momencie kliknięcia przycisk zmieni stan na przeciwny, jednocześnie wykonując odpowiednią operację sterującą.

Właściwości podstawowe
 | Aktywny | Tak
 | Główna zmienna | Flag1
 | Zmienna sterowana | #
 | Typ kursora | Hand
 | Typ przycisku | Przycisk prostokątny 3d
 | Tryb przełącznika | Tak
 | Sterowanie natychmiastowe | Tak
Właściwości stanowe, stan podstawowy
 | Włączony | =Variable()
 | Wartość wyłączenia | 0
 | Wartość włączenia | 1
 | Tekst wyłączenia | Off
 | Tekst włączenia | On

Cała funkcjonalność zdefiniowana jest w pojedynczym stanie. Ustawienie właściwości Tryb przełącznika na Tak powoduje, że przycisk wykonuje ruch tylko w jedną stronę i wykonuje pojedyncze sterowanie.

Jeżeli zmienna Flag1 jest równa 0, to przycisk jest wyciśnięty i wyświetlany jest opis Off. Po wciśnięciu klawisza myszki, przycisk zostaje wciśnięty, a opis zmieniony na On. W chwili puszczenia klawisza myszki Wartość włączenia jest wysyłana do zmiennej Flag1. W efekcie przycisk pozostanie w stanie wciśnięcia (włączenia), ponieważ wartość zmiennej głównej Flag1 zmieni się na niezerową. Po wykonaniu operacji może nastąpić chwilowy powrót przycisku do stanu pierwotnego Off, do momentu kiedy nowa wartość zmiennej głównej zostanie zwrotnie odczytana.


10.5 Przycisk dwupozycyjny z opóźnionym sterowaniem

Częstym przypadkiem jest konieczność użycia przycisku dwupozycyjnego, w którym operacja sterująca nie jest wykonywana od razu, lecz wymaga osobnego potwierdzenia. Schemat działania jest bardzo podobny do zwykłego przycisku dwupozycyjnego.

Właściwości podstawowe
 | Aktywny | Tak
 | Główna zmienna | Flag1
 | Zmienna sterowana | #Control
 | Typ kursora | Hand
 | Typ przycisku | Przycisk prostokątny 3d
 | Tryb przełącznika | Tak
 | Sterowanie natychmiastowe | Nie
Właściwości stanowe, stan podstawowy
 | Włączony | =Variable()
 | Wartość wyłączenia | 1
 | Wartość włączenia | 2
 | Kolor włączenia | =HasWaitingControl()?LightGreen:LightGray
 | Kolor wyłączenia | =HasWaitingControl()?LightCoral:LightGray
 | Tekst wyłączenia | Off
 | Tekst włączenia | On

Sterowanie natychmiastowe ustawione na Nie powoduje, że kliknięcie na przycisku powoduje tylko zmianę jego stanu na przeciwny. Przycisk jest w tym stanie do momentu zatwierdzenia sterowania akcją SendControls lub jego anulowania akcją CancelControls. Istotne jest, aby wizualnie pokazać, że obiekt oczekuje na zatwierdzenie operacji. W przykładzie zmieniany jest kolor przycisku. Wyrażenie warunkowe wykorzystuje funkcję HasWatingControl, która przyjmuje wartość true, gdy obiekt jest w stanie oczekiwania.

W przykładzie pokazano też, że sterowanie (komenda) jest wysyłane do innej zmiennej niż zmienna główna decydująca o stanie przycisku. Nazwa zmiennej sterowanej tworzona jest notacją sufiksową i w tym przykładzie jest to Flag1Control.

Podobnie jak w poprzednim przykładzie, po wykonaniu operacji może dojść do chwilowego powrotu przycisku do stanu początkowego, na czas potrzebny do wykonania sterowania, wykonania komendy przez sterownik i zwrotnego odczytu zmiennej głównej.


10.6 Wyłącznik

W tym przykładzie pokazana zostanie konfiguracja obiektu Przycisk w sposób, w którym jego działanie jest zgodne z działaniem obiektu Wyłącznik systemu Asix w wersji klasycznej. Przycisk pozostaje w stanie wyciśniętym, a jego opis określa aktualny tryb pracy urządzenia (zatrzymane/uruchomione). W momencie wykonania sterowania przycisk pozostaje wciśnięty do momentu zatwierdzenia operacji. Jednocześnie opis przycisku zmienia się i pokazuje jaka operacja zostanie wykonana (uruchom/zatrzymaj).

Właściwości podstawowe
 | Aktywny | Tak
 | Główna zmienna | MStatus
 | Zmienna sterowana | #Control
 | Typ kursora | Hand
 | Typ przycisku | Przycisk prostokątny 3d
 | Tryb przełącznika | Nie
 | Sterowanie natychmiastowe | Nie
Właściwości stanowe, stan podstawowy
 | Włączony | =HasWaitingControl()
 | Wartość wyłączenia | 1
 | Kolor włączenia | LightGreen
 | Tekst wyłączenia | Uruchomiony
 | Tekst włączenia | Zatrzymaj
Właściwości stanowe, stan 1
 | Warunek stanu | =Variable()&1
 | Wartość wyłączenia | 2
 | Tekst wyłączenia | Zatrzymany
 | Tekst włączenia | Uruchom

Obiekt używa dwóch zmiennych. Zmienna główna służy do określenia stanu urządzenia. W zależności od jej wartości zmieniają się opisy przycisku i wartość komendy sterującej. Wykorzystany został mechanizm stanów obiektu. Zmienna sterująca o nazwie powstałej z połączenia nazwy zmiennej głównej i sufiksu Control służy do wysyłania komend sterujących (2 oznacza komendę uruchomienia, a 1 zatrzymania urządzenia).

W powyższym schemacie działania istotne jest użycie wyrażenia HasWaitingControl we właściwości Włączony. W momencie wciśnięcia przycisku obiekt wchodzi w stan posiadania ważnej wartości sterującej. Pozostanie w tym stanie aż do momentu wykonania sterowania (akcją SendControls) lub jego anulowania. W tym czasie wartość wyrażenia jest równa true i powoduje utrzymanie przycisku w stanie wciśniętym. Stan ważnej wartości jest dodatkowo sygnalizowany przez kolor podany we właściwości Kolor włączenia.


10.7 Sterowania bitowe

Czasami wykonywane sterowania mogą zmienić tylko pojedyncze bity kontrolowanej zmiennej. W tego typu przypadkach należy użyć obiektów przycisk w trybie sterowania bitowego. Poniższy przykład użycia pokazuje zmodyfikowany przypadek przycisku dwupozycyjnego.

Właściwości podstawowe
 | Aktywny | Tak
 | Główna zmienna | Status
 | Sterowanie bitowe | Tak
 | Zmienna sterowana | #
 | Typ kursora | Hand
 | Typ przycisku | Przycisk prostokątny 3d
 | Tryb przełącznika | Tak
 | Sterowanie natychmiastowe | Tak
Właściwości stanowe, stan podstawowy
 | Włączony | =Variable()&1
 | Wartość wyłączenia | 1
 | Wartość włączenia | 1
 | Tekst wyłączenia | Off
 | Tekst włączenia | On

Ustawienie właściwości Sterowanie bitowe na wartość Tak powoduje zmianę sposobu wykonywania operacji wysłania wartości do zmiennej sterowanej. Operacja wykonywana jest w dwóch krokach. Najpierw aktywnie odczytywana jest bieżąca wartość zmiennej sterowanej, następnie wyliczana i wysyłana jest nowa wartość zmiennej. Należy pamiętać o tym, że taki sposób pracy jest zdecydowanie mniej efektywny (pod względem komunikacji ze sterownikiem) niż zwykłe sterownia.

Stan przycisku jest kontrolowany wartością pierwszego bitu zmiennej głównej. Wyrażenie Variable()&1 wykonuje operację iloczynu logicznego wartości zmiennej i liczby 1. W efekcie, przycisk jest wciśnięty gdy pierwszy bit jest ustawiony. Przy przejściu ze stanu wyłączenia(wyciśnięty) do włączonego, ustawiane są w zmiennej sterowane te bity, których wartość we właściwości Wartość włączenia jest równa 1 (w tym przypadku tylko najmłodszy bit). . Przy przejściu ze stanu włączenia(wciśnięty) do wyłączonego, zerowane są w zmiennej sterowane te bity, których wartość we właściwości Wartość wyłączenia jest równa 1 (w tym przypadku najmłodszy bit zmiennej zostanie ustawiony na 0).

W bardziej skomplikowanych przypadkach sterowań bitowych należy użyć akcji operatorskiej SetVariable w obsłudze zdarzeń Włączenie przycisku i Wyłączenie przycisku. Na przykład akcja SetVariable(””, 3, 0xf) spowoduje zmianę czterech najmłodszych bitów zmiennej sterowanej. Dwa najmłodsze bity zostaną ustawione na 1, a pozostałe na 0.


10.8 Grupowanie przycisków

Czasami konieczne jest użycie grupy przycisków służących do wykonywania wzajemnie sprzecznych operacji. Na poniższej ilustracji pokazane są przyciski, które włączają ruch urządzenia do przodu lub do tyłu.

Przyciski te powinny działać z potwierdzeniem. W wyniku tego użytkownik może wprowadzić oba przyciski w stan ważnej wartości sterującej. Wykonanie akcji SendControls spowodowałoby wykonanie dwóch operacji sterujących – końcowy efekt zależałby od kolejności definiowania obiektów.

Można jednak spowodować, żeby była możliwość wciśnięcia tylko jednego przycisku jednocześnie. Służą do tego grupy sterowań.

Przycisk 1

Właściwości podstawowe
 | Aktywny | Tak
 | Główna zmienna | Move
 | Zmienna sterowana | #
 | Typ kursora | Hand
 | Typ przycisku | Przycisk prostokątny 3d
 | Tryb przełącznika | Nie
 | Sterowanie natychmiastowe | Nie
 | Grupa sterowania | G1
Właściwości stanowe, stan podstawowy
 | Włączony | =HasWaitingControl()
 | Wartość włączenia | 1
 | Kolor włączenia | LightGreen
 | Tekst wyłączenia | <<<

Przycisk 2

Właściwości podstawowe
 | Aktywny | Tak
 | Główna zmienna | Move
 | Zmienna sterowana | #
 | Typ kursora | Hand
 | Typ przycisku | Przycisk prostokątny 3d
 | Tryb przełącznika | Nie
 | Sterowanie natychmiastowe | Nie
 | Grupa sterowania | G1
Właściwości stanowe, stan podstawowy
 | Włączony | =HasWaitingControl()
 | Wartość włączenia | 2
 | Kolor włączenia | LightGreen
 | Tekst wyłączenia | =”>>>”

W pokazanej parametryzacji istotna jest definicja właściwości Grupa sterowań. Nie mają znaczenia wartości właściwości, istotne jest tylko to, żeby były one identyczne dla obu przycisków. W danej chwili w stanie wciśnięcia (czyli ważnej wartości sterującej sprawdzanej funkcją HasWaitingControl) pozostanie tylko jeden z dwóch przycisków.


11 Operacje sterujące w obiektach klasy Tekst

Obiekty klasy Tekst oferują dwie metody wykonywania nastaw. W pierwszym trybie, stosowanym głównie w obiektach pokazujących wartości liczbowe zmiennych, użytkownik wprowadza bezpośrednio nową wartość zmiennej. W drugim trybie, stosowanym w obiektach opisujących tekstowo stany bitowe, sterowanie polega na wybraniu nowej nastawy z listy proponowanych wartości.


11.1 Sterowanie wartością liczbową wprowadzaną przez użytkownika

W tym trybie działania istotne jest, aby w wyraźny sposób rozróżnić poszczególne stany obiektu: stan pokazywania aktualnej wartości, stan wprowadzania nowej wartości i stan oczekiwania na wykonanie sterowania.

Właściwości podstawowe
 | Aktywny | Tak
 | Główna zmienna | Level
 | Zmienna sterowana | #
 | Wartość minimalna sterowania | @SteeringRangeFrom
 | Wartość maksymalna sterowania | @SteeringRangeTo
 | Tryb selekcji stanów | Nie
 | Edycja przy selekcji | Nie
 | Początkowa wartość edycji | Pusta
 | Sterowanie natychmiastowe | Nie
Właściwości stanowe, stan podstawowy
 | Tekst | #
 | Kolor | Black
 | Kolor edycji | Blue
Właściwości stanowe, stan 1
 | Warunek stanu | =VarIsNotGood()
 | Tekst | =Variable() + ”?”
 | Kolor | Crimson
Właściwości stanowe, stan 2
 | Warunek stanu | =HasWaitingControl()
 | Kolor | Cyan
 | Styl czcionki | Kursywa

Właściwość Aktywny ustawiona na Tak włącza funkcje sterujące obiektu. Nazwa zmiennej sterowanej i głównej są identyczne. Określone są też limity wartości sterującej – limity pobierane są z odpowiednich atrybutów zmiennej głównej obiektu. Właściwość Tryb selekcji równa Nie oznacza, że nowa wartość będzie wprowadzana bezpośrednio przez użytkownika. Właściwość Edycja przy selekcji określa sposób rozpoczęcia edycji wartości nastawy. W przypadku Nie, po wybraniu obiektu trzeba przycisnąć klawisz E nter lub podwójnie kliknąć myszką. Dla wartości Tak edycja rozpocznie się natychmiast po wybraniu obiektu. Właściwość Początkowa wartość edycji określa tekst wyświetlany w obiekcie po rozpoczęciu edycji. Może to być tekst pusty, tekst ostatnio wprowadzony lub bieżący tekst wyświetlany.

Właściwość Sterowanie natychmiastowe ustawione na Nie oznacza, że po zakończeniu edycji (przyciskiem E nter), nowa wartość nastawy zostanie wysłana dopiero w momencie wykonania akcji sterującej SendControls. Wartość Tak oznaczałaby wysłanie natychmiast po zakończeniu edycji.

Właściwości stanu podstawowego określają kolor używany do wyświetlania wartości zmiennej w stanie normalnym oraz kolor używany w trakcie edycji nowej nastawy przez użytkownika.

Grupa właściwości numer 1 opisuje sposób wyświetlania tekstu, gdy status wartości zmiennej głównej jest niepoprawny. Zmieniony jest kolor tekstu oraz dodawany znak '?' po wartości zmiennej. Stan ten nie jest tutaj niezbędny, służy tylko do ilustracji parametryzacji sterowania w obiekcie wielostanowym.

Stan numer 2 określa sposób wyświetlenia nowej nastawy po tym jak użytkownik zakończył edycję, a zlecenie wykonania operacji (akcja SendControls) nie zostało jeszcze wykonane. Zmieniany jest kolor i styl czcionki. Stan kontrolujący oczekiwanie na wysłanie wartości z reguły umieszczany jest na końcu listy stanów, w ten sposób jego ustawienia mają pierwszeństwo. Odwrócenie kolejności w naszym przykładzie powodowałoby, że pomimo oczekiwania na sterowanie mógłby być użyty kolor tekstu zdefiniowany w grupie kontrolującej status zmiennej.


11.2 Sterowania z listy wyboru

Alternatywną metodą wykonywania sterowań poprzez obiekt Tekst jest użycie trybu selekcji stanów. Tryb ten stosowany jest z reguły w obiektach, które wyświetlają tekstowe opisy stanów. Sterowanie polega na wyborze właściwej pozycji z wyświetlanej listy możliwych operacji.

Zawartość listy sterowania wynika z definicji stanów obiektu.

Właściwości podstawowe
 | Aktywny | Tak
 | Główna zmienna | LineState
 | Zmienna sterowana | #Control
 | Typ kursora | Hand
 | Tryb selekcji stanów | Tak
 | Selekcja stanów przez menu | Tak
 | Sterowanie natychmiastowe | Tak
Właściwości stanowe, stan podstawowy
 | Tekst | Stan nierozpoznany
 | Kolor | Black
 | Stan wybieralny | Nie
Właściwości stanowe, stan 1
 | Warunek stanu | #.0
 | Tekst | Tryb ręczny
 | Wartość stanu | 8
 | Maska bitowa stanu | 8
 | Stan wybieralny | #.0r
Właściwości stanowe, stan 2
 | Warunek stanu | #.1
 | Tekst | Tryb awaryjny
 | Wartość stanu | 4
 | Maska bitowa stanu |
 | Stan wybieralny | #.1r
Właściwości stanowe, stan 3
 | Warunek stanu | #.3
 | Tekst | Tryb automatyczny
 | Wartość stanu | 0
 | Maska bitowa stanu | 8
 | Stan wybieralny | #.3r

Właściwość Aktywny ustawiona na Tak włącza funkcje sterujące obiektu. Nazwa zmiennej sterowanej jest tworzona na podstawie nazwy zmiennej głównej przez dodanie sufiksu Control. Właściwość Tryb selekcji stanów wybiera pracę w trybie selekcji, a Selekcja stanów przez menu określa, że wybór nowego stanu odbędzie się z automatycznie utworzonego menu kontekstowego. Wartość Nie oznaczałaby sekwencyjny wybór kolejnych stanów po każdym kliknięciu na obiekcie.

Właściwość Sterowanie natychmiastowe ustawione na Tak powoduje, że wykonanie sterowania nastąpi natychmiast po wyborze stanu. Możliwe jest oczywiście sterowanie opóźnione. W takim przypadku należałoby dodać sygnalizację stanu oczekiwania, np. przez użycie wyrażenia HasWaitingControl()?Red:Black w definicji właściwości Kolor lub dodanie kolejnego stanu.

Stan podstawowy obiektu definiuje wygląd obiektu w przypadku nieprawidłowej wartości zmiennej monitorowanej. Kolejne trzy stany służą do dekodowania wartości zmiennej na opis tekstowy, warunkiem stanu jest test ustawienia wybranego bitu. Właściwość Stan wybieralny określa, czy opis stanu ma pojawić się na liście wyboru operacji sterującej. Użyte wyrażenia powodują, że opis pojawi się na liście wtedy, gdy nie jest stanem aktualnym (wyrażenia są negacją warunków stanu). W przykładzie użyto notacji prefiksowej # z podaniem numeru. Notacja ta pozwala odwołać się do stanu wybranego bitu zmiennej głównej. Dodanie r po numerze bitu oznacza odwrotną logikę – wartość zerowa bitu daje wynik true. Zapis #.0 jest równoważny wyrażeniu Variable()&1, a zapis #.0r to odpowiednik !(Variable()&1).

Możliwe jest też definiowanie stanów obiektu służących wyłącznie do sterowania. W tym celu warunek stanu należy ustawić na Nie, a Stan wybieralny na Tak.

Właściwości Wartość stanu i Maska bitowa stanu określają sposób wykonania sterowania. Niezdefiniowanie maski oznacza sterowanie bezpośrednią wartością stanu. Zdefiniowana maska oznacza sterowanie bitowe. W pokazanym przykładzie stan numer 1 to zmiana czwartego bitu zmiennej sterowanej na 1, stan numer 2 to wysłanie wartości 4, a stan numer 3 to zmiana czwartego bitu na wartość 0.

Wygląd listy stanów (kolory i czcionka) jest parametryzowany w panelu Ustawienia stanowisk w zakładce Ustawienia w ramce Ustawienia menu stanów.

Podobnie wyglądającą funkcjonalność można uzyskać poprzez podłączenie do obiektu menu kontekstowego.

Zobacz też: 7.2. Podłączenie menu kontekstowego do obiektu


12 Użycie suwaków w obiektach klasy Słupek

Podstawowym zadaniem obiektów klasy Słupek jest prezentacja wartości zmiennych procesowych w postaci słupków (poziomych lub pionowych). Można je też stosować jako obiekty statyczne do wyświetlenia na diagramie skali numerycznej.

W tym rozdziale zajmiemy się zasadami użycia suwaków wbudowanych w obiekty klasy Słupek.


12.1 Użycie suwaka do sterowania wartościami nastaw

W tym zastosowaniu słupek służy do pokazania aktualnej wartości nastawy, a jednocześnie pozwala na jej zmianę przy pomocy suwaka.

Właściwości podstawowe
 | Aktywny | Tak
 | Główna zmienna | SliderSet
 | Zmienna sterowana | #
 | Wartość minimalna sterowania | @SteeringRangeFrom
 | Wartość maksymalna sterowania | @SteeringRangeTo
 | Styl wskaźnika | =IsMouseOver()?Holder:None
 | Użyj limitów | Nie
 | Wartość słupka | #
 | Wartość wskaźnika | #
 | Wartość minimalna | @SteeringRangeFrom
 | Wartość maksymalna | @SteeringRangeTo
 | Sterowanie natychmiastowe | Tak
Właściwości stanowe, stan podstawowy
 | Kolor wskaźnika | Transparent

Ponieważ wielkość słupka i położenia suwaka (wskaźnika) zależą od tej samej zmiennej, to zmienna sterowana została określona notacją skrótową #. Zakres zmienności suwaka zależy od zakresu podanego w parze właściwości Wartość minimalna sterowania i Wartość maksymalna sterowania. Zakres słupka zależy od pary właściwości Wartość minimalna i Wartość maksymalna. Ponieważ w naszym zastosowaniu słupek i suwak pokazują identyczną wartość, to oba zakresy zostały identycznie ustawione i bazują na ustawieniach zakresu sterowania zmiennej SliderSet, podanego w bazie definicji zmiennych. Bieżąca wartość słupka jest określona przez właściwość Wartość słupka – użycie notacji # oznacza pobranie wartości zmiennej głównej. W analogiczny sposób jest określone położenie suwaka (wskaźnika) we właściwości Wartość wskaźnika.

Użycie we właściwości Styl wskaźnika wyrażenia warunkowego IsMouseOver()?Holder:None powoduje, że w stanie normalnym suwak nie jest wyświetlany, natomiast po najechaniu kursorem myszki na obiekt, suwak się pokazuje i pozwala na zmianę nastawy.

Użycie koloru Transparent we właściwości Kolor wskaźnika nie powoduje ukrycia suwaka, a jedynie wyświetlenie go w formie półprzezroczystej.


12.2 Użycie suwaka do sterowania wartością zadaną z podglądem nowej nastawy

Kolejny przykład pokazuje, jak połączyć na jednym obiekcie klasy Słupek prezentację wartości pomiaru oraz jego wartości zadanej wraz z możliwością zmiany nastawy. Jednocześnie w trakcie zmieniania wartości zadanej (przeciągania suwaka) będzie pokazywana jej wartość w postaci tekstowej na osobnym obiekcie klasy Tekst.

Właściwości podstawowe
 | Aktywny | Tak
 | Główna zmienna | Level
 | Zmienna sterowana | #Set
 | Zmienna podglądowa | #View
 | Wartość minimalna sterowania | =Attribute("#Set",SteeringRangeFrom)
 | Wartość maksymalna sterowania | =Attribute("#Set",SteeringRangeTo)
 | Styl wskaźnika | =IsMouseOver()?Holder:Triangles
 | Użyj limitów | Tak
 | Wartość słupka | #
 | Wartość wskaźnika | #Set
 | Wartość minimalna | @DisplayRangeFrom
 | Wartość maksymalna | @DisplayRangeTo
 | Wartość LL | @LimitLoLo
 | Wartość L | @LimitLo
 | Wartość H | @LimitHi
 | Wartość HH | @LimitHiHi
 | Sterowanie natychmiastowe | Tak

Wysokość słupka będzie zależała od wartości zmiennej Level, a położenie suwaka(wskaźnika) od zmiennej LevelSet podanej w notacji sufiksowej. Do określenia położenia suwaka potrzebne jest podanie zakresu zmienności jego wartości we właściwościach Wartość minimalna sterowania i Wartość maksymalna sterowania. Użyte wyrażenia odwołują się do atrybutów zmiennej LevelSet zapisanych w bazie definicji zmiennych. Wysokość słupka zależy od zakresu podanego we właściwościach Wartość minimalna i Wartość maksymalna. W naszym przykładzie zakres ten określony jest przez atrybuty zakresu wyświetlania zmiennej głównej. Zakres zmienności słupka i suwaka nie muszą być zgodne, np. wielkość słupka może zależeć od wartości bezwzględnej, a wartość zadana (położenie suwaka) może być podawana procentowo.

Ustawienia właściwości Użyj limitów, Wartość LL, Wartość L, Wartość H i Wartość HH powoduje, że słupek będzie zmieniał kolor w zależności od przekroczenia poszczególnych limitów ostrzeżeń. Wartości limitów pobierana są z atrybutów zmiennej głównej Level.

Użycie we właściwości Styl wskaźnika wyrażenia warunkowego IsMouseOver()?Holder:Triangles powoduje, że w stanie normalnym położenie suwaka wyświetlane jest w postaci dwóch trójkątów na tle paska słupka, natomiast po najechaniu kursorem myszki na obiekt, suwak zmienia kształt sygnalizując gotowość do wykonania nowej nastawy.

Definicja właściwości Zmienna podglądowa #View powoduje, że w trakcie przeciągania suwaka, wartość nastawy odpowiadającej jego chwilowej pozycji będzie ustawiana w zmiennej LevelView. Zmienna taka powinna być zdefiniowana w kanale wirtualnym, a jej wartość może być wyświetlana np. obiektem klasy Tekst.

Właściwości podstawowe
 | Główna zmienna | SliderView
Właściwości stanowe, stan podstawowy
 | Widoczny | =Variable()>-1e200
 | Tekst | #

Jeżeli suwak nie jest w trakcie przeciągania, to zmienna podglądowa suwaka jest ustawiana na minimalną wartość typu Double. Wykorzystane jest to w definicji właściwości Widoczny obiektu Tekst. Obiekt jest widoczny na diagramie tylko wtedy, gdy suwak jest trakcie operacji wyboru nowej pozycji.


13 Animacja ruchu i zmiana rozmiaru obiektów

Rozdział pokazuje, w jaki sposób można dynamicznie zmieniać położenie i rozmiar obiektu na diagramie. Specyfika tego problemu polega na tym, że nie można bezpośrednio zmieniać właściwości obiektu odpowiedzialnych za położenie i rozmiar obiektu. Właściwości X, Y, Szerokość, Wysokość są zawsze podawane bezpośrednio.

W celu zmiany pozycji lub rozmiaru obiektu w trakcie działania aplikacji należy wykorzystać zdarzenie Animacja oraz akcje operatorskie SetPosition, SetSize i SetBounds. W zależności od potrzeb, w obsłudze zdarzenia Animacja należy zastosować jedną z wymienionych akcji z odpowiednio wyliczanymi parametrami położenia i/lub rozmiaru obiektu.


13.1 Zmiana pozycji

W poniższym przykładzie zmieniona zostanie pozycja obiektu typu Obraz. Położenie w osi X będzie sterowane zmienną procesową CarPosX, której wartość z zakresu od 0 do 100 określa przesunięcie obrazu w pikselach względem pozycji początkowej.

Właściwości podstawowe
 | Główna zmienna | CarPosX
Właściwości stanowe, stan podstawowy
 | Nazwa obrazu | Car
Zdarzenia
 | Animacja | ^SetPosition( RelToAbsX(100+Variable(),null)

Pozycja początkowa określona jest na 100. Do pozycji początkowej dodawana jest wartość zmiennej CarPosX. Tak wyliczona pozycja w pikselach musi być następnie przeliczona na wartość bezwzględną przy pomocy funkcji RelToAbsX. Wszystkie parametry funkcji zmiany położenia i rozmiaru są przekazywane w wartościach bezwzględnych niezależnych od rozmiaru diagramu. Wartość bezwzględna 1 000 000 zawsze odpowiada prawej krawędzi diagramu. Wartość null w drugim parametrze akcji SetPosition oznacza, że współrzędna Y obiektu nie ulega zmianie.

W podobny sposób można zmieniać rozmiar obiektu, ale w tym przypadku należałoby użyć akcję SetSize lub SetBounds.

Akcja pokazana w powyższym przykładzie ma jednak jedną podstawową wadę – działa dobrze tylko wtedy, gdy diagram ma stałe rozmiary. W przypadku diagramu skalowanego przeliczenia pozycji muszą bazować na współrzędnych bezwzględnych.

Właściwości podstawowe
 | Główna zmienna | CarPosX
Właściwości stanowe, stan podstawowy
 | Nazwa obrazu | Car
Zdarzenia
 | Animacja | ^SetPosition(500000+100000*(Variable()/100.0), null)

W powyższym przykładzie bazowe położenie obrazka, to środek diagramu (wartość 500 000 bezwzględna). Skrajne prawe położenie, przy wartości zmiennej CarPosX równej 100, to 60% szerokości diagramu.


13.2 Zmiana pozycji wewnątrz obszaru określonego innym obiektem

Powyższy problem przeliczania współrzędnych można ominąć stosując metodę względnego pozycjonowania obiektów. Zakres ruchu jest określony przez specjalny obiekt (może być niewidoczny), wewnątrz którego pozycjonowany jest obiekt właściwy.

Właściwości stanowe, stan podstawowy
 | Nazwa obrazu | Car
Zdarzenia
 | Animacja | ^SetPosition( LocalProperty(area,X) + ( LocalProperty(area,Width) * (Variable(CarPosX)/100.0) ), LocalProperty(area,Y) + (LocalProperty(area,Height) * (Variable(CarPosY)/100.0)) )

W przykładzie założono, że na diagramie znajduje się obiekt o nazwie area. Może to być np. prostokątny obiekt klasy Kształt. Do przeliczenia pozycji obrazka wykorzystywane są koordynaty obiektu area, odczytywane funkcją LocalProperty. Zmienne sterujące pozycją w obu osiach CarPosX i CarPosY mają zakres zmienności od 0 do 100.

Wygodą tego rozwiązania jest to, że zmiana zakresu ruchu wymaga jedynie zmiany położenia obiektu area – nie jest potrzebna zmiana wyrażenia pozycjonującego w obiekcie obrazka.


13.3 Pozycjonowanie grup i wzorców

12.3 Pozycjonowanie grup i wzorców

Metody postępowania w przypadku grup obiektów i osadzonych wzorców jest identyczna jak w przypadku pojedynczych obiektów. Zdarzenie Animacja dla grup i wzorców pozwala kontrolować ich położenie i rozmiar.


14 Sygnalizacja i obsługa stanów alarmowych

Podstawowym mechanizmem przeglądania i obsługi alarmów są obiekty Tabela alarmów aktywnych i Tabela alarmów historycznych. Pokazują one stan alarmów w postaci tabelarycznej oraz posiadają zintegrowany pasek narzędziowy.

Zobacz też:

- podręcznik Asix.Evo_Pierwsze_Kroki.PDF/CHM, "4. Aplikacja z obsługą alarmów";

- podręcznik Asix.Evo_Obiekty.PDf/CHM, "Obiekt Tabela alarmów aktywnych", "Obiekt Tabela alarmów historycznych";

- podręcznik Asix.Evo_System_alarmów.PDF/CHM.

W rozdziale tym zajmiemy się jednak sposobami sygnalizacji i obsługi alarmów bezpośrednio na diagramach synoptycznych, z użyciem uniwersalnych obiektów.


14.1 Kontrola stanu i obsługa pojedynczych alarmów

W przykładzie pokazany zostanie typowy mechanizm sygnalizacji alarmu przy pomocy obiektu klasy Obraz. Stan obiektu będzie kontrolowany przy pomocy funkcji IsAlarm, IsAlarmUnaccepted i IsAlarmExcluded. Dodatkowo obiekt będzie służył do potwierdzania alarmu przy pomocy akcji operatorskiej AcceptAlarm. Inne akcje operatorskie związane z obsługą alarmów, to: ExcludeAlarm i IncludeAlarm.

Właściwości stanowe, stan podstawowy
 | Widoczny | Nie
 | Nazwa obrazu |
Właściwości stanowe, stan 1
 | Warunek stanu | =IsAlarm(A1001)
 | Widoczny | =!IsAlarmExcluded(A1001)
 | Nazwa obrazu | AlrRed
Właściwości stanowe, stan 2
 | Warunek stanu | =IsAlarmUnaccepted(A1001)
 | Widoczny | =!IsAlarmExcluded(A1001)
 | Nazwa obrazu | =IsBlinkOff()?AlrYellow:null
Zdarzenia
 | Kliknięcie prawym przyciskiem | ^AcceptAlarm(null,A1001)

W stanie podstawowym obrazek pozostaje niewidoczny. Stan numer 1 włącza się, gdy alarm o identyfikatorze A1001 zmieni stan na aktywny (rozpoczęty). Stan numer 2 włącza się, gdy alarm jest niepotwierdzony. Ponieważ stan o wyższym numerze ma pierwszeństwo, to w okresie, w którym alarm pozostaje niepotwierdzony (niezależnie od tego czy jest zakończony), wyświetlany jest obraz AlrYellow. Dodatkowo, wykorzystanie wyrażenia warunkowego z funkcją IsBlinkOff powoduje migotanie obrazka. Jeżeli alarm jest aktywny, ale potwierdzony, to wyświetlany jest obrazek AlrRed. Należy pamiętać o tym, że kontrola stanu alarmów zakończonych zależy od użytego trybu pracy logu alarmów aktywnych. Jeżeli alarm zakończony zostanie usunięty z logu (po upłynięciu czasu przechowania alarmów zakończonych), to funkcja IsAlarmUnaccepted zwróci wartość false nawet wtedy, gdy alarm nie jest potwierdzony.

Ponieważ funkcje IsAlarm i IsAlarmUnaccepted zwracają rzeczywisty stan alarmu niezależnie od tego, czy został on przez operatora wykluczony z obsługi, to konieczne jest użycie funkcji IsAlarmExcluded we właściwości Widoczny. Jeżeli w aplikacji wykluczenia nie byłyby stosowane, to wystarczałoby użycie w we właściwości Widoczny obu stanów wartości Tak.

Akcja AcceptAlarm w obsłudze zdarzenia Kliknięcie prawym przyciskiem powoduje potwierdzenie alarmu A1001.

W przykładzie założono, że w aplikacji jest zdefiniowana tylko jedna domena alarmowa. Gdyby tak nie było, to należałoby użyć wariantów funkcji IsAlarm itp. z jawnym podaniem nazwy domeny.

Powyższy przykład, chociaż poprawny, ma jedną istotną wadę. Próba użycia obiektu, do kontroli innego alarmu wymaga modyfikacji pięciu właściwości. Zalecaną procedurą jest przekształcenie obiektu we wzorzec z parametrem określającym identyfikator alarmu i wywołanie funkcji Parameter wszędzie tam, gdzie identyfikator został użyty. Można też postąpić zgodnie z poniższym przykładem.

Właściwości podstawowe
 | Główna zmienna | A1001
Właściwości stanowe, stan podstawowy
 | Widoczny | Nie
 | Nazwa obrazu |
Właściwości stanowe, stan 1
 | Warunek stanu | =IsAlarm(LocalProperty(MainVar))
 | Widoczny | =!IsAlarmExcluded(LocalProperty(MainVar))
 | Nazwa obrazu | AlrRed
Właściwości stanowe, stan 2
 | Warunek stanu | =IsAlarmUnaccepted(LocalProperty(MainVar))
 | Widoczny | =!IsAlarmExcluded(LocalProperty(MainVar))
 | Nazwa obrazu | =IsBlinkOff()?AlrYellow:null
Zdarzenia
 | Kliknięcie prawym przyciskiem | ^AcceptAlarm(null, LocalProperty(MainVar))

Ten wariant działa dokładnie tak samo jak poprzedni. Identyfikator alarmu został jednak podany wyłącznie we właściwości Główna zmienna. Fakt, że taka zmienna nie istnieje, nie ma znaczenia. Decydujący jest kontekst użycia właściwości. W tym przypadku wartość właściwości jest pobierana przy pomocy funkcji LocalProperty i używana jako identyfikator alarmu.


14.2 Sygnalizacja stanu grupy alarmów

Korzystając z funkcji AlarmsGroupState można kontrolować zbiorczy stan alarmów w wybranej grupie lub nawet całej domenie. W przykładzie użyjemy półprzezroczysty obiekt klasy Kształt w celu sygnalizacji alarmów we fragmencie kontrolowanej instalacji.

Właściwości podstawowe
 | Warstwa | 10
Właściwości stanowe, stan podstawowy
 | Widoczny | Nie
 | Przezroczystość | 0,1
Właściwości stanowe, stan 1
 | Warunek stanu | =AlarmsGroupState(Blok1, "Strefa=S1”)&1
 | Widoczny | Tak
 | Kolor | Cyan
 | Kolor otoczki | Blue
 | Przezroczystość | 0,5
Właściwości stanowe, stan 2
 | Warunek stanu | =AlarmsGroupState(Blok1, "Strefa=S1”)&4
 | Widoczny | Tak
 | Kolor | Coral
 | Kolor otoczki | Red
 | Przezroczystość | 0,5

Zakładamy obiekt klasy Kształt w takim miejscu, żeby przesłonił właściwy fragment diagramu. W tym celu może być konieczna zmiana właściwości Warstwa. W stanie podstawowym obiekt ma pozostać niewidoczny. Ponieważ wartość właściwości Widoczny jest ignorowana w trakcie edycji diagramu, to zmieniamy też właściwość Przezroczystość – ułatwi to edycję diagramu, obiekty pod obiektem Kształt będą widoczne. Następnie dodajemy dwa stany, służące do sygnalizacji alarmów. Każdy z nich ma indywidualnie ustawione atrybuty kolorów, właściwość Widoczny ustawioną na Tak, oraz odpowiedni poziom przezroczystości. W warunkach stanów użyto funkcję AlarmsGroupState. Funkcja kontroluje stan alarmów z domeny Blok1, dla których atrybut grupujący Strefa jest równy S1. Wartość zwracana przez funkcję może być interpretowana na różne sposoby. W naszym przypadku bitowy iloczyn logiczny z wartością 1 (test najmłodszego bitu) sprawdza, czy w grupie znajduje się alarm niepotwierdzony. Test z wartością 4 (test bitu numer 2) sprawdza, czy w grupie znajduje się przynajmniej jeden niepotwierdzony alarm aktywny. Ze względu na kolejność definicji stanów, jeżeli w grupie znajdzie się alarm aktywny niepotwierdzony, to wyświetlona zostanie „szybka” w kolorze Coral. Jeżeli takiego alarmu nie będzie, ale będzie przynajmniej jeden alarm zakończony i niepotwierdzony, to „szybka” będzie w kolorze Cyan.

Do sygnalizacji stanu grupy alarmów można też wykorzystać funkcję AlarmsCount, która zwraca liczbę alarmów w wybranej grupie z uwzględnieniem stanów aktywności i potwierdzenia.


15 Kontrola pracy obiektów klasy Wykres

Obiekty klasy Wykres posiadają własne, wbudowane interfejsy współpracy z użytkownikiem. Alternatywą jest też obiekt Kontroler wykresu, który pozwala sterować pracą wykresu. W niektórych scenariuszach pracy może być jednak konieczne dodanie własnych mechanizmów sterujących.


15.1 Sterowanie zakresem czasu wykresu

W standardowym zastosowaniu obiekty wykresów, po otwarciu diagramu pokazują zdefiniowany w obiekcie okres czasu wyliczany względem chwili bieżącej. Użytkownik, o ile nie zostanie to zablokowane, może później wybrać dowolny inny zakres czasu. Można jednak dodać dodatkowe mechanizmy wyboru zakresu czasu przez użytkownika, ewentualnie forsować zakres czasu na podstawie danych pobieranych z różnych źródeł.


15.1.1 Modyfikacja właściwości obiektu Wykres

Pokazywany na obiekcie zakres czasu zależy od trzech właściwości. Długość okresu czasu jest podawana we właściwości Zakres czasu [min]. Koniec zakresu (prawą stronę) określa właściwość Ręczny czas bazowy. Ma ona jednak znaczenie tylko wtedy, gdy dodatkowo właściwość Tryb odświeżania jest ustawiona na Ręczny – w przeciwnym wypadku koniec wykresu będzie określony przez chwilę bieżącą.

Wykorzystując akcję operatorską SetProperty można zmieniać zakres czasu wykresów.

Właściwości podstawowe
 | Nazwa elementu | Chart
 | Ręczny czas bazowy |
 | Zakres czasu [min] | 10
 | Tryb odświeżania | Ręczny

Powyższy fragment definicji obiektu klasy Wykres pokazuje obiekt o nazwie Chart, który po otwarciu diagramu wyświetli wykres dla ostatnich 10 minut. Istotne jest, żeby obiekt posiadał nazwę oraz wybrany był ręczny tryb odświeżania.

Poniższe obiekty klasy Przycisk służą do przełączania zakresu czasu.

Właściwości podstawowe
 | Aktywny | Tak
 | Typ przycisku | Standardowy przycisk Windows
 | Tryb przełącznika | Nie
 | Sterowanie natychmiastowe | Tak
Właściwości stanowe, stan podstawowy
 | Włączony | Nie
 | Tekst wyłączenia | Ostatnia godzina
Zdarzenia
 | Wyłączenie przycisku | ^Actions(SetProperty(Chart,ManualBaseTime,OPCTime("HOUR+1H")), SetProperty(Chart,TimeRange,60))

Właściwości podstawowe
 | Aktywny | Tak
 | Typ przycisku | Standardowy przycisk Windows
 | Tryb przełącznika | Nie
 | Sterowanie natychmiastowe | Tak
Właściwości stanowe, stan podstawowy
 | Włączony | Nie
 | Tekst wyłączenia | Ostatni kwadrans
Zdarzenia
 | Wyłączenie przycisku | ^Actions(SetProperty(Chart,ManualBaseTime,OPCTime("Minute15+15M")), SetProperty(Chart,TimeRange,15))

Oba obiekty wykorzystują akcję wielokrotną Actions z akcjami składowymi SetProperty do modyfikacji wartości właściwości Ręczny czas bazowy (nazwa wewnętrzna ManualBaseTime) i Zakres czasu [min] (nazwa wewnętrzna TimeRange). Zmiana właściwości TimeRange jest oczywista. W przypadku właściwości ManualBaseTime nowa wartość musi być konwertowalna na format DateTime. Może być podawana w postaci tekstowej, pobierana ze zmiennej typu DateTime, wyliczana z wykorzystaniem funkcji FromAsix6Date. W przykładach użyto funkcję OPCTime, która w łatwy sposób pozwala określić okres czasu wyliczany na podstawie chwili bieżącej. Wyrażenie OPCTime(”HOUR+1H”) powoduje wyliczenie końca bieżącej godziny (np. dla chwili bieżącej 13:20, zwraca wartość 14:00), czyli wykres pokaże okres od początku bieżącej godziny do jej końca). W podobny sposób działa wyrażenia OPCTime(”Minute15+15M”), które powoduje wyświetlenie bieżącego pełnego okresu 15-minutowego.


15.1.2 Sterowanie poprzez zmienną wirtualną

Alternatywnie do bezpośredniego ustawiania wartości właściwości wykresu można też sterować zakresem czasu za pośrednictwem zmiennych typu DateTime. Pozwala to na pełną automatyzację pracy.

Właściwości podstawowe
 | Ręczny czas bazowy | =Variable(TimeMax)
 | Zakres czasu [min] | 10
 | Tryb odświeżania | Ręczny

W powyższym przypadku czas bazowy (koniec zakresu) wynika z wartości zmiennej TimeMax. Zmienna powinna mieć wartość typy DateTime. Ewentualnie należy wykonać odpowiednią konwersję, np. używając funkcję ToDateTime. Każdorazowa zmiana wartości zmiennej TimeMax automatycznie powoduje odpowiednią zmianę zakresu wykresu.

Nową wartość zmiennej TimeMax można ustawiać skryptem, pobierać bezpośrednio ze sterownika (przy odpowiednich konwersjach) lub wprowadzać przy pomocy obiektu Tekst.

Właściwości podstawowe
 | Aktywny | Tak
 | Główna zmienna | TimeMax
 | Zmienna sterowana | #
 | Początkowa wartość edycji | Bieżąca
 | Sterowanie natychmiastowe | Tak
Właściwości stanowe, stan podstawowy
 | Tekst | #

Jeżeli typ zmiennej TimeMax został określony jako DateTime, to nową wartość należy podać w sposób zgodny z jakimkolwiek systemowym formatem tekstowym daty i czasu. Po zweryfikowaniu poprawności formy nowej wartości, zostanie ona przeliczona na typ DateTime i zapisana w zmiennej TimeMax, wpływając w ten sposób na zakres czasu wyświetlanego na wykresie.


15.2 Kontrola wyświetlania przebiegów wzorcowych

Obiekty Wykres posiadają też możliwość wyświetlania tzw. przebiegów wzorcowych. Kluczowe jest wtedy określenie właściwego punktu zaczepienia przebiegu wzorcowego.

Właściwości podstawowe
 | Modyfikowalne przebiegi wzorcowe | Nie
Przebiegi wzorcowe, seria #1
 | Nazwa przebiegu | Trend1
 | Zaczep przebiegu | &PatternTime

Właściwość Modyfikowalne przebiegi wzorcowe określa, czy użytkownik może zmieniać krzywą wzorcową oraz jej punkt zaczepienia (przy pomocy komend z menu kontekstowego obiektu). W przypadku, gdy chcemy sterować pracą obiektu własnymi mechanizmami, warto wyłączyć obsługę użytkownika.

Za wybór krzywej wzorcowej odpowiada właściwość Nazwa przebiegu, a za jej punkt zaczepienia właściwość Zaczep przebiegu. W naszym przykładzie punkt zaczepu ustawiany jest na podstawie wartości zmiennej PatternTime, która powinna być typu DateTime.

Właściwości podstawowe
 | Aktywny | Tak
 | Typ przycisku | Standardowy przycisk Windows
 | Tryb przełącznika | Nie
 | Sterowanie natychmiastowe | Tak
Właściwości stanowe, stan podstawowy
 | Włączony | Nie
 | Tekst wyłączenia | Zaczep wzorzec
Zdarzenia
 | Wyłączenie przycisku | ^SetVariable(PatternTime,OPCTime("NOW-5M"))

Właściwości podstawowe
 | Aktywny | Tak
 | Typ przycisku | Standardowy przycisk Windows
 | Tryb przełącznika | Nie
 | Sterowanie natychmiastowe | Tak
Właściwości stanowe, stan podstawowy
 | Włączony | Nie
 | Tekst wyłączenia | Ukryj wzorzec
Zdarzenia
 | Wyłączenie przycisku | ^SetVariable(PatternTime,"2000-1-1")

Pierwszy z obiektów Przycisk, ustawia zmienną PatternTime na wartość 5 minut przed chwilą bieżącą. Spowoduje to wyświetlenie krzywej wzorcowej od tego momentu.

Drugi z przycisków ukrywa przebieg wzorcowy poprzez przesunięcie go poza zakres czasu widoczny na obiekcie Wykres. Alternatywna metoda usuwania krzywej wzorcowej to zmiana nazwy przebiegu na nazwę pustą (nazwa przebiegu też może być podawana za pośrednictwem zmiennej wirtualnej).


16 Użycie wzorców

Wzorce obiektów w znacznym stopniu ułatwiają konstrukcję aplikacji. Pozwalają one na tworzenie „klocków”, z których następnie aplikacja jest składana. Wzorzec może łączyć w całość grupę obiektów lub w prostszych przypadkach zawierać pojedynczy obiekt, ale z wstępnie ustawionymi właściwościami. Wzorce mogą posiadać parametry, które służą do określenia sposobu działania wzorca w miejscu jego osadzenia na diagramie.

W przykładzie zajmiemy się konstrukcją jednoobiektowego wzorca opartego na obiekcie klasy Miernik. Wzorzec będzie sygnalizował przekroczenie dwóch limitów alarmowych, a wartości limitów i zakresy wartości będą pobierane z bazy definicji zmiennych.

Tabela: Parametry wzorca.

Parametry wzorca
EndAngle |  |
 | Wartość domyślna | 405
StartAngle |  |
 | Wartość domyślna | 135
Variable |  |
 | Wartość domyślna |

Wzorzec będzie posiadał 3 parametry. StartAngle i EndAngle określają krańcowe kąty skali miernika. Maja one określone wartości domyślne – w miejscu osadzenia wzorca trzeba będzie podać wartość tych parametrów tylko wtedy, gdy będą one inne od domyślnych. Parametr Variable służy do przekazania nazwy zmiennej procesowej, której wartość będzie pokazywana na mierniku.

W trakcie przygotowania (edycji) wzorca, można podać testowe wartości parametrów. Pozwala to na sprawdzenie, czy wzorzec zachowuje się zgodnie z oczekiwaniami.

Częściową parametryzację obiektu Miernik stanowiącego zawartość wzorca pokazuje poniższa tabela.

Tabela: Wybrane parametry obiektu Miernik.

Właściwości podstawowe
 | Główna zmienna | %Variable
 | Obrazek tła | !GaugeBkImage
 | Pokaż limity | Tak
 | Wartość | #
 | Wartość minimalna | @DisplayRangeFrom
 | Wartość maksymalna | @DisplayRangeTo
 | Wartość LL | @DisplayRangeFrom
 | Wartość L | @LimitLo
 | Wartość H | @LimitHi
 | Wartość HH | @DisplayRangeTo
 | Kąt początkowy | %StartAngle
 | Kąt końcowy | %EndAngle
 | Kolor wartości poprawnej | !GaugeProperColor
 | Kolor L | Yellow
 | Kolor H | Yellow
Właściwości stanowe, stan podstawowy
 | Kolor wskazówki | !GaugePointerColor
 | Kolor tła | !GaugeBkColor
 | Kolor otoczki | =Property(GaugeBkImage) == "" ? Property(GaugeOutlineColor) : Transparent
 | Kolor podziałki | !GaugeScaleColor
 | Kolor czcionki | !GaugeFontColor

Zmienna główna obiektu jest zdefiniowana jako %Variable. Oznacza to odwołanie do parametru wzorca o nazwie Variable. Nazwa zmiennej zostanie przekazana do wzorca w miejscu jego osadzenia na diagramie. W podobny sposób zdefiniowane są właściwości Kąt początkowy i Kąt końcowy.

Część właściwości, m.in. Obrazek tła, zdefiniowane są przez odwołanie do właściwości globalnej. Odwołania tego typu określone są przez prefiks !. W efekcie, wygląd wzorca może być zmieniany przez zmianę wartości właściwości globalnej. Ten sposób parametryzacji ma szczególnie sens wtedy, gdy właściwości globalne są współużywane przez wiele wzorców i obiektów – pozwala to na łatwą zmianę wyglądu całej aplikacji.

Wyrażenie =Property(GaugeBkImage) == "" ? Property(GaugeOutlineColor) : Transparent użyte we właściwości Kolor otoczki pokazuje warunkowe ustawienie koloru w zależności od wartości właściwości globalnej (pobieranej funkcją Property). Jeżeli właściwość globalna GaugeBkImage nie jest zdefiniowana (jest pusta), to kolor otoczki określa wartość właściwości globalnej GaugeOutlineColor. W przeciwnym wypadku otoczka jest ukrywana poprzez wybranie koloru przezroczystego.

Właściwość Wartość określona jest w sposób typowy – notacja # oznacza wartość zmiennej głównej. Ponieważ zmienna główna jest określona parametrem wzorca, to położenie wskazówki miernika będzie wynikało z wartości zmiennej o nazwie przekazanej w parametrze wzorca. Definicje właściwości zakresów i limitów alarmowych odwołują się do atrybutów zmiennej (prefiks @). Tutaj też następuje pośrednie odwołanie do atrybutu zmiennej określonej parametrem wzorca.

Właściwości Kolor L i Kolor H zdefiniowane są bezpośrednio. Gdyby zaszła konieczność użycia innych kolorów, to możliwe byłyby dwie strategie. Można stworzyć bliźniaczy wzorzec o inaczej ustawionych kolorach przekroczeń lub dodać dwa dodatkowe parametry kolorów i zrobić jeden wzorzec uniwersalny.


5.1.2 Otwarcie okna i diagramu akcją OpenWindow

Akcja OpenWindow używana jest do otwarcia nowego predefiniowanego okna synoptycznego lub podmiany diagramu w wybranym panelu okna już otwartego. Może być też w celu uaktywnienia okna wcześniej otwartego bez zmiany wyświetlanych diagramów. Dokładny algorytm działania akcji znajduje się w opisie akcji.

Przykład 1.

OpenWindow(okno1,null,null,null)

Akcja otwiera okno okno1 z domyślnym diagramami w panelach. Jeżeli okno1 jest już otwarte, to zostanie ono uaktywnione bez zmiany wyświetlanych diagramów. Działanie tej akcji jest zbliżone do uruchamiania okien startowych.

Przykład 2.

OpenWindow(okno1,info,machine,”mid=8”)

Zadaniem akcji jest otwarcie okna okno1 z diagramem machine w panelu Info i parametrem mid równym 8 lub podmiana diagramu w oknie okno1 otwartym wcześniej. Jeżeli jest kilka otwartych okien okno1, to najpierw jest sprawdzane czy jest otwarte okno z diagramem machine w panelu Info i zgodnymi parametrami. Jeżeli tak, to akcja ograniczy się tylko do uaktywnienia już otwartego okna.

Akcja używana do podmiany diagramów w oknach głównych aplikacji lub do otwarcia okien tzw. stacyjek wtedy, gdy chcemy mieć otwartą tylko jedną stacyjkę.

Przykład 3.

OpenWindow(okno1,info,machine,”mid=8”,true)

Działanie akcji jest podobne do poprzedniego przykładu. Różnica polega na tym, że użyte (uaktywnione) zostanie okno wcześniej otwarte tylko przy całkowitej zgodności nazwy okna, diagramu i parametrów.

Akcja używana do otwierania okien tzw. stacyjek wtedy, gdy chcemy mieć otwartych dowolną liczbę stacyjek (ale każdą z innym diagramem lub parametrami).

Przykład 4.

OpenWindow(null,info,machine,”mid=8”)

Zadaniem akcji jest wymiana diagramu i parametrów w panelu info w oknie kontekstowym akcji operatorskiej. Okno kontekstowe wynika z miejsca zdefiniowania wykonywanej akcji, np. położenia obiektu Przycisk, którego przyciśnięcie powoduje wykonanie akcji.


5.1.3 Otwarcie diagramu bez użycia predefiniowanego okna

5.1.3 Otwarcie diagramu bez użycia predefiniowanego okna synoptycznego

Możliwe jest także bezpośrednie otwarcie diagramu synoptycznego bez wcześniejszego definiowania okna. Pozwala na to akcja OpenDiagram. W wyniku jej działania tworzone jest wewnętrznie okno tymczasowe, w którym wyświetlany jest żądany diagram.

Przykład 1.

OpenDiagram(machine,”mid=8”,stacyjka,$Normal, &CursorLocation, &CursorLocation,”FixedSize”, $None)

Akcja otwiera diagram machine z parametrem mid równym 8 w oknie utworzonym automatycznie. Rozmiar okna jest zgodny z rozmiarem diagramu, a jego położenie wynika z pozycji kursora. Tytuł okna oraz jego wygląd i zachowanie są określone bezpośrednio w treści akcji. W tym przypadku tytułem okna jest tekst stacyjka, okno ma stały rozmiar, a pozostałe parametry wyglądu są ustawione domyślnie. Podobnie jak w przypadku akcji OpenWindow, przed otwarciem nowego okna wykonywane jest sprawdzenia czy diagram z podanymi parametrami nie jest już otwarty.

Działanie akcji jest zbliżone do akcji OpenWindow(okno1,info,machine,”mid=8”,true) i pozwala na otwieraniu wielu okien stacyjek jednocześnie.

Podstawowa różnica pomiędzy akcjami OpenWindow i OpenDiagram polega na miejscu zdefiniowania wyglądu i zestawu dostępnych operacji systemowych okna. W pierwszym przypadku jest to określone w parametrach predefiniowanego okna, w drugim w treści akcji. Definicja w treści akcji pozwala na dynamiczne dostosowanie wyglądu okna, a w szczególności tytułu okna.

Przykład 2.

OpenDiagram(machine,”varname=”+Attribute(Name),”Zmienna “+Attribute(Name),$Normal, &CursorLocation, &CursorLocation,”FixedSize”, $None)

W tym przypadku nazwa zmiennej głównej obiektu (w kontekście którego akcja jest wykonywana) jest przekazywana do parametrów diagramu (parametr ”varname=”+Attribute(Name)). Jednocześnie nazwa zmiennej dodawana jest do tytułu stacyjki (parametr ”Zmienna “+Attribute(Name)).

Dodatkowa zaletą akcji OpenDiagram jest możliwość określenia trybu pracy. W pokazanym dotychczas trybie $Normal okno zachowuje się jak każde inne predefiniowane okno aplikacji. W trybie $Dialog tworzona jest stacyjka dialogowa – nie ma możliwości przejścia do innego okna do momentu zamknięcia stacyjki. W trybie $Temp okno jest automatycznie zamykane w chwili wyboru innego okna aplikacji.