310 likes | 459 Views
Podsystem wyzwalania. Sterowanie wyzwalaniem akcji urządzenia. Określenia podstawowe:. Wszystkie rodzaje akcji współczesnych urządzeń pomiarowych mogą być synchronizowane zdarzeniami zewnętrznymi lub wewnętrznymi. Pod pojęciem akcji rozumie się rozpoczęcie akwizycji lub generacji sygnału.
E N D
Podsystem wyzwalania Sterowanie wyzwalaniem akcji urządzenia
Określenia podstawowe: Wszystkie rodzaje akcji współczesnych urządzeń pomiarowych mogą być synchronizowane zdarzeniami zewnętrznymi lub wewnętrznymi. Pod pojęciem akcji rozumie się rozpoczęcie akwizycji lub generacji sygnału. Synchronizację akcji urządzenia z zdarzeniami nazywa się ogólnie wyzwoleniem (triggering). Polecenia odpowiedzialne za ustawienie parametrów wyzwolenia akcji urządzenia są zgrupowane w podsystemie TRIGger systemu poleceń SCPI.
Podstawowy model podsystemu TRIGger : IDLE - Stan spoczynkowy (obowiązkowy) INITiated – stan zainicjalizowania (opcjonalny) ARM – stan oczekiwania na uzbrojenie (dowolna liczba stanów, opcjonalny) TRIGger – stan oczekiwania na wyzwolenie (obowiązkowy) System musi przejść przez wszystkie stany , aby zainicjować akcję urządzenia.
Działanie podsystemu TRIGger : Urządzenie pozostaje w stanie IDLE do momentu wykonania polecenia INITiate. System TRIGger przechodzi do stanu następnego w sekwencji zastosowanych stanów. W stanie ARM oczekuje na zdarzenie pozwalające mu wyjść z tego stanu i przejść do następnego. Ostatnim ze stanów oczekujących na zdarzenie jest stan TRIGger. Każde wyjście w dół lub w górę z danego stanu generuje sygnał zdarzenia, który może być wykorzystany do sterowania urządzeniem. Sygnał wyjścia w dół ze stanu TRIGger jest wykorzystany do zainicjowania akcji urządzenia.
Nazwy zasobów dotyczących poszczególnych warstw sekwencji wyzwalania : Prosty system wyzwalania jest sekwencją pokazanych stanów (warstw), spośród których tylko warstwa ARM może mieć kilka instancji. Zasoby funkcjonalne określające sposób działania warstw są związane wyłącznie z warstwami ARM oraz TRIGger. W poleceniach nazwa danego zasobu jest poprzedzona nazwą warstwy do, której on należy , np.: ARM:LAYer2 – poprzedza zasoby warstwy ARM nr 2 ARM:LAYer1 – poprzedza zasoby warstwy ARM nr 1 ARM – poprzedza zasoby warstwy ARM nr 1; nr 1 jest domyślnym określeniem i słowo LAYer1 można pominąć. TRIGger – poprzedza nazwę zasobu warstwy TRIGger System wyzwalania może składać się z kilku równoległych sekwencji. Wówczas w nazwie zasobu występuje dodatkowo nazwa sekwencji: ARM:SEQuence3:LAYer2 – zasób warstwy ARM nr 2 sekwencji 3 systemu wyzwalania ARM:SEQuence1:LAYer1 – zasób warstwy ARM nr 1 sekwencji1; równoważne określeniu ARM
Stan IDLE oraz INITiated : Podsystem wyzwalania może wyjść ze stanu IDLE tylko na skutek polecenia: INITate[:IMMediate ] lub INITiate:CONTinous ON Dopóki podsystem TRIGger jest w stanie spoczynkowym wszelkie zdarzenia synchronizujące są ignorowane. Akcje urządzenia w sensie rozpoczęcia akwizycji danych czy generacji nowego sygnału są zablokowane. Po zainicjowaniu system przechodzi natychmiast przez stan INITiated do najwyższej warstwy ARM:LAYer. Odwrotne przejście jest uzależnione od sposobu zainicjowania podsystemu TRIGger. W pracy ciągłej (INIT:CONT ON) następuje powrót sterowania do najwyższej warstwy ARM. Polecenie INIT jest poleceniem nakładkowym. Wyjście ze stanu INITiated ustawia flagę NOPF wykonywania operacji natomiast powrót do stanu INITiated zeruje ją wskazując zakończenie operacji.
Stan oczekiwania na zdarzenie (ARM i TRIGger) : • Programowalne zasoby każdej warstwy ARM oraz TRIGger: • Źródło zdarzenia • Charakterystyka zdarzenia • Liczba zdarzeń po których nastąpi wyjście z danej warstwy • Opóźnienie pomiędzy zdarzeniem i wyjściem z warstwy • Liczba powtórzeń akcji danej warstwy. • Przyrząd nie musi implementować wszystkich cech funkcjonalnych warstw oczekiwania na zdarzenie.
Kwalifikacje sygnału wyzwolenia : Określenie zakresu możliwości sygnału wyzwalającego dotyczy praktycznie sygnałów analogowych (źródło zdarzeń INT, EXT lub LINE).
Źródło zdarzenia (ARM i TRIGger) : TRIGger:SOURce EXTernal – zdarzenie jest generowane przez sygnał zewnętrzny doprowadzony do specjalnego gniazda. TRIGger:LEVel 4.5 – zdarzenie wystąpi , gdy sygnał wejściowy przekroczy poziom 4.5V. ARM:LAYer2:SOURce INT ARM:LAYer2:LEVel 5.0 ARM:LAYer2:SLOPe POS ARM:LAYer2: HYSTeresis 0.2– polecenia ustawiające źródło wyzwolenia i parametry charakteryzujące zdarzenie dla warstwy ARM nr 2.
Polecenia SIGNal i IMMediate (ARM i TRIGger) : Polecenia te powodują jednorazowe pominięcie oczekiwania na zdarzenie w warstwie, do której zostanie skierowane. Różnica pomiędzy nimi polega na tym, że IMMediate bocznikuje licznik ECOUnt oraz DELay, powodując natychmiastowe wyjście z warstwy. Polecenie musi wystąpić w momencie oczekiwania na zdarzenie w danej warstwie. Jeśli wystąpi w innych warunkach jest ignorowane i zgłaszany jest błąd. TRIGger:SIGnal – polecenie zbocznikuje detektor zdarzeń warstwy TRIGger. TRIGger:IMMediate - polecenie zbocznikuje detektor zdarzeń warstwy TRIGger i spowoduje natychmiastowe wyjście z niej a więc także nastąpi natychmiastowy start akcji urządzenia.
DElay oraz ECOunt (ARM i TRIGger) : Zasób DELay pozwala opóźnić wyjście z warstwy w stosunku do zdarzenia o podany okres czasu (domyślnie =0): TRIGger:DELay 0.05 – wyjście z warstwy trigger nastąpi z opóźnieniem 50ms w stosunku do wykrytego zdarzenia. Zasób ECOunt określa po ilu zaistniałych zdarzeniach ma nastąpić wyjście z warstwy (domyślnie =1): ARM:SOURce EXT ARM:SLOPe POS ARM:ECOunt 10 – wyjście z warstwy ARM w dół nastąpi po 10 zdarzeniach, np. po 10-tym narastającym zboczu zewnętrznego sygnału wyzwalającego.
COUNt (ARM i TRIGger) : Zasób COUNt określa liczbę powtórzeń akcji danej warstwy (domyślnie =1): TRIGger:COUNt 5 – wyznacza 5-krotne powtórzenie akcji warstwy TRIGger. Każde powtórzenie to wyzwolenie akcji urządzenia po wystąpieniu określonego zdarzenia. Po 5 wyzwoleniu i zakończeniu akcji urządzenia następuje przejście do warstwy wyższej. ARM:COUNt 10 – podobnie jak w przykładzie poprzednim z tym, że dotyczy warstwy ARM.
Zdarzenia wyjść z warstw sekwencji : Podczas działania systemu następują przejścia w dół poprzez poszczególne warstwy oraz przejścia powrotne w górę do stanu spoczynkowego. Każde wyjście z warstwy zarówno w dół jak i w górę generuje zdarzenie, które jest określone standardową nazwą i może być wykorzystane w procesie sterowania działaniem urządzenia. Budowa nazwy zdarzenia jest następująca: <nazwa_warstwy><sekwencja_warstwy> <rozszerzenie_nazwy><[:DOWN] | :UP> np.: INITiated:DOWN INITiated:UP – wyjście w dół i w górę z warstwy zainicjowania sekwencji nr 1 . ARM:SEQuence2:LAYer3:DOWN – wyjście w dół z warstwy ARM nr3 sekwencji drugiej. TRIGger:SEQuence2 TRIGger:SEQuence2:UP– wyjście w dół oraz w górę z warstwy TRIGger sekwencji drugiej.
Podsystem TRIGger multimetru HP34401 : Podsystem TRIGger multimetru HP34401 wykorzystuje tylko warstwę IDLE oraz TRIGger. Przykład zaprogramowania przyrządu do wykonania zadanej liczby <n> pojedynczych pomiarów inicjalizowanych sygnałem zewnętrznym bez dodatkowego opóźnienia : TRIGger:Source EXT TRIGger:COUNt <n> TRIGger:Delay 0 SAMPle:COUNt 1 Lub podobnie, ale z założeniem wykonania po każdorazowym wyzwoleniu serii <k> pomiarów w odstępach 1sekundowych: TRIGger:Source EXT TRIGger:COUNt <n> TRIGger:Delay 1 SAMPle:COUNt <k> Równoważne polecenie złożone: TRIGger:Source EXT; COUNt <n>; Delay 1; :SAMPle:COUNt <k>
Podsystem TRIGger multimetru 2001 Keithley : • Multimetr ( 2001 Keithley ) posiada wewnętrzny moduł przełącznika kanałów pomiarowych. • Stosuje jedną sekwencję wyzwalania, ale z dwiema warstwami ARM. • Zdarzenia DOWN kolejnych warstw są wykorzystane następująco: • ARM:LAYer2 - powtarzanie cykli skanowania listy kanałów. • ARM:LAYer1 – przejście po kanałach listy; • TRIGger - start pomiaru w ustawionym kanale; • Odpowiednio programując system wyzwalania można zrealizować sesję pomiarową wykonującą: • n cykli pomiarowych w wybranych kanałach pomiarowych; • w każdym cyklu uczestniczy k kanałów; • w wybranym kanale pomiarowym wykonana jest każdorazowo seria m pomiarów.
Złożone systemy wyzwalania : • Sekwencje złożonego systemu wyzwalania mogą być niezależne lub wzajemnie synchronizowane przez zdarzenia generowane w tych sekwencjach. • Wzajemne powiązania są predefiniowane w urządzeniu lub ustalane programowo. • Konfigurowanie programowe powiązań polega na : • wyborze źródła synchronizacji typu LINK dla danej warstwy w wybranej sekwencji; • podaniu nazwy zdarzenia, które detektor tej warstwy ma wykryć. ARM:SEQuence2:LAYer1:SOURce LINK – wybór źródła typu LINK ARM:SEQuence2:LAYer1:LINK "ARM:SEQuence1:LAYer3:DOWN" – nazwa zdarzenia związana z źródłem LINK wybranej warstwy.
Aliasy sekwencji wyzwalania : Sekwencjom systemu wyzwalania można przypisywać własne nazwy (aliasy nazw standardowych). Ma to na celu ułatwienie programowania przyrządu oraz zapewnienie dobrej czytelności poleceń w kodzie źródłowym programu. Służy do tego celu jedno z poleceń: ARM:SEQuence<n>:DEFine <alias> TRIGger:SEQuence<n>:DEFine <alias> Oba mają te same przeznaczenie. Jeśli sekwencja nie ma warstw ARM stosuje się drugie polecenie. ARM:SEQuence2:DEFine VECTOR – VECTOR jest aliasem nazwy SEQuence2 ARM:VECTOR:SOURce BUS – ustawia wyzwolenie z interfejsu dla warstwy ARM sekwencji VECTOR. Wersję krótką aliasu można stosować dopiero po odpowiednim przystosowaniu urządzenia do tego celu (polecenie MGRules).
Polecenia sekwencyjne i nakładkowe : Sekwencyjne; Polecenia są wykonywane sekwencyjnie. Kolejne polecenie czeka w kolejce aż zostanie wykonane poprzednie. Rozpoczęcie realizacji danego polecenia oznacza , że poprzednie zostało już wykonane w całości. Nakładkowe; Polecenia realizowane współbieżnie . Blok przekazywania poleceń inicjuje ich realizację przez blok funkcji urządzeniowych i nie czeka na zakończenie związanych z nimi operacji lecz przekazuje do wykonania następne polecenie. Zwykle są to polecenia o długim czasie wykonania.
Zaleta poleceń nakładkowych : Ustawienie podsystemu TRIGger: TRIGger:Source IMM TRIGger:COUNt 100 TRIGger:Delay 0.1 SAMPle:COUNt 10 Czas wykonania jednego pomiaru równy np. około 50ms. Polecenie INITiate inicjalizuje podsystem wyzwalania. Proces zbierania wszystkich danych trwa około: T = 100 * ( 100ms + 50 ms) * 10 = 150ms * 1000 = 150sekund Komplet danych jest dostępny dopiero po upływie 2.5 minut. Jeśli polecenie INITiate jest poleceniem sekwencyjnym wówczas przez ten okres czasu urządzenie jest niedostępne (głuche). Jeśli polecenie INITiate jest poleceniem nakładkowym to w czasie jego realizacji można pozyskiwać z urządzenia inne dane, między innymi dowiedzieć się czy proces zbierania danych już się zakończył. Jeśli czas realizacji polecenia jest relatywnie długi wówczas polecenie powinno mieć charakter nakładkowy.
Synchronizacja programu z działaniem urządzenia : Polecenie MEAS? realizuje pomiar pewnej wielkości . Czas pomiaru jest duży około 100sek. Fragment programu inicjujący pomiar i odczyt wyniku to w najprostszej postaci sekwencja instrukcji viPrintf i viScanf lub viWrite i viRead. Jeśli Tpom>timeout operacji I/O wówczas powyższa sekwencja instrukcji nigdy nie wykona się poprawnie. Wystąpi błąd ‘timeout viRead’. Można ustawić ‘timeout ‘ o odpowiednio dużej wartości , ale wtedy program wchodzi w realizację funkcji viRead i jest również zajęty (głuchy) przez tak długi okres czasu. Aby uniknąć takich sytuacji należy przed wywołaniem operacji odczytu sprawdzić gotowość odpowiedzi i odczyt realizować gdy jest gotowa odpowiedź.
Synchronizacja : .......................... viPrintf(vi, ”MEAS?\n”); do { viReadSTB (vi, &stb); } while (!(stb & 0x10)); // bit MAV viScanf(vi, ”%t”, buffor); ..........
Polecenia synchronizacji : • *WAI - czekaj na zakończenie zainicjalizowanych wcześniej poleceń nakładkowych; • *OPC - uaktywnia ustawienie bitu wykonania poleceń w standardowym rejestrze zdarzeń; • *OPC? - wstaw znak '1' ASCII do kolejki wyjściowej po wykonaniu wcześniej zainicjalizowanych poleceń.
Przykład wykorzystania bitu OPC : Ustawienie podsystemu TRIGger: TRIGger:Source IMM TRIGger:COUNt 100 TRIGger:Delay 0.1 SAMPle:COUNt 10 .......................... viPrintf(vi, ”*CLS; *ESE 1; INIT;*OPC\n”); do { viReadSTB (vi, &stb); } while (!(stb & 0x20)); viPrintf(vi, ”FETCH?\n”); viScanf(vi, ”%t”, buffor);
Przykład wykorzystania bitu OPC : Ustawienie podsystemu TRIGger: TRIGger:Source IMM TRIGger:COUNt 100 TRIGger:Delay 0.1 SAMPle:COUNt 10 .......................... viPrintf(vi, ”*CLS; INIT;*OPC\n”); do { viPrintf(vi, ”*ESR?\n”); viScanf (vi, ”%t”, buf); } while (!(atoi(buf) & 0x01)) viPrintf(vi, ”FETCH?\n”); viRead(vi, buffor); ?
Przykład wykorzystania polecenia *OPC? : Ustawienie podsystemu TRIGger: TRIGger:Source IMM TRIGger:COUNt 100 TRIGger:Delay 0.1 SAMPle:COUNt 10 .......................... viPrintf(vi, ”*CLS; *ESE 0; INIT; *OPC? \n”); do { viReadSTB (vi, &stb); } while (!(stb & 0x10)); viScanf(vi, ”%t”, buffor); // odczyt odpowiedzi na zapytanie *OPC? viPrintf(vi, ”FETCH?\n”); viScanf(vi, ”%t”, buffor);