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