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

Einbindung einer C-Bibliothek in Matlab/Simmechanics

 

pcm

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2015, 12:35     Titel: Einbindung einer C-Bibliothek in Matlab/Simmechanics
  Antworten mit Zitat      
Hallo Leute,

ich habe mal eine sehr wichtige Frage bzgl. der Einbindung einer C-Bibliothek zur Berechnung von Kontakt in einer Mehrkörpersimulation.

Den Code habe ich vom Autor von hier bekommen: www.pcm.hippmann.org
(ursprünglich für die Verwendung in Simpack entwickelt)

Im Anhang findet ihr die Struktur, wie die Bibliothek funktioniert/arbeitet.

Nun vielleicht erstmal kurz was zum Hintergrund meiner Frage:
Ich will diese Bibliothek in Matlab/Simmechanics verwenden, so wie ich das bisher gelesen/studiert habe kann man Kontakt in Simmechanics nur mit dem Messen von Abständen und dem Aufbringen von Penalty-Kräften simulieren, dafür gibt es sehr anschaulich ja auch das Beispiel: mech_bouncing_ball

Im Grunde will ich genau dasselbe Ergebnis erzielen, nur dass innerhalb des Blocks "Contact force" entsprechend Manipulationen nach dem PCM-Modell vorgenommen werden, später sollen als Kontaktpartner Geometrien komplexer Oberflächen im STL-Format verwendet werden. Dafür eignet sich diese Bibliothek besonders.

PCM bietet nun für unterschiedliche Mehrkörpersimulations-Codes (MBS) drei Interfaceroutinen an, die wiederum sehr viele andere Unterroutinen aufrufen (siehe calltree.txt und readme.txt).

Mein erster Ansatz lag nun darin, über die MEX file creation API in Matlab diese drei Routinen in Matlab einzubinden und dann in Simulink/Simmechanics mit einem "user defined function" Block aufrufen zu können. Zum Umsetzen der ersten Interfaceroutine zum Definieren des Kontakts (pcm_defcont) habe ich folgenden Befehl benutzt:
mex call_pcm_defcont.c pcm_defcont.c pcm_addcont.c pcm_addcosu.c pcm_cosupre.c pcm_calcsgeo.c pcm_creabvtr.c pcm_creadcel.c pcm_root.c pcm_print.c pcm_mathlib.c pcm_centsort.c

In derselben Art und Weise hab ich dann auch die anderen beiden Routinen (pcm_calcont und pcm_freemem) umgesetzt.

Hier kommt aber mein Problem: es scheint mir so, als wenn die Unterfunktionen in diesen Schnittstellen gar nicht aufgerufen werden, denn wenn ich "falsche" Eingabewerte benutze, d.h. Werte die normalerweise Fehler triggern sollten, werden diese Funktionen trotzdem anstandlos ausgeführt ohne einen Hinweis auf Fehler. Zudem sieht es sogar so aus, als wenn überhaupt gar nichts gerechnet wird.

Lange Rede, kurzer Sinn: Was muss ich tun wenn ich die MEX-Funktionalität nutze, wenn der C-Code in viele einzelne Quelldateien zerlegt ist (siehe files.txt) und die Schnittstellenroutinen für die Mehrkörpersimulation viele Unterfunktionen aufrufen, um ausgeführt zu werden ? Gibt es an der Stelle noch andere Möglichkeiten, die ich bisher nicht erwähnt / in Betracht gezogen habe ?

Ich weis u.a. auch, dass es möglich ist, C-Code über "S-Funktionen" in Simulink zu benutzen. Was ich aktuell habe ist eine aufrufbare mex Version der drei Interfaceroutinen die ich über einen "Matlab-Funktions"-Block im Simulink/Simmechanics-Modell aufrufe. Welche Unterschiede gibt es da ganz grundsätzlich zwischen diesen beiden Herangehensweisen ? (am Ende sollte ja eigentlich dasselbe bei rum kommen ?!?)

Vielleicht zum Schluss noch ein wenig mehr Hintergrundinfos zu meinem Anliegen und was ich mir dabei gedacht habe:
Das Projekt, an dem ich arbeite, soll es mir möglich machen, dass PCM Kontaktmodell bzw. die Bibliothek dazu in Matlab/Simmechanics zu verwenden. Meine Vorstellung ist es die Routine pcm_defcont.c als eine Art Initialisierungsprozess/-funktion zu benutzen, pcm_calcont.c in jedem Zeitschritt der Simulation mit Hilfe eines user defined Blocks die Kontaktkräfte zu bestimmen und am Ende der Simulation mit pcm_freemem.c den Speicher wieder freizugeben.

Über Anmerkungen und Anregungen, wie ich das Problem am besten angehen könnte, würde ich mich sehr freuen!

Grüße

files.txt
 Beschreibung:

Download
 Dateiname:  files.txt
 Dateigröße:  1.67 KB
 Heruntergeladen:  593 mal
readme.txt
 Beschreibung:

Download
 Dateiname:  readme.txt
 Dateigröße:  15.81 KB
 Heruntergeladen:  726 mal
calltree.txt
 Beschreibung:

Download
 Dateiname:  calltree.txt
 Dateigröße:  4.02 KB
 Heruntergeladen:  515 mal


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 - 2025 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.