Verfasst am: 20.09.2017, 13:35
Titel: Mex file für UDP-Verbindung
Hallo liebes Forum,
ich möchte gerne mithilfe von Matlab einen Industrieroboter steuern. Hierfür dient zwischen Roboter und dem Rechner für Matlab ein weiterer Rechner, auf dem ein C++ Programm, als Schnittstelle. Da das Programm zu langsam ist, wenn es mit Matlabcode läuft möchte ich gerne den Code als C/C++ Programm laufen lassen.
Beim bulding wird die Meldung angezeigt, dass das udp Objekt nicht supported wird, was die Konvertierung nach C/C++ angeht.
Daher möchte ich fragen, ob jemand schon einmal ähnliches Problem hatte und es eine Möglichkeit gibt, vielleicht eine andere Funktion zum verschicken von Daten welche supported wird, oder der Teil selber geschrieben werden muss.
Ich würde noch einen Schritt vorher anfangen, nämlich bei "Da das Programm zu langsam ist, wenn es mit Matlabcode läuft möchte ich gerne den Code als C/C++ Programm laufen lassen. "
Warum läuft es (zu) langsam? Warum sollte umgewandelter C Code schneller sein? Warum ein weiterer Rechner dazwischen?
Das ist vermutlich hier im Forum zu mühselig zu erklären, daher vielleicht einmal mit MathWorks Kontakt aufnehmen?
Gebe dir Recht, dass es im Forum vielleicht etwas mühselig ist.
Wieso ein weiterer Rechner dazwischen?
Da bin ich mir ehrlich gesagt nicht einmal so sicher wieso das so vor paar Jahren gemacht wurde (seitdem wurde mit dem System nicht mehr gearbeitet), wurde aber jetzt aus praktischen Gründen erst einmal so übernommen.
Wieso ist das Programm zu langsam und was sollte daran C-Code ändern?
Damit der Roboter flüssig läuft müssen die neuen Daten schnell genug übermittelt werden, aber bei einem Matlabprogramm wo hauptsächlich nur paar Additionen ablaufen vergeht schon zu viel Zeit, weswegen ich es gerne schneller hätte.
Mit Mexfiles läuft der Code doch deutlich schneller ab? Man spart selbst bei einfach Funktionen wie sum=add(a,b) {sum=a+b} schon ein paar Prozent, wenn man die Funktion als mex aufruft. Ob es direkt in VS oder Eclipse noch schneller läuft weiß ich nicht.
Mir ging es auch hauptsächlich darum, ob jemand mit Senden/Empfangen von UDP-Packets Erfahrung hat und andere Möglichkeiten als das udp-Objekt gibt welche kompatibel zum C-Coder von Matlab sind.
OK, danke für die Zusatzinformation. Dann bitte noch die exakte Fehlermeldung in Englisch posten, nicht die interpretierte Meldung. Ich guck mal was ich finde.
die Fehlermeldung lautet: "The 'udp' class does not support code generation".
Eine weitere Idee war das empfangen und senden auszugliedern und nur den Code dazwischen als mex laufen zu lassen. Allerdings ist mir bei Zeitmessungen aufgefallen, dass der fread-Befehl sehr lange benötig (zweistelliger ms Bereich). Und das auch, wenn die gesendeten Daten schon im Buffer waren und nur noch abgerufen werden mussten. Kommen die Daten aber vom selben Rechner verringert sich die Zeit für fread. Dazu muss man sagen, dass ich das auf unterschiedlichen Rechnern mit unterschiedlichen Matlabversionen getestet habe, was aus meiner Sicht auch nur der Grund dafür sein kann, da es ja keinen Unterschied machen sollte, wenn die Daten schon im Buffer liegen, wo sie her gekommen sind, ob von einem anderen oder vom selben Rechner.
Gibt es hier vielleicht auch eine Möglichkeit mit der das empfangen von Daten schneller läuft?
Also, die Fehlermeldung kommt vom Produkt MATLAB Coder und ist in der Tat eindeutig. Diese Funktionalität lässt sich - zumindest aktuell - nicht für die Codegenerierung nutzen. Eine Beschleunigung in diesem Zusammenhang wäre möglich, ist aber nicht sicher.
Ich konnte bezüglich FREAD Informationen zu Bugs in dem ein oder anderen Release finden, die sich in Langsamkeit (unter Spezialbedingungen) äußern.
Ich kann nur noch einmal anregen MathWorks direkt zu kontaktieren.
ich wollte hier nochmal was zu schreiben, was möglicherweise denjenigen helfen könnte die das selbe Problem habe. Mittlerweile läuft die Kommunikation zwischen Matlab und einem anderem Rechner sehr gut. Die Befehle für das empfangen und senden von Dateien habe ich durch selber geschriebene mex-files ersetzt. Wer sich sowieso mit der Socketprogrammierung in C++ auskennt, hat diese relativ schnell geschrieben und somit eine sehr schnelle Lösung. Da mich diese Lösung zufriedengestellt hat, habe ich auch keinen Kontakt zu MathWorks aufgenommen.
Viele Grüße,
Erano1
Einstellungen und Berechtigungen
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
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.