Verfasst am: 04.08.2010, 11:10
Titel: while Schleife in Embedded Matlab
Hallo,
ich habe ein Problem. Ich schreibe in Embedded Matlab eine while- Schleife und wenn das Programm sich in dieser befindet aktualisiert es nicht mehr die Eingangsparameter von dem EM-Block. Woran liegt das und wie kann ich das Problem lösen?
So sieht mein Wuelltext aus:
Verfasst am: 05.08.2010, 08:57
Titel: Re: while Schleife in Embedded Matlab
Hallo,
ich weiß zwar nicht um die Besonderheiten von Embedded Matlab, aber Dein Code macht m.E. nicht sehr viel, ich kommentiere ihn mal, so wie ich ihn verstehe.
% von Embedded Matlab gebraucht
eml.extrinsic('clock');
eml.extrinsic('pause');
LZ_1 = [000000]; % überflüssig, da vor Neuzuweisung nie gelesen
LZ = 0; % notwendig, falls if-abfrage negativ ausfällt, sonst wäre kein Rückgabewert vorhanden
messung = 0; % überflüssig, da vor Neuzuweisung nie gelesen
tstart = [000000]; % überflüssig, ...
tstop = [000000]; % überflüssig, ...
if start == 1% der eingehende Parameter wird geprüft
messung = 1; % messung wird überschrieben, ohne vorher ausgelesen zu werden
tstart = clock; % tstart wird überschrieben, ... while messung == 1% mache Schleife, solange messung 1 ist % Anweisung 1: überprüfe stop if stop == 1% wenn der Eingangsparameter stop 1 ist, dann mache etwas
tstop = clock;
LZ_1 = tstop - tstart;
LZ = LZ_1(6)
messung = 0; % messung wird so verändert, dass die Schleife nicht weiter fortgesetzt wird end % Anweisung 2 der Schleife: fehlt end% denn hier wird die while-Schleife umschlossen, es gibt nichts, was sie außer der if-abfrage noch tun könnte
start = 0; % das ist bedeutungslos, da keine Weiterverarbeitung von start erfolgt. end
So wie ich den Code verstehe, könnte man ihn auch kürzer und anders schreiben, ohne dass er m.E. etwas anderes macht. Dann fällt Dir vielleicht eher auf, dass Du was ganz anderes wolltest:
Wenn Du also die ganze Funktion gespostet hast, dann kann man sie darauf einstampfen. Denn nur LZ wird zurückgegeben. Alle anderen Zuweisungen danach sind egal. Die While-Schleife fiel raus, weil es in ihr nur eine Anweisung gab: die Abfrage von stop. Folglich war es keine Schleife mehr. Die Antwort, die das Programm lieferte und meins liefert, wird sich im Bereich 0 bewegen, da quasi keine Zeit vergeht, bis die zweite Abfrage ausgeführt ist.
Die ganzen Initilisierungen lassen darauf schließen, dass Matlab nicht Deine erste Programmiersprache ist. Meine wars auch nicht, deswegen: in Matlab muss man nur etwas zuweisen, wenn es danach auch ausgelesen wird/ Verwendung findet. Jede andere Initialisierung ist nutzlos und wird vom Editor meist als Warnung angezeigt.
Kannst Du in Pseudocode beschreiben, was eigentlich passieren soll?
Gibt es ein Ist und ein Wunsch-Soll? Gibt es Beispiele zum Durchprobieren? Wenn selbstgeschriebene Funktionen aufgerufen werden: können sie bitte angehangen werden? Gab es Fehlermeldungen?
Stimmen die Werte, wenn der Debugger mit Haltepunkten etc. eingesetzt wird?
Danke
Gast
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 05.08.2010, 09:53
Titel:
Hallo yankemen,
erstmal vielen Dank für die Antwort. So wie Du den Code umgeschrieben hast, hätte ich es auch gemacht, wenn Embedded MatLab nicht ein paar Eigenarten hat.
So ist das Problem, wenn man Variablen verwenden will, muss man ihnen zuerst einen Wert zuweisen, ansonsten gibt es Fehlermeldungen, deswegen am Anfang die Initialisierungen.
Und damit kommen wir zu dem Problem der einfachen if- Abfrage. Da das Programm ja sequentiell arbeitet, fängt es immer wieder oben an und weißt dann den verwendeten Variablen die Anfangswerte zu. Und somit ist alles für die Katz.
Ich hänge mal das dazugehörige Modell an, das macht dann den Sinn des Codes deutlicher.
Das Modell soll die Laufzeit eines Signales messen.
Der erste Embedded MatLab Block prüft nur, ob ein ankommendes Telegramm, in diesem Fall der Constant Block mit [2 0 2 48 5 46], einem bestimmten Wert entspricht. Der macht dann den ausgang zu 1 und geht in den Block Laufzeit.
Da startet dann die Laufzeitmessung und soll diese stoppen, wenn der Wert am stop- Eingang 1 wird. Deswegen muß diese Funktion auch in die while- Schleife da der start- Eingang ja immer noch 1 sein kann und somit die Messung erneut starten würde.
Hoffe ich habe mich einigermaßen verständlich ausgedrückt
Habe den Fehler gefunden.
Wenn man mit Embedded MatLab arbeitet, startet jeder Block bei jedem staep neu am Anfang. Also setzt er alles Variablen, die man geändert hat wieder auf den Wert, den man am Anfang zugewiesen hat. Somit funktioniert das nicht wie bei mir gedacht.
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.