Posted by: Tomasz CEDRO | 13/01/2013

Własne sterowniki w Matlab

Matlab jest jednym z najpotężniejszych komputerowych narzędzi obliczeniowych stosowanych we współczesnej szeroko rozumianej nauce i inżynierii. Poza prostotą użycia oferuje nieskończone możliwości rozbudowy za pomocą tzw. toolbox’ów. Matlab może być wykorzystany w niemal każdej dziedzinie nauki, nam jednak przyda się do budowania i weryfikacji teoretycznych modeli opisujących rzeczywiste zjawiska, głównie związanych z sygnałami EEG. Aby jednak to było możliwe musimy nauczyć się pozyskiwać dane z fizycznych urządzeń do wirtualnego świata Matlaba, czy to za pomocą istniejących już narzędzi, czy raczej własnych sterowników i programów. Celem tego projektu jest rozpoznanie dostępnych juz metod pozyckiwania danych, ich rozbudowy lub tworzenia alternatywnych rozwiązań.

Warto również wspomnieć, że Matlab nie jest jedynym programem służącym do modelowania matematycznego — dostępne są również jego darmowe odpowiedniki Open–Source jak Octave czy SciLab – choć nie tak potężne i bogate w możliwości rozbudowy, stanowią dobrą podstawę do legalnej pracy badawczej, a ninejszy opis odnosi się również to tych programów. Nie każdy może pozwolić sobie na zakup bardzo drogiej oryginalnej licencji, dodatkowych modułów programowych i sprzętowych do własnych badań. Jak się zresztą okaże, takie drogie i komercyjne rozwiązanie nie zawsze są rozwiązaniem problemu badawczego – a w tym konkretnym przypadku jest to konstrukcja własnego systemu pomiarowego i weryfikacji jego pomiarów, a także dalsza obróbka danych.

Data Acquision Toolbox

Data Acquision Toolbox jest zestawem narzędzi do transferu danych z przyrządów pomiarowych. Niestety działa tylko pod windows, jako że bazuja na COM i ATL.

Bardzo dobrym dokumentem dla developerów chcących napisać sterownik dla własnego urządzenia jest dokument Data Acquision Toolbox Adaptor Kit User’s Guide.

Instrument Control Toolbox

Instrument Control Toolbox zapewnia komunikację z urzadzeniami pomiarowymi, głównie po magistrali GPIB (IEE-488/IEC-625), VISA, TCP/IP. Pozwala sterować urządzeniami pomiarowymi. Pozwala wysyłać oraz odbierać dane binarne oraz tekstowe, synchronicznie oraz blokowo. Zapewniony zestaw m-funkcji użytkownika wykorzystuje do wymiany danych adaptery (Interface Driver Adaptors), a te z kolei bazują na zewnętrznych sterownikach sprzętu dostarczonych przez producenta danego urządzenia. Umożliwia komunikację/sterowanie na poziomie pojedyńczych funkcji/instrukcji oraz bardziej automatycznych obiektow (Interface Objects) posiadających odpowiednie atrybuty, działających zdarzeniowo.

Warstwę komunikacyjną tworzą adaptery (Intreface Driver Adaptors) dostarczające dane do m-funkcji użytkownika. Adaptery do komunikacji z urządzeniami wykorzystują sterowniki (drivery). Pełną listę adapterów oraz sterowników obsługiwanych przez system, wraz z dodatkowymi informacjami można uzyskać wywołując komendę {\tt instrhwinfo}. W standardzie dostępne są następujące adaptery:

  • GPIB
  • Serial (port) (także Linux)
  • TCP/IP (także Linux)
  • UDP (także Linux)
  • VISA

Obsługiwane są dwa typy sterowników:

  • VXIplug\&play Drivers (instrhwinfo visa)
  • IVI Drivers (instrhwinfo ivi)

Matlab Instrument pełni rolę ,,tłumacza”. Pozwala na pewną translację danych odbieranych oraz wysyłanych do urządzenia i jest włączany pomiędzy zestaw funkcji dostępnych użytkownikowi a funkcje komunikacyjne urządzenia. Można wykorzystac ‘Instrument Driver Editor’ do tworzenia Driverów o podobnej strukturze działania w przypadku gdy potrzebujemy sterownika podobnego do istniejącego już rozwiązania.

Instrument Control Toolbox nie zapewnia sterowników do urządzeń poza standardem obsługiwanych magistral. Nie ma także frameworku ani instrukcji umożliwiajacych dodawanie własnych sterowników.

Własne sterowniki

Powstaje pytanie czy można dowolnie rozbudować środowisko o własne sterowniki własnego urządzenia, które mogłoby pracować niezależnie od platrofmy na której uruchamiany jest Matlab? Odpowiedź jest oczywiście twierdząca 🙂

Jak stworzyć własny sterownik urządzenia w Matlabie?

Tworząc nowe urządzenia czy systemy o dużym stopniu zaawansowania, musimy posiadać mechanizm weryfikacji wyników, którym może być MATLAB. Aby przesyłać dane do matlaba, można wykorzystać gotowe toolbox’y które obsługują jedynie standardowy sprzęt lub napisać własny sterownik – co daje większe możliwości w dostosowaniu metody do potrzeb, nie wymaga też żadnych dodatkowych licencji.

Matlab nie tylko potrafi generować kod wykonywalny na podstawie swoich m-plików (toolbox compiler), ale również wykorzystywać zewnętrzne programy czy biblioteki (o czym można poczytać w dziale ,,External Interfaces” podręcznika pomocy) do wykonywania potrzebnych operacji. Niemalże nieograniczone możliwości wymiany danych oraz sterowania zewnętrznymi aplikacjami dają:

  • obsługa zewnętrznych bibliotek dynamicznych (so/dll)
  • wywoływanie zewnętrznych procedur języka C lub Fortran z poziomu plików MEX
  • tworzenie od podstaw własnych plików MEX w języku C lub Fortran
  • eksportowanie/importowanie danych przy użyciu plików MAT
  • wykorzystywanie elementów składowych matlaba w programach C lub Java

Konstruktorów interesuje głównie stworzenie zestawu funkcji umożliwiających konfigurację oraz wymianę danych z urzadzeniem, co można rozwiązać na dwa sposoby – plik MEX (dedykowany jedynie dla matlaba) lub bibliotekę dynamiczną. MEX to zestaw dynamicznie linkowanych procedur, stworzonych w języku C lub Fortran, które mogą być wywołane bezpośrednio w wiersza poleceń interpretera matlaba. Stworzenie biblioteki dynamicznej daje możliwość wykorzystania jej również w innych programach – jest to bardziej uniwersalne a wiec preferowane ,,opakowanie” naszej funkcjonalności. Dokładny opis znajduje się w dziale ,,MATLAB Interface to Generic DLLs” podręcznika pomocy.

Interfejs matlaba do bibliotek dynamicznych

Funkcje umieszczone w bibliotekach dynamicznych mogą być załadowane do pamięci matlaba i stać się bezpośrednio dostępne z wiersza poleceń interpretera. W większości przypadków konwersja typów odbywa się automatycznie (na format matlaba). Można również używać bibliotek dynamicznych stworzonych w innych językach niż C, ale interfejs biblioteki musi być zgodny z językiem C.

Obsługa bibliotek dynamicznych

Otwieranie biblioteki: Aby mieć dostęp do danych zawartych w bibliotece, należy ją wczytać poleceniem {\tt loadlibrary(‘nazwa\_biblioteki’, ‘nazwa\_pliku\_naglowkowego’)}, gdzie: {\tt nazwa\_biblioteki} to nazwa pliku z biblioteką dynamiczną (so/dll), w której zawarte są interesujące nas funkcje, {\tt nazwa\_pliku\_naglowkowego} to nazwa wymaganego pliku nagłówkowego zawierającego prototypy funkcji zawartych w bibliotece.

Zamykanie biblioteki: Aby zamknąć wczytaną uprzednio bibliotekę należy wykonać polecenie {\tt unloadlibrary nazwa\_biblioteki}.

Zawartość biblioteki i jej funkcje składowe: Aby wyświetlić funkcje zawarte w bibliotece należy wykonać polecenie {\tt libfunctions(‘nazwa\_biblioteki’)}. Wynikiem jest tablica tekstowa z nazwami funkcji, {\tt libfunctionsview(‘nazwa\_biblioteki’)} to nazwy funkcji wyświetlone są w tabelce w nowym oknie.
Do wspomnianych funkcji można dodać przełącznik {\tt -full}, który wyświeli dodatkowe informacje o funkcjach, na przykład ich parametry wraz z typami danych.

Wywoływanie funkcji: Do wykonywania funkcji bibliotecznych służy funkcja {\tt calllib(‘nazwa\_biblioteki’, ‘nazwa\_funkcji’, arg1, …, argN)}, gdzie {\tt nazwa\_biblioteki} to nazwa otwartej uprzednio biblioteki, {\tt nazwa\_funkcji} to nazwa interesującej nas funkcji, {\tt arg1,..,argN} to lista parametrów funkcji. Pełną specyfikację funkcji można znaleźć w podręczniku pomocy.

Przykład

Przykład składa się z trzech funkcji. Dwie z nich zwracają łancuch znaków tekstowych jako wynik wykonania, a trzecia służy do dodawania dwóch liczb. Funkcje te mogą łatwo zostać zastąpione zestawem instrukcji sterujących rozwijanym urządzeniem.

Plik nagłowkowy test.h:

char* test();
char* test2();
int test_add(int a, int b);

Plik źródłowy test.c:

#include “test.h”
char* test(){
return “test function 1 result\n”;
}

char* test2(){
return “test function 2 result\n”;
}

int test_add(int a, int b){
return a+b;
}

Kompilacja:

gcc -shared -o test.so test.c

Uruchomienie w matlabie:

Zmieniamy aktualny katalog na ten, w którym znajduje się nasza skompilowana biblioteka, a następnie wykonujemy:

>> loadlibrary test.so test.h
>> calllib(‘test’, ‘test’)

ans =
test function 1 result

>> calllib(‘test’, ‘test2’)

ans =
test function 2 result

>> calllib(‘test’, ‘test_add’)
??? Error using ==> calllib
No method with matching signature.

>> calllib(‘test’, ‘test_add’, 1, 2)

ans =
3

>> unloadlibrary test

Podsumowanie

Przedstawiona metodologia stwarza możliwość opracowania, realizacji i weryfikacji wybranego modelu matematycznego w bardziej zaawansowanych pracach nad Brain Computer Interface, ale także szeroko pojętym modelowaniem matematycznym i przetwarzaniem sygnałów (niekoniecznie biologicznych) pochodzących z urządzeń własnej konstrukcji. Rozwiązanie zwalnia z obowiązku zakupu kosztownej aparatury pomiarowej i licencji programowych dramatycznie redukując koszty badań. Co więcej, zastosowanie otwartych narzędzi OpenSource, kosztem nieco większego nakładu pracy i czasu, daje dokładną kontrolę nad tworzonym rozwiązaniem, wymusza znajomość szczegółów. W rezultacie powstaje kompletne i spójne rozwiązanie bardziej świadomego konstruktora i badacza aniżeli jest to w przypadku rozwiązań typu ,,kliknij-i-zapomnij”.


Categories