WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Funktion aus DLL verwenden

 

Philipp68
Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 22.01.2020, 15:24     Titel: Funktion aus DLL verwenden
  Antworten mit Zitat      
Hallo zusammen,

die Arbeit mit DLLs und den in darin enthalten Funktionen ist für mich ein komplett neues Thema und ich würde gerne wissen wollen, ob dies mit Matlab möglich ist bzw. diese Funktionen zu verwenden und besonders wie dies funktioniert.

Kurz etwas zum Thema, ich arbeite mit meinem Digital Micromirror Device der Firma Vialux und soll damit zeitlich und räumlich freikonfigurierbare Muster, die an ein Objekt projiziert werden, erstellen.

Bisher habe ich die dll. und h. in Matlab geladen.
Code:

loadlibrary('alp4395.dll', 'alp.h');

libfunc = libfunctions('alp4395');
 


Mir wird im Workspace nun ein 27x1 cell mit den enthaltenen Funktionen angezeigt. Und nun weiß ich nicht, wie ich diese verwenden kann.
Ich habe für mehr Infos mal ein PDF angehängt, in dem diese Funktionen beschrieben werden.

Ich bin für jede Hilfe und Tipps dankbar!

Beste Grüße

ALP-4.3 API description.pdf
 Beschreibung:
DLL Funktionen

Download
 Dateiname:  ALP-4.3 API description.pdf
 Dateigröße:  1.42 MB
 Heruntergeladen:  2060 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.01.2020, 15:38     Titel:
  Antworten mit Zitat      
Hallo,

mit calllib .

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Philipp68
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 22.01.2020, 15:50     Titel:
  Antworten mit Zitat      
Hallo Harald,

genau "calllib" habe ich eben auch gefunden.

Aber wie genau würde es laut Syntax aussehen?

Ein Beispiel, ich habe aus der Info vom Hersteller folgendes:

"long AlpDevAlloc (long DeviceNum, long InitFlag, ALP_ID *DeviceIdPtr)"

Sagen wir, ich möchte erstmal nur "DeviceNum". In der Doku steht dafür als Parameter "ALP_DEFAULT" - the next available system is allocated.

Würde es dann in Matlab aussehen?
In der Zelle steht die Funktion "AlpDevAlloc".

Code:

func1 = calllib('alp4395',libfunc{1,1},'DeviceNum','ALP_DEFAULT');
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.01.2020, 16:04     Titel:
  Antworten mit Zitat      
Hallo,

wie würdest du die Funktion aus C heraus aufrufen?
Der Aufruf aus MATLAB heraus lässt sich direkt übertragen.

Insbesondere will die Funktion drei Eingabeargumente, und du musst deren Werte angeben.
Code:
result = calllib('alp4395',libfunc{1,1},'ALP_DEFAULT', InitFlag, DeviceIdPtr);
 


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Philipp68
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 22.01.2020, 16:17     Titel:
  Antworten mit Zitat      
Wie ich es in C aufrufen würde weiß nicht, weil ich damit noch nichts geschrieben habe. Aber vllt wäre es nicht schlecht, es sich dort mal anzuschauen.

Ich habe 3 Parameter, also auch 3 Ausgaben.

Code:

[res1, res2, res3] = calllib('alp4395',libfunc{1,1},DeviceNum, InitFlag, DeviceIdPtr);
 


Für
DeviceNum = ALP_Default
InitFlag = ALP_Default
DeviceIDPetr = "specifies the address of the variable in which to write the ALP device
identifier." ?

Also umgesetzt, dann so:

Code:

[res1, res2, res3] = calllib('alp4395',libfunc{1,1},'ALP_Default', 'ALP_Default', DeviceIdPtr);
 


Oder verstehe ich das falsch?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.01.2020, 16:25     Titel:
  Antworten mit Zitat      
Hallo,

ja, aber du musst eben angeben, was dieser DeviceIdPtr sein soll. Vielleicht muss dazu vorher eine andere Funktion aufgerufen werden.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Philipp68
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 22.01.2020, 16:34     Titel:
  Antworten mit Zitat      
Alles klar, vielen Dank bis hierher! Smile

Alle Funktionen geben einen 4-byte integer value zurück.
Bei DeviceIdPtr (pointer to a writable 4-byte integer)
Private Nachricht senden Benutzer-Profile anzeigen
 
Philipp68
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 23.01.2020, 18:19     Titel:
  Antworten mit Zitat      
Ich habe mir den letzten Ausdruck nochmal genau angesehen "ALP_ID *DeviceIdPtr".
So ganz blicke ich noch nicht durch, nur das es sich um einen Pointer handelt, also eine Variable die die Speicheradresse als seinen Wert abspeichert. Und in meinem Fall muss das ein 4 byte integer value sein (So steht es in der Doc).

Code:

DeviceIdPtr = libpointer ('type', value);

% DeviceIdPtr = Pointer Variable
% type = int32
% value = ?
 


Als Value wird in einem Beispiel eine Matrix, die angegeben ist, verwendet.
Was muss ich nun für Value und ALP_ID machen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.01.2020, 18:28     Titel:
  Antworten mit Zitat      
Hallo,

offen gesagt keine Ahnung. Wie gesagt:
Zitat:
Vielleicht muss dazu vorher eine andere Funktion aufgerufen werden.

... die quasi erst mal die Verbindung zum Gerät herstellt und diesen Pointer zurückliefert.

Hast du denn ein komplettes Beispiel in C, wie man diese Bibliothek verwenden soll?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Philipp68
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 23.01.2020, 18:42     Titel:
  Antworten mit Zitat      
Leider habe ich kein Beispiel wie man das verwenden soll. Das einzige, was mir als Information vorliegt, ist das im ersten Beitrag beigelegte PDF.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.01.2020, 19:08     Titel:
  Antworten mit Zitat      
Hallo,

ich habe mal kurz gegoogelt und das gefunden:
https://de.mathworks.com/matlabcentral/fileexchange/46673-alptool

Falls das den selben Zweck erfüllt, dürfte es in der Anwendung deutlich einfacher sein.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Philipp68
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 27.01.2020, 12:30     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine Mühe, dieses Programm wurde vom Hersteller mitgeschickt. Ich habe auch schon angefangen mir es durchzulesen, um nachzuvollziehen wie es gehen kann. Mein Betreuer möchte nur andere Dinge, die hier nicht umgesetzt werden. Bei Unklarheiten werde ich mich zurückmelden und vllt kannst du oder jemand anderes mir dann weiterhelfen. Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Philipp68
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 27.01.2020, 16:49     Titel:
  Antworten mit Zitat      
Ich habe nun folgendes:

Code:

ALP_ID = libpointer('uint32'); %uint32, Argument [ulongPtr]
DeviceNum = 'ALP_DEFAULT';
InitFlag = 'ALP_DEFAULT';
calllib('alp4395','AlpDevAlloc',DeviceNum,InitFlag,ALP_ID); %Return Type [long, ulongPtr] Arguments [long, long, ulongPtr]
get(ALP_ID,'Value');
 


Bekomme nun den Fehler "Error using calllib. Parameter must be scalar." Sonst wurde in "calllib" alles angenommen, die Inputs müssen als String stehen. Es hängt wohl nur noch an dem Pointer bzw ALP_ID. Jemand anderes hat mir das hier vorgeschlagen:

Code:

ptr = libpointer(DataType); % e.g. DataType = 'int32'
DeviceNum = 1;
InitFlag = 1;
[res1, res2, res3] = calllib('alp4395','AlpDevAlloc',DeviceNum,InitFlag,ptr);
 


Jedoch kam hier "No method with matching signature.".

Als Anhaltspunkt habe ich das im FileExchange m.-File gefunden.
Code:

% prepare pointer to ALP_ID (uint32) for 3rd parameter
deviceid = uint32(0);
deviceidptr = libpointer('uint32Ptr', deviceid);
% call DLL function
[alp_returnvalue, deviceid] = calllib(obj.libalias, 'AlpDevAlloc',devicenumber, initflag, deviceidptr);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Philipp68
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 29.01.2020, 18:19     Titel:
  Antworten mit Zitat      
Hallo,
ich melde mich zurück und es scheint nun zu gehen Smile
Will hier nochmal alles zeigen zur Vollständigkeit und falls das nochmal jemand gebrauchen kann. Mir wird bei jeder execution eine neue ALP_ID im Workspace angezeigt, kann sowas Absicht sein bei der Ausführung der DLL Funktion, dass jedes mal eine neue ID generiert wird?

Soll ich bei Fragen von weiteren Funktionen diese hier wieder reinstellen oder besser eine neue Frage stellen?

Code:

clearvars

%% Load Library

loadlibrary('alp4395.dll', 'alp.h');

libfunc = libfunctions('alp4395');


%% AlpDevAlloc

deviceid = uint32(0);

ALP_ID = libpointer('uint32Ptr', deviceid); %Pointer
DeviceNum = int32(0); %Konstante
InitFlag = int32(0); %Konstante

[alp_returnvalue, ALP_ID] = calllib('alp4395','AlpDevAlloc',DeviceNum,InitFlag,ALP_ID);



%% AlpDevFree

calllib('alp4395','AlpDevFree',ALP_ID); %Release Device

%% Unload Library

unloadlibrary('alp4395');
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.01.2020, 18:50     Titel:
  Antworten mit Zitat      
Hallo,

Glückwunsch :)

Zitat:
kann sowas Absicht sein bei der Ausführung der DLL Funktion, dass jedes mal eine neue ID generiert wird?

Meine Vermutung wäre: Absicht. Ansonsten würde die Library das nicht zurückgeben. Letztlich muss man das aber den Autor der Library fragen. Oder mal spaßeshalber ausprobieren was passiert, wenn man an AlpDevFree die ursprüngliche ID übergibt.

Fragen, die hiermit nicht direkt zu tun haben, bitte in ein neues Thema.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.