Forum: PC-Programmierung MATLAB GUI mit C- Programmieren


von Andreas M. (chillymu)


Lesenswert?

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

von Wolfram (Gast)


Lesenswert?

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.

von Andreas Müller (Gast)


Lesenswert?

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

von Wolfram (Gast)


Lesenswert?

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

von Andreas Müller (Gast)


Lesenswert?

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

von Wolfram (Gast)


Lesenswert?

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

von Andreas Müller (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

von Wolfram (Gast)


Lesenswert?

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.

von Andreas Müller (Gast)


Lesenswert?

Wie würde den soetwas aussehen und geht das über haupt in den GUI von
MATLAB?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Wolfram (Gast)


Lesenswert?

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

von Andreas Müller (Gast)


Lesenswert?

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.

von Andreas Müller (Gast)


Lesenswert?

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?

von Jürgen Schuhmacher (Gast)


Lesenswert?

"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"! :-)

von Andreas Müller (Gast)


Lesenswert?

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

von Hans (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.