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

while Schleife in Embedded Matlab

 

Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.08.2010, 11:10     Titel: while Schleife in Embedded Matlab
  Antworten mit Zitat      
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:
Code:

function LZ = Laufzeit(start, stop)
%#eml

eml.extrinsic('clock');
eml.extrinsic('pause');

LZ_1 = [0 0 0 0 0 0];
LZ = 0;
messung = 0;
tstart = [0 0 0 0 0 0];
tstop = [0 0 0 0 0 0];

if start == 1
    messung = 1;
    tstart = clock;
    while messung == 1
        if stop == 1
            tstop = clock;
            LZ_1 = tstop - tstart;
            LZ = LZ_1(6)
            messung = 0;
        end
    end
    start = 0;
end

Danke schonmal für eure Antworten


yankemen
Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 14.04.10
Wohnort: ---
Version: 32: 2008a & 2010a
     Beitrag Verfasst am: 05.08.2010, 08:57     Titel: Re: while Schleife in Embedded Matlab
  Antworten mit Zitat      
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.
Code:

function LZ = Laufzeit(start, stop)
% #eml

% von Embedded Matlab gebraucht
eml.extrinsic('clock');
eml.extrinsic('pause');

LZ_1 = [0 0 0 0 0 0]; % ü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 = [0 0 0 0 0 0]; % überflüssig, ...
tstop = [0 0 0 0 0 0]; % ü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:
Code:
function LZ = Laufzeit(start, stop)
% #eml

% von Embedded Matlab gebraucht
eml.extrinsic('clock');
eml.extrinsic('pause');

LZ = 0; % falls die erste If-Abfrage nicht greift

if start == 1
    messung = 1;
    tstart = clock;
    if stop == 1
        tstop = clock;
        LZ_1 = tstop - tstart;
        LZ = LZ_1(6);
    end
end
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?

Ciao,
yankemen
_________________

Code:
% Kommentare brauchen ein Leerzeichen nach dem %
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 Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.08.2010, 09:53     Titel:
  Antworten mit Zitat      
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

Laufzeitmessung.jpg
 Beschreibung:

Download
 Dateiname:  Laufzeitmessung.jpg
 Dateigröße:  26.12 KB
 Heruntergeladen:  785 mal
 
Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.08.2010, 09:44     Titel:
  Antworten mit Zitat      
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.
 
Neues Thema eröffnen Neue Antwort erstellen



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.