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

Variable in einem MATLAB-Function Bolck initialisieren

 

Bug
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 26.05.2014, 13:21     Titel: Variable in einem MATLAB-Function Bolck initialisieren
  Antworten mit Zitat      
Hallo zusammen,

in meinem MATLAB-Function Block möchte ich eine Variable zur Integration verwenden. Diese soll am Anfang als Vergleichswert genommen und am Ende gleich dem Ausgangswert gesetzt werden. So, dass bei einem neuen Schleifendurchlauf erstmal das letzte Ergebnis überprüft wird.

Mein Problem ist, dass ich nicht weiß, wie ich eine Variable initialieren kann, die kein Input, Output oder fester Parameter ist und mir nicht eine Fehlermeldung wie:
"Data store memory with name 'Ialt' was not found for block"
oder wenn ich sie vorher im Workspace eintrage:
"Variable 'Ialt' is resolved in workspace ('base') for block 'vollstaendiges_Simulationsmodell' but it is not a 'Simulink.Signal' object"

Hier ist mal mein Code:
Code:
function I = fcn(abw,Ki,awu)
%#codegen

  abwi = abw-awu;                       % individuelle Abweichenung für den Integrator
  if ((( Ialt >= 1 )&&( abwi*Ki > 0 )) || (( Ialt <= -1 )&&( abwi*Ki < 0 )))
  {
      abwi = 0;
  }
  end
  abwsum += abwi;                       % Summierungen der Abw. für I-Anteil    
  I = Ki*abwsum;                        % I-Anteil        
  abwalt = abw;                         % Aktuelle Abw. als alte speichern
  Ialt = I;

end


Wie kann ich diesen Code trotz dem zum Laufen bringen?

Bin für jede Hilfe dankbar Smile
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.05.2014, 14:30     Titel:
  Antworten mit Zitat      
Hallo,

zunächst mal MATLAB-Syntax beachten: { } zur Gruppierung von Code gibt es nicht, ebensowenig +=

Wenn Variablen von einer Ausführung des Blocks erhalten bleiben sollen, schau dir mal persistent an.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Bug
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 27.05.2014, 09:58     Titel:
  Antworten mit Zitat      
Ah, sehr gut. Das löst das Problem erstmal. Vielen Dank schonmal!

Der neue Code lautet:
Code:
function I = fcn(abw,Ki,awu)
%#codegen
  persistent Ialt abwi abwsum abwalt
  if isempty(Ialt)
   Ialt = 0;
   abwalt = 0;
  end
  abwi = abw-awu;                       % individuelle Abweichenung für den Integrator
  if ((( Ialt >= 1 )&&( abwi*Ki > 0 )) || (( Ialt <= -1 )&&( abwi*Ki < 0 )))
      abwi = 0;
  end
  abwsum = abwalt + abwi;               % Summierungen der Abw. für I-Anteil    
  I = Ki*abwsum;                        % I-Anteil        
  abwalt = abwsum;
  Ialt = I;
end


Jetzt bekommt mein nachgeschalteter Sättigungsblock nur leider nen Problem:

"Simulink cannot solve the algebraic loop containing 'Problem_mit_Saettigung/Sättigung' at time 0.0 using the TrustRegion-based algorithm due to one of the following reasons: the model is ill-defined i.e., the system equations do not have a solution; or the nonlinear equation solver failed to converge due to numerical issues."

Das Problem muss irgendwas mit dem MATLAB-Function-Block zu tun haben. Tausche ich den MATLAB-Function-Block durch einen MATLAB-Function-Block mit nachgeschaltetem Integrator, habe ich das Problem nicht.
Ich hab das aktuelle Problem mal vereinfacht nachgebaut.

Problem_mit_Saettigung.slx
 Beschreibung:

Download
 Dateiname:  Problem_mit_Saettigung.slx
 Dateigröße:  16.89 KB
 Heruntergeladen:  410 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.05.2014, 12:00     Titel:
  Antworten mit Zitat      
Hallo,

das hat weniger mit dem MATLAB-Function Block zu tun als damit, dass du eine Rückführung ohne verzögerndes Element (Integrator, Unit Delay etc.) hast.

awu ist ja von I abhängig, du hast also
I = fcn(..., awu) und somit
I = fcn(..., I)
und das geht so nicht.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Bug
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 27.05.2014, 15:43     Titel:
  Antworten mit Zitat      
Ah, Danke!
Nun habe ich einfach alles in den Fcn-Block geschrieben, da hab ich grade weniger Probleme mit Wink
Grüße
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.