Hi Leute, ich beschäftige mich gerade mit der GUI von MATLAB(GUIDE) und stehe vor folgendem Problem. Ein Programm legt Speicher fest wovon es liest und schreibt. Ein anderes Programm, nämlich das von Matlab, soll genau von dieser Speicherstelle auch lesen oder schreiben. Beide Programme können nur über diese Speicherstelle komunizieren. Dies dachte ich mir mach ich am besten mit einem Pointer auf eine Struktur. Nun frag ich euch. Kann mann das mit der GUI von Matlab machen oder nicht? Hab gesehen das man als Compiler- Language auch C/C++ verwenden kann. Vielleicht weiß ja einer von euch Rat. Gruß Andreas
Dir ist aber schon klar, dass in den letzten 10 Jahren andere Kommunikationstechniken als shared memory entwickelt wurden. Gerade Matlab ist da sehr flexibel (COM/DDE/DLL/C/Fortran Code aus Matlab/Nutzung der Matlab COMobjekte in anderen Programmen etc.) Ok unter Linux ist die Liste etwas eingeschränkter, aber immer noch gross genug.
Das weiß ich auch. Ich soll es nur eben, von meinem Chef aus mit shared memory machen. Bedeuten deine Ausführungen jetzt, dass es geht oder nicht. Wenn ja, weißt du dann auch wie. Wär nicht schlecht wenn man da mal ein Tutorial hätte oder so. Nur eine kurze Beschreibung, nicht das man schon an der Syntax scheitert. Gruß Andreas
>Das weiß ich auch. Ich soll es nur eben, von meinem Chef aus mit shared >memory machen. Wer von euch beiden ist den nun der Programmierer? Wenn dein Chef weiss wie es mit shared memory geht,dann kannst du dir ja den Quellcode von ihm geben lassen. Ich weiss nicht ob es geht, ich bin mir nur ziemlich sicher das es in einem Betriebssystem das sich den Speicherschutz auf die Fahnen schreibt eine Verletzung der Regeln darstellt, wenn ein normales Programm auf den Speicher des anderen direkt zugreifen kann und jede Möglichkeit die sich doch ergibt evt. unter einem neuen Betriebssystem/Sicherheitsupdate nicht mehr funktioniert. Nicht umsonst haben mit WinXP/SP2 einige Programme nicht mehr funktioniert, das waren vor allem die Programme, bei denen die Programmierer in den letzten 10 Jahren nichts dazugelernt haben. Ich habe dir eine ganze Menge von Möglichkeiten genannt, welche man nimmt muss man von Fall zu Fall entscheiden. Ohne ein Angabe was du machen willst und wie dein Vorwissen ist, kann man da auch schlecht eine Empfehlung aussprechen, ausser das du dir die Hilfe von Matlab durchliest. Die geht eigentlich auf die verschiedenen Möglichkeiten recht gut ein und ist ein guter Startpunkt.
Ich bin der Programmierer. Mein Chef weiß zwar wie das prinzipell geht, aber nicht wie das in MATLAB geht. Außerdem hat er mich damit beauftragt und das heißt auch, das ich es selbst rausfinden soll. Hast du denn Ahnung von der GUI in MATLAB bzw. hat hier überhaupt jemand Ahnung von der GUI in MATLAB? Gruß Andreas
>Hast du denn Ahnung von der GUI
Nein, aber wie man ein Gerät über ein selbstentwickeltes COM-Objekt in
Matlab benutzt und über die Kommandozeile von Matlab steuert, davon
habe ich Ahnung. Da die GUI von Matlab mit Matlabbefehlen programmiert
ist macht das keinen grossen Unterschied. Wenn du erzählst, was du
machen willst, kann ich dir sagen ob diese Variante für dich geeignet
ist.
Ok. Also, ich möchte eine Motorsteuerung aufbauen um eben einen Motor zu steuern. Die Steuereinheit benötigt dazu ein bis zwei Daten, spielt aber für meine Aufgabe nur eine nebensächliche Rolle. In Simulink soll dafür ein Model aufgebaut werden, welches dann mittels RTW in C-Code umgesetzt wird. Dieser Code wird über eine Echtzeiterweiterung für Windows(RTX) auf die untere Ebene von Windows implementiert. Von dort aus kann der Motor in Echzeit gesteuert werden. Über eine GUI in der Applikationsebene von Windows soll diese C-Code seine Sollwerte bekommen bzw. dort sollen auch die Istwerte angezeigt werden. Das heißt beides läuft auf einem Stand Alone System. Um nun von der GUI die Daten zu lesen bzw. zu schreiben dachte ich man könne dies über shared memory machen. D.h. der C-Code legt an einer bestimmten Speicherstelle eine Struktur fest und bekommt die Adresse dieser Struktur zurück. über diese Adresse kann er nun ständig Werte lesen bzw. schreiben. Die GUI kennt ebenfalls diese Speicheradresse und den Aufbau der Struktur und kann genauso lesen und schreiben wie der C-Code in der unteren Ebene von Windows. So, dass will ich machen. Irgendjemand eine Idee ob dies mit der MATLAB GUI geht? Gruß Andreas
Unter Betriebssystemen mit virtueller Speicherverwaltung (und dazu gehört Windows) sind Speicheradressen unterschiedlicher Prozesse nicht eineindeutig. Was Prozess A unter einer bestimmten Adresse sieht, hat nichts mit dem zu tun, was Prozess B unter derselben Adresse sieht, da das OS jedem Prozess seinen eigenen Adressraum zur Verfügung stellt. Um über Prozessgrenzen hinweg auf Speicherbereiche zugreifen zu können, gibt es unter Windows den Mechanismus der "Memory Mapped Files". Dabei soll "Files" im Namen nicht verwirren, das geht auch ohne Dateizugriffe. Dazu wird mit CreateFileMapping ein entsprechendes Objekt eingerichtet, dabei wird ein Name angegeben, der jedem beteiligten Prozess bekannt sein muss. Mit MapViewOfFile wird das Mapping-Objekt auf einen Speicherpointer abgebildet. Andere Prozesse verwenden anstelle CreateFileMapping die Funktion OpenFileMapping und danach wieder MapViewOfFile. Es ist allerdings ohne die Verwendung von Synchronisationsmechanismen davon abzuraten, diese Funktionen zu verwenden. Ohne diese weiß der eine Prozess nicht, ob nicht womöglich gerade der andere Prozess am Schreiben ist, was auch bei Lesezugriffen zu unlogischen Datenstrukturen im Speicher führen kann. Daher sollten Synchronisationsmechanismen wie Events oder Mutexe verwendet werden. Ob man in MatLab Betriebssystemfunktionen aufrufen kann, wird wohl der MatLab-Dokumentation zu entnehmen sein. Näheres über die Betriebssystemfunktionen und deren Gebrauch findet sich in der MSDN-Onlinedokumentation; als Einstiegspunkt hier mal die Dokumentation von CreateFileMapping: http://windowssdk.msdn.microsoft.com/en-us/library/ms685007.aspx
entweder du nimmst die memory mapped files mit den genannten Einschränkungen, oder du benutzt pipes, diese sind direkt zur interprocess Kommunikation vorgesehen. Das ist so als würdest du z.B. über die serielle Schnittstelle mit einem anderen Computer kommunizieren,nur das statt 2 Computer 2 Prozesse miteinander kommunizieren.
Wie würde den soetwas aussehen und geht das über haupt in den GUI von MATLAB?
Ob "das über haupt in den GUI von MATLAB" geht, wirst Du selbst herausfinden müssen. Kannst Du damit Betriebssystemfunktionen aufrufen? "named pipes" (die wirst Du verwenden müssen) werden genauso wie shared memory über beim Einrichten vergebene Namen identifiziert, alle beteiligten Prozesse müssen den gleichen Namen verwenden. Zum Verwenden von "named pipes" sind unter anderem folgende Win32-API-Funktionen vorgesehen: CreateNamedPipe, CreateFile, ReadFile, WriteFile Übliche Terminologie hierbei ist der Pipe-Server (das ist der Prozess, der mit CreateNamedPipe die Pipe zur Verfügung stellt) und der Pipe-Client, der sich mit dieser Pipe mit der Funktion CreateFile verbindet. Dabei kann ein Pipe-Server auch mehrere Instanzen einer Pipe verwalten; es können sich also gegebenenfalls auch mehrere Clients gleichzeitig mit dem Server verbinden. Als Einstiegspunkt in die Dokumentation hier die Funktion CreateNamedPipe: http://windowssdk.msdn.microsoft.com/en-us/library/ms690371.aspx Übrigens können -im Gegensatz zu shared Memory- "named pipes" auch zur Interprozesskommunikation zweier Prozesse auf unterschiedlichen Rechnern verwendet werden, abgesehen davon, daß bei der Verbindung mit einer solchen Pipe eine etwas erweiterte Syntax für den Pipenamen zu verwenden ist, ändert sich an der Programmierung gar nichts, was die Angelegenheit ziemlich elegant macht: Anstelle von "\\PIPE\MeinePipe" ist \\Servername\PIPE\MeinePipe" zu verwenden, das war's dann auch schon. Eine Alternative zur Verwendung von "named pipes" wäre die Verwendung von Sockets, bei denen wird anstelle eines Namens zur Identifikation eine Portnummer verwendet.
Besser hätte ich es auch nicht darstellen können, hier noch ein Link der dir die verschiedenen Möglichkeiten unter Windows darstellt. http://windowssdk.msdn.microsoft.com/en-us/library/ms690478.aspx
OK. Ich werd mich mal informieren ob das alles in der GUI geht. Danke für eure hilfreichen Antworten. Bei gelegenheit werde ich meine Informationen hier angeben.
Als gut das mit dem OpenFileMapping funktioniert unter Matlab. Ich schreib auch einen kleinen Bericht wie das alles geht. Nur eine Frage hab ich noch. In der MSDN die rufus angegeben hat war ein Beispiel das ich ausprobiert habe. Dieses schick immer einen Text in den Speicher. http://windowssdk.msdn.microsoft.com/en-us/library/ms685007.aspx Ich möchte aber eine Struktur hin anlegen und diese hin und her schicken. Wie müsste ich da diese Beispiel verändern?
"Wer von euch beiden ist den nun der Programmierer? Wenn dein Chef weiss wie es mit shared memory geht,dann kannst du dir ja den Quellcode von ihm geben lassen." Super! Wenn Der Chef mit einer ungewöhnlichen Idee kommt: -> "Mach's selber"! :-)
Alles klar Jürgen, danke für den Tip. Hab es selbst hinbekommen. Du bist aber auch so ein kleiner Schlauberger der denk zu jedem Thema seinen Senf dazugeben zu müssen. Das was du da geschrieben hast verbraucht nur unnötig Ressourcen und hilft keinem weiter, also entweder schreibst du was sinnvolles zum Thema oder du lässt es. MFG Andreas
man kann auf den speicher eines anderen progs zugreifen.. msdn-lib --> OpenProcess --> ... aber das so zu machen wäre 1. ein grober hack, 2. sicher nur halbwegs stabild wenn man da wirklich grob herumfuhrwerkt (in asm) und 3. wie oben erwähnt nicht im sinne des OS ;) 73
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.