|
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.
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 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 :-) |