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

Programmierung von einem Schwellenschalter

 

tsnkl
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 14.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2008, 09:56     Titel: Programmierung von einem Schwellenschalter
  Antworten mit Zitat      
Hallo,

habe folgendes Problem:
Würde mir gerne einen Schwellenschalter programmieren, das heisst, das beim Überschreiten einer bestimmten Schwelle, bei mir ist es eine bestimmte Drehzahl nur noch ein konstanter Wert herausgegeben wird.
Habe schon viel mit der if-Bedingung herum experimentiert. Beispiel zur Veranschaulichung:
Code:
if drehzahl >=1000;
moment_neu=0;
else moment_neu=moment;
end;
 

Sofern die Drehzahl wieder unter die 1000 fällt, wird mir wieder die Variable 'moment' herausgegeben. Eigentlich soll aber ab dem ersten Überschreiten ständig der Wert 0 herausgegeben werden.
Ich hoffe Ihr könnt mir weiter helfen!!!

Gruß
Thomas[/code]
Private Nachricht senden Benutzer-Profile anzeigen


keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 01.07.2008, 10:21     Titel:
  Antworten mit Zitat      
Fuege einfach ein Boolesche Variable ein, anhand derer das Programm den Wert veraendert, in etwa so:

Code:
flag = 0; % Boolsche Variable, 0 ist FALSCH, 1 ist WAHR
if drehzahl >= 1000
flag = 1;
end
if flag == 1
moment_neu=0;
else
moment_neu=moment;
end
Private Nachricht senden Benutzer-Profile anzeigen
 
tsnkl
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 14.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2008, 10:36     Titel:
  Antworten mit Zitat      
Hallo keloid,

leider funzt das auch nicht, weil immernoch beim Unterschreiten der Grenze von 1000 U/min die Boolsche Varaible auf 0 zurückfällt und die Variable 'moment' herausgibt.
Ausgeschrieben müsste die Anweisung lauten:
Wenn die Drehzahl von 1000 erstmalig überschritten,
dann nur noch moment_neu=0 ausgeben.

Nur ich weiss nicht wie ich das programmieren soll!!!

Gruß
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 01.07.2008, 10:51     Titel:
  Antworten mit Zitat      
Wenn Dein Programm in einer For- oder Whileschleife steht, muss das
Code:
natuerlich vor der Schleife stehen.
Private Nachricht senden Benutzer-Profile anzeigen
 
tsnkl
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 14.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2008, 10:59     Titel:
  Antworten mit Zitat      
Habe keine For bzw. While-Schleife benutzt, da meiner Meinung nach, sich Schleifen für dieses Problem nicht eignen, eher doch Anweisungen wie if. Kann auch sein, das ich mich irre. Aber wüsste nicht wie sich eine Schleife dafür nutzen lässt...
Private Nachricht senden Benutzer-Profile anzeigen
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 01.07.2008, 11:09     Titel:
  Antworten mit Zitat      
Kannst Du evtl. Deinen Programmcode hier rein kopieren, dann faellt es leichter, darauf einzugehen.
Private Nachricht senden Benutzer-Profile anzeigen
 
tsnkl
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 14.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2008, 11:19     Titel:
  Antworten mit Zitat      
Kein Problem, genauer gesagt arbeite ich zur Zeit mit Simulink und möchte über das Tool 'Embedded Matlab Function' mir diesen besagten Schwellenschalter basteln:
Code:

function moment_neu = fcn(moment, drehzahl)
% This block supports an embeddable subset of the MATLAB language.
% See the help menu for details.

if drehzahl>=1000;
    moment_neu=0;

else
    moment_neu=moment;
end;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 01.07.2008, 11:25     Titel:
  Antworten mit Zitat      
Ah, dann sieht die Sache wieder anders aus :D

Mit Simulink kenne ich mich nicht im Ansatz aus, aber Du koenntest versuchen, die Variable "flag" ausserhalb der Funktion zu definieren.
Es ist klar, dass die Flagvariable bei jedem Aufruf der Funktion fcn neu auf Null initialisiert wird, also muss sie ausserhalb initialisiert werden.
Private Nachricht senden Benutzer-Profile anzeigen
 
tsnkl
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 14.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2008, 11:31     Titel:
  Antworten mit Zitat      
Erstmal vielen Dank für deine Antworten, hatte ich total vergessen!!!

Erklär mir noch mal bitte, was genau die Variable 'flag' bewirken soll, bin nicht so der Programmier-Experte!!! Vielleicht steige ich jetzt hinter deine Idee...
Private Nachricht senden Benutzer-Profile anzeigen
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 01.07.2008, 11:56     Titel:
  Antworten mit Zitat      
Sie soll einfach eine Ueberpruefungsvariable sein.

Du hattest ja geschrieben, dass ab einem bestimmten Ereignis der Ausgabewert immer der Gleiche sein soll. Da das aber mit dieser normalen Ueberpruefung nicht geht, musst Du eine spezielle Ueberpruefungsvariable einfuehren. Im Allgemeinen nennt man sowas "Flag", denn das ist computerbezogen ein "Bitschalter", also ein Bit, das die Zustaende AN und AUS bzw. WAHR und FALSCH darstellen soll.

Die Abfrage ueber die Drehzahl kann sich ja nach dem benoetigten Ereignis (hier: Erstmalig Drehzahl groesser oder gleich 1000) wieder veraendern, also brauchst Du ein anderes Erkennungsmerkmal. Da eignet sich eine Flag-Variable, die in diesem Fall ausdrueckt: Die Drehzahl war bereits bei 1000 oder drueber.
Private Nachricht senden Benutzer-Profile anzeigen
 
tsnkl
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 14.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2008, 12:01     Titel:
  Antworten mit Zitat      
Achso, aber wenn ich jetzt z. B. die Variable 'flag=0' mit der Bedingung Drehzahl>=1000 verknüpfe, dann ist die Variable doch abhängig von der Drehzahl. Das heisst sinkt die Drehzahl unter 1000 verliert die Variable doch wieder ihren festen Wert.

wie kann ich denn den festen Wert beibehalten, trotz verändlicher Drehzahl?
Private Nachricht senden Benutzer-Profile anzeigen
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 01.07.2008, 12:05     Titel:
  Antworten mit Zitat      
Naja, das kommt auf die Umsetzung an.

Wenn Du schreibst
Code:
flag = 0;
... % Programmcode
moment_neu = fcn(moment, drehzahl);


und in der Funktion fcn steht
Code:


function moment_neu = fcn(moment, drehzahl)
% This block supports an embeddable subset of the MATLAB language.
% See the help menu for details.

if drehzahl >= 1000
    flag = 1;
end

if flag
    moment_neu=0;
else
    moment_neu=moment;
end;
 


Dann setzt er die Variable flag beim ersten Ereignis "drehzahl >= 1000" auf Eins und sie wird danach erst dann wieder Null, wenn Du den Programmteil, in dem die Variable flag mit Null initialisiert wird, aufrufst.
Private Nachricht senden Benutzer-Profile anzeigen
 
tsnkl
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 14.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2008, 12:21     Titel:
  Antworten mit Zitat      
Hört sich von der Theorie sehr gut an, nur bei mir funktioniert das nicht. Habe es eben ausprobiert, jedoch keine Veränderung im Vergleich zu der einfachen if-Anweisung ohne flag. Sofern die drehzahl unter 1000 sinkt, wird der Stellwert wieder ungleich 0!!!

Hier der code:
Code:

function moment_neu = fcn(moment, drehzahl, flag)
% This block supports an embeddable subset of the MATLAB language.
% See the help menu for details.

if drehzahl>=100;
    flag=1;
end;

if flag == 1;
    moment_neu=0;
else
    moment_neu=moment;
end;
 

Die Variable 'flag' führe ich über eine externe Konstante in den Block!
Private Nachricht senden Benutzer-Profile anzeigen
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2008, 13:42     Titel:
  Antworten mit Zitat      
Hi,

ich sehe da prinzipiell 2 Möglichkeiten (vielleicht müsste ich mir da länger gedanken drüber machen Smile )
1. So ähnlich wie du des bereits geschrieben hast:
Code:
% Initialisierung
flag = 0;
function [flag moment_neu] = fcn(moment, drehzahl,flag)
% This block supports an embeddable subset of the MATLAB language.
% See the help menu for details.

if drehzahl>=100
    flag = 1;
end;

if flag == 1
    moment_neu=0;
else
    moment_neu=moment;
end;

Der Aufruf ist dann natürlich auch über
Code:
[flag moment_neu] = fcn(moment, drehzahl, flag)
Das Problem am davor geposteten Code ist dass die Variable flag nicht zurückgegeben wird, sprich nicht überschrieben wird.


2. Möglichkeit (so wie du es bereits hattest)
Code:
function moment_neu = fcn(moment, drehzahl)
% This block supports an embeddable subset of the MATLAB language.
% See the help menu for details.

if drehzahl>=100
    moment_neu = 0;
else
    moment_neu = moment;
end;
 
Allerdings erfolgt der Aufruf mit
Code:
moment = fcn(moment,drehzahl)
Voraussetzung dafür ist natürlich, dass moment nicht im Programmcode vor der Abfrage ändert ( ich befürchte aber dass dies bei dir nicht der Fall sein wird).


Hm, mir fällt gerade auf dass es da doch noch mehrere Lösungen gibt (irgendwie fehlt mir da aber noch eine elegante Version).

MfG

Zuletzt bearbeitet von dib0r am 01.07.2008, 13:48, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2008, 13:46     Titel:
  Antworten mit Zitat      
tsnkl hat Folgendes geschrieben:

Die Variable 'flag' führe ich über eine externe Konstante in den Block!


Das ist das Problem. Wenn ich dich richtig verstehe (externe Konstante = Argument der Funktion), dann heisst das dass du die Variable flag nicht mehr zurückgibst. D.h. egal ob flag in der Funktion gesetzt wird oder nicht, sobald die Funktion beendet ist, wird flag wieder auf den Wert gesetzt, den sie bei Aufruf der Funktion hatte.

Wenn ich dich falsch verstehe (externe Konstante = globale Variable) dann fehlt die Deklaration der globalen Variablen im Block. Ausserdem muss da das Argument 'flag' weg. Ich würde allerdings globale Variablen nicht empfehlen Smile

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