ŚRODOWISKO PROGRAMOWE LabWindows / CVI

Transkrypt

ŚRODOWISKO PROGRAMOWE LabWindows / CVI
LABORATORIUM SYSTEMÓW POMIAROWYCH
KTP
IR
PW
ŚRODOWISKO PROGRAMOWE
LabWindows / CVI
(materiały pomocnicze do ćwiczenia 4)
Opracował:
mgr inż. Ryszard Leoniak
Warszawa 1996
1. Cel ćwiczenia.
Celem ćwiczenia jest praktyczne zapoznanie się z nowoczesnymi urządzeniami pomiarowymi i
oprogramowaniem służącym do budowy komputerowych systemów pomiarowych w standardzie
IEC-625.2. Wykonanie ćwiczenia polega na zaprogramowaniu prostego zadania pomiarowego w
systemie składającym się z kontrolera (komputer PC z zainstalowanym pakietem interfejsu NI-488.2
firmy National Instruments wraz z pakietem oprogramowania LabWindows/CVI pracującym w
środowisku Windows) oraz multimetru firmy Hewlett Packard.
2. Ogólna charakterystyka pakietu LabWindows/CVI.
Pakiet wspomagania projektowania komputerowych systemów pomiarowych LabWindows/CVI
firmy National Instruments stanowi zmodyfikowane rozszerzenie analogicznej aplikacji pracującej
pod systemem operacyjnym DOS. Zaimplementowany jest on jednak całkowicie w środowisku
graficznym MS Windows i łączy w sobie zarówno cechy poprzednika - wymóg kompatybilności - jak
i możliwości, które zapewnia nowy interfejs graficzny oraz środowisko wielozadaniowe. Jest to
typowy wielomodułowy pakiet projektowo-uruchomieniowy służący do tworzenia systemów
pomiarowych, w których rolę kontrolera odgrywa komputer osobisty PC.
Struktura takiego systemu pomiarowego jest typowa. W skład systemu wchodzi kontroler
wyposażony w program zapewniający prawidłową pracę systemu, realizację postawionego zadania i
sterowanie procesami. Kontroler współpracuje z zestawem różnorodnych urządzeń zewnętrznych
poprzez interfejsy. Mogą one stanowić integralny element urządzeń pomiarowych lub być
zrealizowane w postaci oddzielnych bloków czy kart rozszerzających. Topologia tak
zaprojektowanych systemów pomiarowych jest standardowa, najczęściej typu magistralowego. Jako
przykład można podać magistralę i protokół komunikacji w standardzie IEEE 488.2. Wszystkie
urządzenia dołączone są równolegle do magistrali systemowej, po której rozsyłane są przez
kontroler instrukcje programujące, dane pomiarowe, sygnały sterujące. W celu prawidłowej pracy,
każde urządzenie peryferyjne ma przypisany unikalny adres, zapewniający bezbłędną identyfikację.
Środowisko projektowe
LabWindows CVI
Komputer PC
jako kontroler systemu
karta interface-u
GPIB 488.2.
Magistrala systemowa
Multimetr
HP34401A
Generator
HP33120A
Rys. 1. Schemat blokowy komputerowego systemu pomiarowego z wykorzystaniem środowiska
LabWindows/CVI.
Skonfigurowanie i uruchomienie systemu pomiarowego jest czynnością niełatwą, wymagającą
niejednokrotnie wielu prób i czasu. Aby zaradzić tym niedogodnościom, obecnie powstaje coraz
więcej rozwiązań programowych narzędzi wspomagania projektowania systemów pomiarowych.
2
Celem niniejszego opracowania jest przedstawienie metodyki działania i wykorzystania jednej z
takich aplikacji.
Wymagania sprzętowe dla pakietu LabWindows/CVI:
• komputer sterujący zgodny z IBM PC z procesorem 80386SX25 (zaleca się jednak stosowanie
procesorów nowszych conajmniej o jedną generację),
• koprocesor matematyczny (floating point unit) dla procesorów 80386 lub 80486SX,
• karta graficzna VGA,
• 8MB pamięci RAM (zalecane więcej z powodów opisanych w ostatniej sekcji),
• system operacyjny MS DOS conajmniej wersja 3.1,
• środowisko graficzne MS Windows 3.1,
• wolne około 20MB pamięci na dysku HDD,
• mysz współpracująca z MS Windows,
Własności pakietu LabWindows/CVI:
• obiektowo-zdarzeniowe podejście do programowania poprzez tworzenie obiektów
programowych - funkcji, będących odwzorowaniem obiektów fizycznych (tzn. elementów płyty
czołowej przyrządu i jego funkcji) i jednorodne ich potraktowanie razem z funkcjami
systemowymi jako ‘czarnych skrzynek’, które na zewnątrz są reprezentowane przez pola
określające sposób ich działania,
• wyświetlanie płyt czołowych przyrządu na ekranie monitora oraz możliwość ich edycji i tworzenia
nowych płyt (graficzny panel przyrządu pomiarowego jako wizualizacja przyporządkowania
manipulatorom i funkcjom przyrządu obiektów programowych),
• tworzenie panelu całego systemu pomiarowego w postaci zbioru paneli urządzeń lub zbioru
złożonych funkcji systemu realizowanych wspólnie przez wiele przyrządów,
• tworzenie własnych programów w języku C (edytor, uproszczona wersja kompilatora
wzbogacona o funkcje środowiska pomiarowego i debugger),
• wielopoziomowy system menu pomocny w realizacji wszystkich etapów projektowania systemu
pomiarowego - z menu wybiera się odpowiednie opcje, a z nich:
− wymagane symbole graficzne (np. przycisk) reprezentujące wirtualne obiekty na panelu - z
wprowadzeniem ich do panelu,
− funkcje systemowe (np. przetwarzanie danych) lub reprezentujące rzeczywiste funkcje
przyrządów (np. ustawianie zakresu) - z automatyczna generacja linii programu (począwszy
od wersji 3.1 systemu),
• rozbudowany zestaw kompleksowych procedur wspomagających zgrupowanych w bibliotekach:
funkcji formatujących, wejścia-wyjścia, interfejsu użytkownika, akwizycji i przetwarzania danych,
graficznej prezentacji wyników pomiarowych oraz funkcji sterujących różnymi typami
interfejsów,
• możliwość tworzenia wielopoziomowych, modyfikowalnych bibliotek funkcji przyrządów sterowników przyrządów,
• prosta procedura tworzenia aplikacji systemowej:
− zaprojektowanie graficznego panelu systemu pomiarowego - interfejsu użytkownika, jako
podstawy efektywnej pracy z systemem (poprzez wybór i ustalenie parametrów
potrzebnych na panelu i dostępnych w systemie obiektów, np. przycisków, przełączników,
pól tekstowych, itp.),
3
− począwszy od wersji 3.1 systemu generacja szkieletu programu odpowiadającego
stworzonemu panelowi; ponieważ programy w LabWindows/CVI sterowane są
zdarzeniami, więc struktura tego szkieletu to zbiór niezależnych funkcji odwołań (ang.
callback) przypisanych do wszystkich obiektów systemu - w przypadku uaktywnienia przez
użytkownika jakiegoś obiektu wykonywana jest przypisana do niego akcja, zestaw
instrukcji,
− uzupełnienie szkieletu programu oprogramowaniem reakcji systemu na uaktywnienie
poszczególnych obiektów w panelu, przy wykorzystaniu dwóch rodzajów bibliotek funkcji:
wbudowanych bibliotek wewnętrznych, zawierających funkcje przetwarzania danych,
obróbki matematycznej i statystycznej, prezentacji graficznej i sterowania systemem przy
użyciu różnych rodzajów interfejsów oraz bibliotek funkcji przyrządów pomiarowych gotowych lub stworzonych przez użytkownika,
− kompilacja kodu źródłowego i uruchomienie programu,
• możliwość generowania zbiorów wykonywalnych uruchamianych poza środowiskiem
LabWindows/CVI,
• dostępne wszystkie możliwości zaimplementowane w wersji środowiska dla MS DOS i prawie
pełna przenośność programów powstałych w LabWindows for DOS do LabWindows/CVI, z
wyjątkiem pewnych specyficznych odwołań systemowych oraz narzędzia do konwersji,
• rozbudowane biblioteki akwizycji, analizy i prezentacji danych wraz z międzyprocesową wymianą
danych (ang. DDE - dynamic data exchange),
• narzędzia do tworzenia sterowników przyrządów, grup przyrządów lub przyrządów wirtualnych
(bez odpowiedników fizycznych),
• programowanie tylko w języku C (ANSI C) ale z możliwością z korzystania z modułów
obiektowych, bibliotek DLL (ang. dynamic link libraries), bibliotek w C,
• automatyczna dynamiczna alokacja i dealokacja pamięci,
• wielozadaniowość,
• obsługiwane systemy interfejsów: IEC-625, RS232, VXI,
• współpraca z dowolnymi przyrządami sterowanymi jedną z powyższych magistral oraz z kartami
rozszerzającymi.
• kompatybilność z przyszłościowym standardem bibliotecznym do sterowania przyrządów z
interfejsem VXI, IEC-625, RS232 etc.
Struktura pakietu CVI.
Pakiet LabWindows/CVI można podzielić w sposób nieco arbitralny na kilka modułów. Przez
moduł należy rozumieć aplikację lub jej część realizującą określoną, łatwo rozróżnialną i
definiowalną funkcję.
1.
2.
3.
4.
5.
6.
7.
4
uproszczony menadżer projektu,
edytor kodu źródłowego służący do implementacji programu,
edytor paneli - konstrukcja i konfiguracja panelu urządzenia,
generator kodu - automatyczny pomost pomiędzy powyższymi aplikacjami,
kompilator kodu i linker bibliotek,
prosty uruchamiacz (debugger) - podgląd zmiennych, struktur, itp.
przeglądarka komunikatów w procesach kompilacji, linkowania, uruchamiania projektu.
3. Realizacja projektu w środowisku LabWindows/CVI.
Etapy tworzenia nowego projektu:
1. Zaprojektowanie panelu urządzenia wraz ze wszystkimi niezbędnymi sterownikami
(przełączniki, wskaźniki, wyświetlacze, itp.). Skonfigurowanie panelu poprzez przypisanie
unikalnych identyfikatorów wszystkim sterownikom oraz jeśli konieczne zadeklarowanie funkcji
obsługi zdarzeń związanych z aktywacją sterowników. W czasie tworzenia panelu,
automatycznie zostaje utworzony i aktualizowany źródłowy plik nagłówkowy projektu. Zawiera
on definicje wszystkich identyfikatorów użytych w panelu oraz prototypy funkcji obsługi
zdarzeń. Plik ten nie powinien być ręcznie modyfikowany.
2. Wersja 3.1 LabWindows/CVI umożliwia automatyczne wygenerowanie szkieletu programu.
Zawiera on implementację głównej funkcji programu main{} wyświetlającej na ekranie panel
oraz wszystkie funkcje obsługi zdarzeń.
3. W przypadku wykorzystania generatora kodu, należy teraz uzupełnić pusty szkielet.
Implementacja programu zależy bezpośrednio od zadania, które ma być realizowane przez
system.
4. Ostatnim krokiem jest skompilowanie i zlinkowanie programu. Wszelkie błędy można
poprawiać wykorzystując uruchamiacz wyposażony w przeglądarkę zmiennych i struktur.
ETAP 1. Projektowanie panelu.
• W pierwszym kroku realizacji zadania należy założyć nowy projekt. W tym celu z
menu wybieramy File/New/Project (rys. 2).
Rys. 2. Zakładanie nowego projektu.
• Projektowanie panelu należy rozpocząć od wybrania opcji File/New/User Interface z
menu menadżera projektu. Po uruchomieniu edytora paneli tworzymy nowy panel
opcją Create/Panel i edytujemy panel opcją Edit/Panel (rys. 3). Wymiary nowego
panelu (i elementów na nim umieszczanych) można łatwo modyfikować przeciągając
za pomocą myszy odpowiednie krawędzie lub narożniki.
5
Rys. 3. Okno edycji panelu.
• Na pustym panelu należy umieścić potrzebne sterowniki (wyświetlacze numeryczne,
diody LED, przyciski, przełączniki, teksty) (rys. 4). Wciśnięcie prawego klawisza
myszy na panelu powoduje wyświetlenie się galerii dostępnych sterowników. Strzałki
przy niektórych opcjach menu informują o dodatkowej możliwości wyboru modelu
sterownika.
Rys. 4. Wstawianie nowego sterownika na panelu.
6
• Każdy sterownik musi zostać skonfigurowany, tak aby można było odwoływać się do
niego z wewnątrz programu. Dwukrotne kliknięcie na sterowniku powoduje
pojawienie się okna umożliwiającego ustawienie właściwości sterownika (rys. 5).
Każdy sterownik musi mieć unikalny identyfikator, dzięki któremu możliwa będzie
komunikacja między programem i sterownikiem (funkcje biblioteczne SetCtrlVal,
GetCtrlVal, itp.). Nazwa identyfikatora musi być wpisana w polu Constant Name.
Jeśli sterownik ma wysyłać komunikaty do programu, to należy ustawić pole Control
Mode na opcję ’Hot’. W przypadku, gdy sterownik jedynie odbiera komunikaty od
programu tryb ten powinien być ustawiony jako ‘Indicator’.
Rys. 5. Okno konfiguracyjne sterownika typu NUMERIC.
Każde użycie sterownika generuje zdarzenie, które może zostać obsłużone przez
program - wykonanie pewnego zestawu instrukcji. Aby program mógł obsłużyć
zdarzenie, musi zawierać w sobie funkcję za to odpowiedzialną. Funkcja taka znajdzie
się w ciele programu pod warunkiem, że zostanie zadeklarowana w polu Callback
Function. Dzięki takiej koncepcji program składa się jedynie z zestawu niezależnych
od siebie funkcji, z których każda obsługuje zdarzenie związane ze sterownikiem, do
którego jest przypisana. Jest to podejście charakterystyczne dla systemu Windows, w
którym wszystkie programy działają w oparciu o technikę obsługi zdarzeń.
Pozostałe atrybuty zależą od konkretnego sterownika i umożliwiają np. zmianę kroju
czcionki, koloru tła, tekstu opisującego funkcję sterownika, itp.
ETAP 2. Wygenerowanie szkieletu programu.
• Kolejnym krokiem jest wygenerowanie szkieletu programu na podstawie
utworzonego panelu (rys. 6). W tym celu należy wybrać opcję Code/Generate/All
Code z menu edytora panelu. Jak widać z powyższego rysunku można wybrać
generację całego kodu, tylko funkcji main{}, wszystkich lub części funkcji obsługi
zdarzeń. Są to opcje szczególnie przydatne po modyfikacji panelu (dodanie kilku
sterowników), gdy dokonujemy jedynie uaktualnienia już istniejącego kodu.
7
Rys. 6. Generowanie kodu źródłowego.
Poniżej przedstawiono wydruk pliku stworzonego automatycznie przez generator
kodu dla panelu przedstawionego na rys. 6. Zawiera on funkcje wyświetlające panel
przyrządu oraz implementacje funkcji obsługi zdarzeń generowanych przez sterowniki.
W nowo utworzonym szkielecie implementacje te są oczywiście puste (poza obsługą
sterownika powodującego zakończenie programu). Wypełnienie tych funkcji zależy od
zadania pomiarowego, jakie zostanie przewidziane dla danego panelu.
#include <userint.h>
#include "przyklad.h"
static int panelHandle;
void main ()
{
panelHandle = LoadPanel (0, "przyklad.uir", PANEL);
DisplayPanel (panelHandle);
RunUserInterface ();
}
int PomiarCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
break;
}
return 0;
}
int QuitCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
QuitUserInterface (0);
break;
}
return 0;
}
8
ETAP 3. Uzupełnienie szkieletu programu.
• Wygenerowany automatycznie kod zostaje wstawiony do edytora tekstu. Na tym etapie należy
zaimplementować kod programu realizujący konkretne zadanie pomiarowe. W praktyce pisanie
programu sprowadza się do umieszczenia odpowiednich zestawów instrukcji wewnątrz funkcji
obsługi zdarzeń (rys. 7).
Rys. 7. Edytor kodu źródłowego.
Jednym ze sposobów realizacji obsługi przyrządu jest skorzystanie z gotowego tzw. driver’a,
który należy wcześniej zainstalować za pomocą opcji Instrument/Load. Lista instrukcji
przyrządu dostępna jest po dwukrotnym kliknięciu na nazwie przyrządu w opcji Instrument. Po
wybraniu żądanej instrukcji i ustawieniu jej parametrów (rys. 8) daną instrukcję można przenieść
do edytora (w miejsce gdzie znajduje się kursor) za pomocą opcji Code/Insert Fuction Call.
Rys.8. Okno instrukcji konfigurującej drivera multimetru HP34401A.
9
Wybrane instrukcje drivera multimetru HP34401A przedstawiono poniżej:
hp34401a_init ( address, &instrumentID );
gdzie:
address - adres multimetru (22),
instrument ID - identyfikator multimetru (zmienna typu int).
Instrukcja powoduje inicjalizację multimetru w następujący sposób:
- Wysyła do przyrządu zapytanie identyfikacyjne.
- Ustawia nastawy przyrządu w zadane położenie.
- Zwraca wartość ID używane do identyfikacji urządzenia w systemie pomiarowym.
hp34401a_conf ( instrumentID, function, autorange, range, resolution );
gdzie:
instrument ID - identyfikator multimetru (zmienna typu int),
function - kod funkcji:
0 - woltomierz AC,
1 - woltomierz DC,
7 - częstościomierz.
autorange - automatyczna zmiana zakresu:
0 - wyłączona,
1 - włączona,
range -
zakres: częstościomierz - tylko jeden 300 kHz,
woltomierza DC - 0.1V, 1V, 10V, 100V, 1000V;
woltomierza AC - 0.1V, 1V, 10V, 100V, 750 V.
resolution - liczba cyfr wyniku: 0 - 4 1/2,
1 - 5 1/2,
2 - 6 1/2.
Instrukcja konfiguruje funkcję, zakres, liczbę cyfr wyniku oraz włącza bądź wyłącza
automatyczną zmianę zakresu.
hp34401a_single_meas ( instrumentID, &result );
gdzie:
instrument ID - identyfikator multimetru (zmienna typu int),
result - wynik pomiaru (zmienna typu double).
Instrukcja powoduje wykonanie pomiaru i zwraca jego wynik.
10
Poza instrukcjami sterującymi przyrządem należy użyć instrukcji odczytującej stan sterowników
bądź ustawiającej stan sterownika.
Do odczytu stanu (wartości) sterownika (przełącznika) należy użyć instrukcji GetCtrlVal (panelHandle, CONSTANT NAME panelu_CONSTANT NAME sterownika,
&zmienna);
a do ustawienia wyniku na wskaźniku lub stanu diody LED SetCtrlVal (panelHandle, CONSTANT NAME panelu_CONSTANT NAME sterownika, stała
lub zmienna);
Instrukcje te znajdują się w opcji Library/User Interface/Controls.../General Function.
Plik źródłowy i nagłówkowy oraz plik z panelem należy dołączyć do projektu (rys. 9), który w
dalszej fazie będzie można skompilować, zlinkować i uruchomić. Pliki dodaje się do projektu
wykorzystując opcję Edit/Add Files To Project.
Rys. 9. Menadżer projektu. Opcja Run/Project uruchamia projekt.
W przypadku błędnego działania programu istnieje możliwość wykorzystania debuggera,
zakładania breakpointów czy przeglądania wartości zmiennych.
11