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

Schleifen an Zeit koppeln?

 

Waldemar
Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 14.11.2012, 17:22     Titel: Schleifen an Zeit koppeln?
  Antworten mit Zitat      
Hallo,

vielleicht hat jemand einige Tipps für mich, die mit beim folgenden Problem helfen:



ich habe eine Funktion (embedded MATLAB function) in SIMULINK eingefügt.
In der Funktion möchte ich Matrixeinträge über der Zeit variieren.
Dafür habe ich bislang folgenden Code:
Code:
function [Bvari, B11_i]= B(B11,B12,B13,B21,B22,B23,B31,B32,B33,B41,B42,B43,B51,B52,B53,B61,B62,B63,B71,B72,B73)

Treppe=5;

for i=1:Treppe;
   
    B11_i=B11/Treppe*i;


Bvari=[B11_i B12 B13; B21 B22 B23; B31 B32 B33; B41 B42 B43;
    B51 B52 B53; B61 B62 B63; B71 B72 B73];
end

end


Die Eingangsgrößen kommen aus "Constant"-Blöcken, die den Endwert an die Funktion weitergegeben. Mein Simunlink-Modell läuft 15sec.!
Ich möchte die Einträge (am Beispiel von B11) für die ersten 5sec. stufenweise in Richtung des Endwertes steigern.

B11_1 soll von 0sec-1sec gelten, B11_2 für 1sec-2sec, ...usw.

Bvari soll, wenn sich die Einträge (erstmal nur wenn B11_i sich ändert) ändern, innerhalb des Simulink-Modells an eine andere in Simulink eingebettete Funktion weitergeleitet werden.

Wie kann ich den meine Funktion an die Zeit koppeln?

Wäre super, wenn jemand eine Idee hätte.

MfG, Waldemar

PS: Arbeite seit kurzem erst mit Simulink.

PPS: Nehme B11_i als Ausgangsgröße hinzu, um zu sehen wie der Zeitverlauf ist. (siehe Anhang: Screenshot vom relevanten Ausschnitt meines Simulink-Modells

Simulink.jpg
 Beschreibung:

Download
 Dateiname:  Simulink.jpg
 Dateigröße:  19.63 KB
 Heruntergeladen:  485 mal

_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen


knilumis_baltaM
Forum-Century

Forum-Century


Beiträge: 241
Anmeldedatum: 20.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2012, 07:30     Titel:
  Antworten mit Zitat      
Nimm den Block "Clock" (gibt die Simulationszeit aus) und gib ihn in ein Eingang im embedded Matlab Block. Hier kannst du dann ungefähr so dein Ziel erreichen:
Code:

Treppe =1;
if sim_zeit >=2 && sim_zeit <3
     Treppe = 2;
elseif sim_zeit >=3 && sim_zeit <4
     Treppe = 3;
elseif sim_zeit >=4 && sim_zeit <5
     Treppe = 4;
...
end
B11_i=B11/Treppe;
 

Das ist "pseudo code", hab jetzt nicht probiert. Es geht auch anders aber hier ist es sofort ersichtlich wie es geht. Falls es nicht klappt, kannst du ja nochmal fragen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 15.11.2012, 13:51     Titel:
  Antworten mit Zitat      
Hallo knilumis_baltaM,

danke für deinen Tipp!
Habe es anfangs auch so probiert, aber Fehler bzgl. unterschiedlicher Abtastzeitpunkte "sample time" bekommen (siehe Anhang)?
War damit dann erstmal überfordert, so dass ich einen anderen Weg eingeschlagen habe, denn ich, zumindest dachte ich, ansatzweise besser nachvollziehen kann.

Mein Ansatz sieht folgendermaßen aus:

Bei meinem Lösungsweg gehe ich davon aus, dass alle eingebetteten Funktion, usw. im Simulink-Modell entsprechend der Abtastzeit angeregt werden. (Richtig?)

Bei 15sec. Gesamtzeit und 0.001 sample time gehe ich von 15000 Abtastzeitpunkte aus!!

Damit sich in jeder Abtastzeit die B-Matrix verändert, habe ich folgenden Code geschrieben:

Code:
function [Bvari,B11_i]= B(B11,B12,B13,B21,B22,B23,B31,B32,B33,B41,B42,B43,B51,B52,B53,B61,B62,B63,B71,B72,B73)

Treppe=15000;

%B11_i_Vec=zeros(Treppe,1);        
%Bvariabel_Mega=zeros(Treppe*7,3);

for i=1:Treppe
   
    B11_i=B11/Treppe*i;
     
%B11_i_Vec(i,1)=B11_i;

Bvari=[B11_i B12 B13; B21 B22 B23; B31 B32 B33; B41 B42 B43;
    B51 B52 B53; B61 B62 B63; B71 B72 B73];

%SizeB=size(Bvariabel);

%Bvari_Mega((1+SizeB(1)*(i-1):i*SizeB(1)),:)=Bvari;

end

end


...und SimulationsStart gedrückt!


Und schon wieder blieben meine Ausgänge über der gesamten Simulationszeit konstant!!

Hab dann mal die Semikolons entfernt und gesehen, dass sich die Matrizen und B11_i zwar ändern, aber viel zu schnell bzw. nicht wie ich es beabsichtigt habe.

Denn es sieht so aus, als die komplette Schleife je Abtastzeitpunkt durchfahren wird!!!!!

Deswegen sind die Ausgangsgrößen (B-Matrix und B11_i) im Display und im Scope stets konstant.

Hast du oder jemand anderes vielleicht zu einem der beiden Probleme eine Idee?

Würde mich freuen!!

MfG, Waldemar
_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen
 
Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 15.11.2012, 13:52     Titel:
  Antworten mit Zitat      
Anhang zum mit der clock-Variante!!!!

Simulink.jpg
 Beschreibung:

Download
 Dateiname:  Simulink.jpg
 Dateigröße:  110.65 KB
 Heruntergeladen:  460 mal

_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen
 
knilumis_baltaM
Forum-Century

Forum-Century


Beiträge: 241
Anmeldedatum: 20.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2012, 14:08     Titel:
  Antworten mit Zitat      
Ja das stimmt: alles was im embedded matlab block ist, wird pro Zeitschritt komplett abgearbeitet.

Das mit der Samplezeit wollte ich eigentlich schon am Anfang fragen (ob konstan bzw. für alle Modelle gleich....anscheinend nicht). Die Samplezeit Probleme kannst du mit Rate transition blocks beheben.

Aber beim aktuellen Code zu bleiben Versuche mal folgendes:
Code:

function [Bvari,B11_i]= B(B11,B12,B13,B21,B22,B23,B31,B32,B33,B41,B42,B43,B51,B52,B53,B61,B62,B63,B71,B72,B73)

persistent Treppe;
if isempty(Treppe)
     Treppe = 1;
end




B11_i=B11/1+floor(Treppe/1000);
     

Bvari=[B11_i B12 B13; B21 B22 B23; B31 B32 B33; B41 B42 B43;
    B51 B52 B53; B61 B62 B63; B71 B72 B73];
Treppe = Treppe + 1;

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 15.11.2012, 16:27     Titel:
  Antworten mit Zitat      
Hallo knilumis_baltaM,

also ich muss mich jetzt mal MEGA bedanken!!!

Hat super geklappt und ich habe dabei auch ziemlich dazu gelernt!!!

Vielen Dank!!!!!!

Mega freundlich von dir!

MfG, Waldemar
_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen
 
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.