Własne Sterowniki do Matlab

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 samemu napisać sterownik własnego urządzenia – co daje większe możliwości w dostosowaniu metody do potrzeb, nie wymaga też żadnych dodatkowych licencji.

Typ: Otwarty
Status: Zakończony

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

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ń inerpretera. W większkoś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

Otwieranie biblioteki

Aby mieć dostęp do danych zawartych w bibliotece, należy ją wczytać poleceniem:

loadlibrary('nazwa_biblioteki', 'nazwa_pliku_naglowkowego')

,gdzie:
nazwa_biblioteki – to nazwa pliku z biblioteką dynamiczną (so/dll), w której zawarte są interesujące nas funkcje.
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:

unloadlibrary nazwa_biblioteki

Zawartość biblioteki – funkcje składowe

Aby wyświetlić funkcje zawarte w bibliotece należy wykonać polecenie:
libfunctions(‘nazwa_biblioteki’) – wynikiem jest tablica tekstowa z nazwami funkcji
libfunctionsview(‘nazwa_biblioteki’) – nazwy funkcji wyświetlone są w tabelce w nowym oknie
Do wspomnianych funkcji można dodać przełącznik “-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:

calllib('nazwa_biblioteki', 'nazwa_funkcji', arg1, ..., argN)

,gdzie
nazwa_biblioteki – to nazwa otwartej uprzednio biblioteki
nazwa_funkcji – to nazwa interesującej nas funkcji
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

Artykuł zamieszczony jest również na stronie Studenckiego Koła Naukowego Cybernetyki PW: http://cyber.ise.pw.edu.pl Projekt jest częścią mojej pracy dyplomowej, oraz tematem obranym na przedmiocie “Matlab w Zaawansowanych Metodach Obliczeniowych”, który to przedmiot studentom PW EiTI szczerze polecam :-)