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

Interprozesskommunikation

 

Bluesmaster
Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 30.05.2013, 07:08     Titel: Interprozesskommunikation
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen


markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 30.05.2013, 09:27     Titel:
  Antworten mit Zitat      
Es gibt glaub ich viele.
Eine einfach ist, z.B. über TCP zu kommunizieren.
Z.B. mit einer redis Datenbank: https://github.com/markuman/redis-octave https://github.com/dantswain/redis-matlab
Setzt halt voraus, dass man das Protokoll implementiert.
_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 30.05.2013, 14:19     Titel: Re: Interprozesskommunikation
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Bluesmaster
Themenstarter

Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 30.05.2013, 20:30     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.05.2013, 22:26     Titel:
  Antworten mit Zitat      
Hallo,

Anbindung an ein C++ Programm würde ich entweder über das DLL Interface machen
Code:

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 31.05.2013, 00:45     Titel:
  Antworten mit Zitat      
Hallo Bluesmaster,

Zum JavaRobot und zu AutoIt kannst Du einfach Google fragen. Die ersten Treffer sind bereits sehr informativ.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Bluesmaster
Themenstarter

Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 31.05.2013, 07:08     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.05.2013, 08:11     Titel:
  Antworten mit Zitat      
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.
Code:

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.05.2013, 11:36     Titel:
  Antworten mit Zitat      
Ist halt die Frage, ob Du da vielleicht eher was Spezielles haben willst, also sprich für jede Anwendung eine eigene Kommunikation bauen magst oder das ganze etwas generisch machen möchtest.

Ich würde entweder zu http://de.wikipedia.org/wiki/Common.....quest_Broker_Architecture
oder http://de.wikipedia.org/wiki/Webservice

tendieren, da fast alle Sprachen Corba unterstützen, in Matlab kannst Du das dann z.B. mit Java regeln. Wenn es nur Java-only sein soll, dann gäbe es http://de.wikipedia.org/wiki/Remote_Method_Invocation

Natürlich kannst Du auch alles zu Fuß mittels Sockets selbst implementieren, davon würde ich aber abraten, denn dafür gibt es entsprechende Bibliotheken. ActiveX bzw COM/DCOM ist eben rein Windows, Corba wäre eben Sprach- und Plattformunabhängig
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 01.06.2013, 03:11     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Bluesmaster
Themenstarter

Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 01.06.2013, 15:29     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.06.2013, 21:10     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 01.06.2013, 22:05     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Bluesmaster
Themenstarter

Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 02.06.2013, 08:47     Titel:
  Antworten mit Zitat      
@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
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.06.2013, 13:25     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.