|
|
Interprozesskommunikation |
|
Bluesmaster |
Forum-Century
|
|
Beiträge: 203
|
|
|
|
Anmeldedatum: 13.11.11
|
|
|
|
Wohnort: Gera
|
|
|
|
Version: 2012a
|
|
|
|
|
|
Verfasst am: 30.05.2013, 07:08
Titel: Interprozesskommunikation
|
|
Hallo,
Ich hätte mal wieder eine etwas allgemeiner Frage:
Welche Möglichkeiten gibt es für Matlab mit einer anderen
Anwendung zu kommunizieren die nicht in Matlab geschrieben ist?
Prinzipiell und Empfehlungen. Vielen Dank vorab.
Gruß
Blues
|
|
|
|
|
markuman |
Forum-Guru
|
|
Beiträge: 320
|
|
|
|
Anmeldedatum: 14.12.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
|
|
|
|
|
|
Verfasst am: 30.05.2013, 09:27
Titel:
|
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 30.05.2013, 14:19
Titel: Re: Interprozesskommunikation
|
|
Hallo Bluesmaster,
Die Frage ist sehr allgemein und lässt sich daher nicht effizient beantworten. Deshalb nur Stichpunkte:
TCP-Sockets, Files, Shared-Memory, UDP-Messages, MPI, Email, SSH/Telnet, Pipes, Java-Robot, AutoIt, Verbindung über eine serielle Schnittstelle (auch als Loop-Back, also innerhalb eines Rechners), ...
Es gibt auch Programme, die übertragen Information über blinkende Pixel auf dem Bildschirm, die von einer Handy-Kamera ausgelesen werden.
empfeheln kann ich hier natürlich nichts, weil Du noch nicht erklärt hast, was Dein Ziel ist. Solch Allgemeine Fragen lassen sich in einem Forum im Allgemeinen nicht sinnvoll beantworten. Versuche es doch nochmal spezifischer.
Gruß, Jan
|
|
|
Bluesmaster |
Themenstarter
Forum-Century
|
|
Beiträge: 203
|
|
|
|
Anmeldedatum: 13.11.11
|
|
|
|
Wohnort: Gera
|
|
|
|
Version: 2012a
|
|
|
|
|
|
Verfasst am: 30.05.2013, 20:30
Titel:
|
|
Es geht um verschiede Probleme, mal mit 6einer SPS kommunizieren,
mal mit einem C++Programm. Ich habe sie bisher recht
dilettantisch über Files gelöst und wollte mal horchen was noch so geht.
Das sind sehr viele interessante Anregungen ich werde mich
mal ein bisschen durcharbeiten.
mit JavaRobot und AutoIt ist das Windows Messaging-System gemeint?
Gruß
Blues
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 30.05.2013, 22:26
Titel:
|
|
Hallo,
Anbindung an ein C++ Programm würde ich entweder über das DLL Interface machen
oder über mex functions, siehe z.B. hier
http://www.mathworks.com/help/matla.....or-outputs_btgcjh1-3.html
Meiner Erfahrung nach:
Vorteil von calllib: Es ist recht bequem in der Anwendung, wäre als mein erster Tipp.
Vorteil von mex Functions: mehr Kontrolle über die Daten, wäre also mein Tipp, wenn calllib Probleme macht.
Grüße,
Harald
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 31.05.2013, 00:45
Titel:
|
|
Hallo Bluesmaster,
Zum JavaRobot und zu AutoIt kannst Du einfach Google fragen. Die ersten Treffer sind bereits sehr informativ.
Gruß, Jan
|
|
|
Bluesmaster |
Themenstarter
Forum-Century
|
|
Beiträge: 203
|
|
|
|
Anmeldedatum: 13.11.11
|
|
|
|
Wohnort: Gera
|
|
|
|
Version: 2012a
|
|
|
|
|
|
Verfasst am: 31.05.2013, 07:08
Titel:
|
|
Vielen Dank schon mal für die Hinweise.
Vielleicht muss ich noch etwas unterscheiden:
1. Mit einer laufenden Anwendung kommunizieren <> 2. Funktionen einer anderen Anwendung nutzen
Ist Calllib eher was für Fall 2 ? Welche Methode bringt Variablen
möglichst unbeschadet von einem laufenden Programm ins andere?
TCP bringt ja nur Bytestreams. Sind die Windows-Zwischenablage, Registry oder Umgebungsvariablen eigentlich gebräuchliche Optionen?
Gruß
Blues
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 31.05.2013, 08:11
Titel:
|
|
Hallo,
Zitat: |
Ist Calllib eher was für Fall 2 ? |
Fall 2 wird auf jeden Fall abgedeckt. Für Fall 1 musst du eben C-Code bzw. eine DLL haben/schreiben, der in die Anwendung eingreifen kann.
Eine andere Möglichkeit kann auch noch das ActiveX Interface sein.
Grüße,
Harald
|
|
|
flashpixx |
Forum-Guru
|
|
Beiträge: 355
|
|
|
|
Anmeldedatum: 19.04.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 31.05.2013, 11:36
Titel:
|
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 01.06.2013, 03:11
Titel:
|
|
Hallo Bluesmaster,
Zitat: |
Welche Methode bringt Variablen möglichst unbeschadet von einem laufenden Programm ins andere? |
Alle genannten Methoden sind in der Lage, "Variablen" ohne Verlust the transportieren. Einschränkungen gibt es natürlich je nach Typ der Variablen: Ein Handle einer anonymen Matlab Funktion kann nicht sinnvoll an ein anderes Programm weitergegeben werden.
Und ein datum aus Excel zu exportieren ist Zauberei.
Da sich alle digitalen Daten als Byte-Stream darstellen lassen,
ist TCP umfassen geeignet. Man muss die Meta-Informationen nur geeignet verpacken.
Die Windows-Zwischen-Ablage ist sehr volatil. Der Benutzer könnte die Kommunikation zu leicht aus Versehen stören.
Von der Registry, die nur ein File ist, würde ich unbedingt die Finger lassen. Und die Umgebungsvariablen werden beim Programm-Start kopiert. Danach sind Änderungen nicht mehr ohne weiteres sichtbar.
Gruß, Jan
|
|
|
Bluesmaster |
Themenstarter
Forum-Century
|
|
Beiträge: 203
|
|
|
|
Anmeldedatum: 13.11.11
|
|
|
|
Wohnort: Gera
|
|
|
|
Version: 2012a
|
|
|
|
|
|
Verfasst am: 01.06.2013, 15:29
Titel:
|
|
|
|
|
Hallo,
Mit "möglichst unbeschaded durchbringen" meine ich minimalen
Konvertierungsaufwand für typische Datentypen und Arrays.
Bei TCP ist er maximal hoch. Verlustfreie Übertragung auf der
Byte-Ebene setze ich mal Voraus.
dass die Umgebungsvariablen nicht taugen, wusste ich gar nicht
ich dachte getenv und setenv können diese systemweit verändern, aber
es gilt tatsächlich nur innerhalb der "Umgebung des gestarteten Programms"
Die Zwischenablage ist etwas unsicher, dafür aber extrem einfach
umzusetzen, und mit geeigneten Prüfdaten vielleicht sogar eine Option.
Die Registry ist nur ein File, tatsächlich, ich dachte sie ist stets komplett
im RAM. Gut, sie scheint bessere Performance zu haben als Textdateien
und ein paar primitive Datentypen bringt sie auch mit, aber so richtig ist sie nicht das was ich suche zumal auch nicht OS-übergreifend.
CORBA kannt ich noch nicht. Klingt sehr interessant. Leider gibt es
auf Matlab-Seite scheinbar noch nichts (sei wohl geplant?)
In der Hinsicht kann COM unte Windows schon liefern.
Gibt es konkrete Erfahrungen mit sharedMemory und Pipes für Matlab?
Und was ist mit der Windows-Message-Queue wie praktikabel ist die?
Gruß
Blues
|
|
|
flashpixx |
Forum-Guru
|
|
Beiträge: 355
|
|
|
|
Anmeldedatum: 19.04.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 01.06.2013, 21:10
Titel:
|
|
|
|
|
Bluesmaster hat Folgendes geschrieben: |
CORBA kannt ich noch nicht. Klingt sehr interessant. Leider gibt es
auf Matlab-Seite scheinbar noch nichts (sei wohl geplant?)
|
Corba gibt es für Java und C++, so dass Du entweder eine Anbindung für Matlab mittels Java oder Mex realisieren kannst.
Bluesmaster hat Folgendes geschrieben: |
Gibt es konkrete Erfahrungen mit sharedMemory und Pipes für Matlab?
|
Du solltest, sofern Du bisher noch nicht mit parallelen Prozessen gearbeitet hast, darauf verzichten eigene SharedMemory Strukturen zu bauen, denn die Fehleranfälligkeit ist sehr hoch. Setze auf fertig definierte APIs und Protokolle, denn dort kannst Du sicher sein, dass sie nach Definition funktionieren.
Außerdem nützt ein SharedMemory nichts, wenn es sich um unterschiedliche Prozesse / Maschinen handelt, denn damit ist dann keine Möglichkeit zum Speicherpagezugriff. Zusätzlich muss bei einem gemeinsam genutzten Medium definiert werden, wie der Zugriff auf eine Adresse funktioniert, denn bei unabhängigen Prozessen musst Du Semaphore implementieren bzw. Dir Gedanken über Dead- bzw. Whitelocks machen.
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 01.06.2013, 22:05
Titel:
|
|
|
|
|
Hallo Bluesmaster,
Der Konvertierungsaufwand kann für z.B. die Zwischen-Ablage nicht kleiner sein als für den Transport über TCP: Beide Methoden verwenden Byte-Streams.
Man kann die Daten entweder mit der undokumentierten MEX-Funktion mxSerialize() oder per http://www.mathworks.com/matlabcent.....fast-serializedeserialize in einen Byte-Stream umwandeln. http://www.mathworks.com/matlabcent.....-communications-in-matlab nutzt Javas Fähigkeiten zur Serialization für die Konvertierung.
Ich meine, es ist ineffizient, wenn Du nach "Erfahrungen mit sharedMemory und Pipes" fragst. Je genauer Du die Anforderungen Deines Problems beschreibst, desto einfacher und kompakter kann eine Antwort ausfallen. Wir haben nun ein paar platte Stichworte ausgetauscht, aber das Feld ist so groß, dass es nicht lohnt in die Tiefe zu gehen ohne das irgendwelche Details klar sind. Bitte erkläre also nochmal genau, worum es geht: Wie groß sind die auszutauschenden Daten - Bytes oder GigaBytes? Wie schnell muss der Austausch sein und gibt es ein Limit für die Latency? Geht es um den gleichen Rechner, einen Vektor oder Massiv-Parallel-Rechner, ein lokales Netzwerk oder ein WAN?
Und was hat das ganze mit Matlab zu tun?
Gruß, Jan
|
|
|
Bluesmaster |
Themenstarter
Forum-Century
|
|
Beiträge: 203
|
|
|
|
Anmeldedatum: 13.11.11
|
|
|
|
Wohnort: Gera
|
|
|
|
Version: 2012a
|
|
|
|
|
|
Verfasst am: 02.06.2013, 08:47
Titel:
|
|
|
|
|
@Jan
Du hast vollkommen recht, das Feld anscheinend riesig.
Das wusste ich nicht, ich dachte es gäbe eher eine kleine Zahl
Lösungen von denen vielleicht 1-2 "Quasistandards" für alle Fälle sind,
daher hab ich die Frage bewusst offen gestellt auch um weitere
Möglichkeiten zu entdecken, zu vergleichen und in Zukunft besser
planen zu können.
Sicher es gibt Wikipedia, aber um zu wissen was für Matlab tauglich
ist sind Erfahrungberichte viel wertvoller, zumal das Thema hier im
Forum bisher nur für Spezialfällen behandelt wurde.
Kommunikation mit der SPS werde ich jetzt wohl über TCP Sockets lösen.
Die mit dem C-Programm wahrscheinlich über COM bzw. die "ML Engine".
Es wird aber auch noch etwas in Python anfallen, -große Matlab Arrays, keine zeitlichen Anforderungen- . Da bin ich noch ratlos.
An dieser Stelle schonmal danke, an alle die Meinungen eingebracht haben.
Gruß
Blues
PS:
Die Zwischenablage scheint immerhin ein paar Datenformate zu kennen.
z.B. Bitmaps die als Matrizen herhalten könnten.
http://msdn.microsoft.com/en-us/lib.....s649013%28v=vs.85%29.aspx
|
|
|
flashpixx |
Forum-Guru
|
|
Beiträge: 355
|
|
|
|
Anmeldedatum: 19.04.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 02.06.2013, 13:25
Titel:
|
|
|
|
|
Bluesmaster hat Folgendes geschrieben: |
Kommunikation mit der SPS werde ich jetzt wohl über TCP Sockets lösen.
Die mit dem C-Programm wahrscheinlich über COM bzw. die "ML Engine".
|
Ich rate davon massiv ab, denn Du musst dabei ein eigenes Protokoll entwickeln, das Deine Anforderungen enthält (ich verweise auf das OSI Modell). Mir ist bei der SPS nur bekannt, dass diese mittels C/C++ angesteuert werden kann, also würde ich dazu raten, dass Du einfach die Ansteuerung mittels Corba realisierst, denn für C/C++ gibt es passende C/C++ Implementation (einfach Google verwenden).
Bluesmaster hat Folgendes geschrieben: |
Es wird aber auch noch etwas in Python anfallen, -große Matlab Arrays, keine zeitlichen Anforderungen- . Da bin ich noch ratlos. |
Auch Python beherrscht Corba.
siehe http://omniorb.sourceforge.net/
Ich werfe aber mal als Alternative das Stichwort "Datenbank" in den Raum, denn im Grunde kannst Du auch von jedem Client in eine zentrale Datenbank schreiben. Z.B. Postgresql beherrscht direkt auf Tabellenebene Vektor- & Matrixstrukturen.
Anbindung von Matlab mittels JDBC (siehe http://flashpixx.de/2012/05/matlab-datenbank/)
Anbindung der jeweiligen Clients mit entsprechendem Treiber.
Es ist aus Entwicklungssicht nicht ratsam für jedes System ein eigenes Protokoll zu entwickeln, der Pflegeaufwand ist immens und die Fehleranfälligkeit sehr groß. Zusätzlich sollte eine Spezifikation für die Kommunikation generisch sein und nicht individuell für jedes System. Aus praktischer Sicht ist das Entwickeln einer Schnittstelle wesentlich einfacher und schneller als die Entwicklung einer vollständigen Kommunikation.
|
|
|
|
Gehe zu Seite 1, 2 Weiter
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| 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.
|
|