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

Werte in Übertragungsfunktion während Simulation anpassen

 

Georg J
Forum-Century

Forum-Century



Beiträge: 113
Anmeldedatum: 22.06.11
Wohnort: ---
Version: R2008a
     Beitrag Verfasst am: 01.07.2011, 16:18     Titel: Werte in Übertragungsfunktion während Simulation anpassen
  Antworten mit Zitat      
Hallo,

Ich möchte gerne im Simulink Block Continious Transfer Function die Parameter im Zähler und im Nenner während der Simulation anpassen.

Konkret heisst das z.B. dass sich bei einem Ein-Masse-Schwinger die Federsteifigkeit während der Simulation ändert.

Die Übertragungsfunktion wäre

H = 1/(ms^2+k)

Das k soll jetzt extern anpassbar sein. Ich möchte einen Regler für k in einen Feedback-Loop packen.

Ich habe schon probiert, die Matlab Funktion tf in einem Simulink Block als Matlab Funktion zu verwenden, aber es werden nur Blöcke mit double outputs akzeptiert.

Wie gehe ich am besten vor?

Gruss, Georg
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 01.07.2011, 16:41     Titel:
  Antworten mit Zitat      
Meinst du so (Feder_Masse_Schwinger)? Jetzt kannst du doch die Variablen m und k im Workspace anlegen.

Ohne Transferfct Block aber auch anpassbar hätte ich noch so ein Bsp.

Feder_Masse_unged.mdl
 Beschreibung:

Download
 Dateiname:  Feder_Masse_unged.mdl
 Dateigröße:  22.53 KB
 Heruntergeladen:  679 mal
Feder_Masse_Schwinger.mdl
 Beschreibung:

Download
 Dateiname:  Feder_Masse_Schwinger.mdl
 Dateigröße:  16.91 KB
 Heruntergeladen:  661 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Georg J
Themenstarter

Forum-Century

Forum-Century



Beiträge: 113
Anmeldedatum: 22.06.11
Wohnort: ---
Version: R2008a
     Beitrag Verfasst am: 01.07.2011, 17:59     Titel:
  Antworten mit Zitat      
Hi DSP,

Danke für die Files.

Das mit dem Ein-Massen-Schwinger war nur ein Beispiel. Meine Übertragungsfunktion ist in Wirklichkeit viel komplizierter. Deshalb will ich sie nicht mit GAINs und 1/s Blöcken aufbauen.

Dein Vorschlag, k in den Workspace zu schreiben, funktioniert bei mir nicht (siehe Beispiel, zuerst z.B. m = 1, k = 10000 im Workspace definieren).

Die Übertragungsfunktion wird vermutlich zu Beginn der Simulation definiert und dann nicht mehr verändert, obwohl k sich ändert. Erst wenn man die Simulation neu startet, und k zum Ende der Simulation einen anderen Wert hatte als zu Beginn, wird die Übertragungsfuntkion neu berechnet.

Was gibt es denn noch für Möglichkeiten, die Parameter der Übertragungsfunktion während der Simulation zu verändern?

Feder_Masse_Schwinger2.mdl
 Beschreibung:

Download
 Dateiname:  Feder_Masse_Schwinger2.mdl
 Dateigröße:  26.1 KB
 Heruntergeladen:  615 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Georg J
Themenstarter

Forum-Century

Forum-Century



Beiträge: 113
Anmeldedatum: 22.06.11
Wohnort: ---
Version: R2008a
     Beitrag Verfasst am: 04.07.2011, 14:26     Titel: ??
  Antworten mit Zitat      
Hat denn sonst keine eine Idee, wie ich die Parameter einer Transferfunktion laufend anpassen kann?

Es muss nicht zwingend kontinuierlich sein. Diskret wäre auch schon OK.

Für weitere Vorschläge wäre ich euch dankbar!
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 04.07.2011, 19:09     Titel:
  Antworten mit Zitat      
Hast du schon mal in die Richtung set_param und get_param gearbeitet?
Damit kann man ja eine Simulation starten, anhalten und auch updaten. Jetzt müsste man mit get_param z.B. die Simulationszeit abfragen und wenn gewünscht, die Simulation pausieren und den TransferFct Block updaten. Leider komme ich nicht an die Zeit. In der Feder...mdl. wird ja die Zeit aufgezeichnet. Aber die Variable 'Zeit' oder 't' kennt er nicht.

Code:

s = tf('s');
m = 10;
k = 100;
H = 1/(m*s^2 + k);
[num, den] = tfdata(H,'v');
set_param('Feder_Masse_Schwinger', 'SimulationCommand', 'start','StopTime', '10.0')
blks = find_system(gcs, 'Type', 'block')
listblks = get_param(blks, 'Name')
status = get_param('Feder_Masse_Schwinger', 'SimulationStatus')
% solange ausführen, bis Stoptime ereicht ist.
while(status ~= 'stopped')
% Abfrage Zeit
    t_sim = get_param('Feder_Masse_Schwinger','Zeit')
    if(t_sim==5)
        set_param('Feder_Masse_Schwinger', 'SimulationCommand', 'pause')
        m = 10;
        k = 500;
        H = 1/(m*s^2 + k);
        [num, den] = tfdata(H,'v');
        set_param('Feder_Masse_Schwinger', 'SimulationCommand', 'update')
        set_param('Feder_Masse_Schwinger', 'SimulationCommand', 'continue')
    end
    status = get_param('Feder_Masse_Schwinger', 'SimulationStatus')
end
 


Führe den Code aber nicht aus...mal abgesehen von der Fehlermeldung, habe ich auch noch eine Endlosschleife, da der Zustand 'stopped' nicht ereicht wird. Ich benutze die Befehle zum ersten mal und blicke da noch nicht durch. Ist also nur also Denkansatz zu sehen.

Feder_Masse_Schwinger.mdl
 Beschreibung:

Download
 Dateiname:  Feder_Masse_Schwinger.mdl
 Dateigröße:  16.98 KB
 Heruntergeladen:  626 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Georg J
Themenstarter

Forum-Century

Forum-Century



Beiträge: 113
Anmeldedatum: 22.06.11
Wohnort: ---
Version: R2008a
     Beitrag Verfasst am: 05.07.2011, 15:26     Titel:
  Antworten mit Zitat      
Hi DSP,

Nein, ich habe noch nie damit gearbeitet, aber es ist ein guter Tip.

Ich habe mich gerade mal damit auseinandergesetzt und die Simulationszeit ist mit
Code:
get_param('Feder_Masse_Schwinger','SimulationTime');

abfragbar. Das System kann dann Schrittweise durchlaufen werden mit
Code:
set_param('Feder_Masse_Schwinger', 'SimulationCommand','step');


Erneut reicht es nicht, die Parameter im Workspace zu updaten. Deshalb muss man die neuen Parameter direkt in den Block reinschreiben.
Code:
set_param(char(blks(5)),'Numerator','[num]')


Dein Beispiel hab ich dementsprechend angepasst und jetzt läufts Smile

Danke für deine Hilfe!

Gruss, Georg

Code:
clc
blks = find_system(gcs, 'Type', 'block')
listblks = get_param(blks, 'Name')
s = tf('s');
m = 1;
k = 1000;
H = 1/(m*s^2 + k);
[num, den] = tfdata(H,'v');
set_param(char(blks(5)),'Numerator','[num]');
set_param(char(blks(5)),'Denominator','[den]');
set_param('Feder_Masse_Schwinger', 'SimulationCommand', 'start','StopTime', '10')
set_param('Feder_Masse_Schwinger', 'SimulationCommand', 'pause')
status = get_param('Feder_Masse_Schwinger', 'SimulationStatus')
% solange ausführen, bis Stoptime ereicht ist.
while ~strcmp(status,'stopped')
% Abfrage Zeit
    t_sim = get_param('Feder_Masse_Schwinger','SimulationTime');
    if mod(t_sim,1)==0
        m = 1;
        k = 1000*t_sim;
        k=k/2;
        H = 1/(m*s^2 + k);
        [num, den] = tfdata(H,'v');
        set_param(char(blks(5)),'Numerator','[num]')
        set_param(char(blks(5)),'Denominator','[den]')
        set_param('Feder_Masse_Schwinger', 'SimulationCommand', 'update')
    end    
    if t_sim<9.999
        set_param('Feder_Masse_Schwinger', 'SimulationCommand','step');
    else        
        status='stopped';      
    end    
end
set_param('Feder_Masse_Schwinger', 'SimulationCommand', 'continue')
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 05.07.2011, 17:11     Titel:
  Antworten mit Zitat      
Freut mich das es ich dir helfen konnte...mich interessiert das aber auch und so habe ich mich gestern abend einfach mal hingesetzt und angefangen Wink

Darf ich mal Fragen wie du an die zusätzlich notwendigen Infos z.B. über die Sim.-zeit gekommen bist? In der Hilfe rund um set_ und get_param habe ich da gestern nix gefunden und habe dann irgendwann entnervt aufgegeben.

Edit: Leider funktioniert es bei mir nicht Question Im Command Window steht noch bis status pause und jetzt läuft es schon seit einiger Zeit Sad

Zuletzt bearbeitet von DSP am 05.07.2011, 17:25, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Georg J
Themenstarter

Forum-Century

Forum-Century



Beiträge: 113
Anmeldedatum: 22.06.11
Wohnort: ---
Version: R2008a
     Beitrag Verfasst am: 05.07.2011, 17:25     Titel:
  Antworten mit Zitat      
Das ist einfach:

Code:

oder
Code:


eingeben und dann in der sich öffnenden Hilfedatei auf den Link zu "Model and Block Parameters" klicken.

Dann erscheint eine Seite mit der Gruppierung der einstellbaren Parameter in Simulink (Modell, Blöcke etc.). Unter "Model Parameters" findest du dann "SampleTime" und noch gaaaaanz viel mehr...

Man kann also seine Simulations- und Modellparameter komplett von Matlab aus konfigurieren. Das erspart lästiges klicken Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Georg J
Themenstarter

Forum-Century

Forum-Century



Beiträge: 113
Anmeldedatum: 22.06.11
Wohnort: ---
Version: R2008a
     Beitrag Verfasst am: 05.07.2011, 17:31     Titel:
  Antworten mit Zitat      
Achja,

Es läuft bei dir nicht, weil du die Simulationszeit auf 10 setzen musst. Ich hab den solver auf ode3 fixed step size umgestellt. Ich hab das Modell nicht mehr optimiert, da ich, als ich die Lösung hatte, sofort zu meinem komplexeren System gewechselt habe.

Am besten du ergänzt oben
Code:

fn = 'Feder_Masse_Schwinger';
sim_time = 10;
step_size = 1e-3;

eval(fn)
set_param(fn,'StopTime', num2str(sim_time))
set_param(fn,'FixedStep',num2str(step_size))
 


Im while-looop würde ich noch die Zeile
Code:
if t_sim<9.999

durch
Code:
if t_sim<sim_time-step_size

ersetzen.

Zuletzt bearbeitet von Georg J am 05.07.2011, 17:32, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 05.07.2011, 17:31     Titel:
  Antworten mit Zitat      
Ok...danke!

Aber habe Matlab jetzt rabiat abgeschossen, da die Simulation nicht zum Ende kam.
Private Nachricht senden Benutzer-Profile anzeigen
 
Georg J
Themenstarter

Forum-Century

Forum-Century



Beiträge: 113
Anmeldedatum: 22.06.11
Wohnort: ---
Version: R2008a
     Beitrag Verfasst am: 05.07.2011, 17:35     Titel:
  Antworten mit Zitat      
Ja, mit dem Problem habe ich auch über eine Stunde gekämpft, bis ich endlich eine Lösung hatte Shocked
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 05.07.2011, 17:44     Titel:
  Antworten mit Zitat      
Super...jetzt läuft es auch bei mir einwandfrei. Wenn man hier aber nur mit einer festen Schrittweite simulieren kann, wäre es dann nicht sinnvoller das Ganze gleich mit diskreten Funktionen zu machen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Georg J
Themenstarter

Forum-Century

Forum-Century



Beiträge: 113
Anmeldedatum: 22.06.11
Wohnort: ---
Version: R2008a
     Beitrag Verfasst am: 05.07.2011, 17:55     Titel:
  Antworten mit Zitat      
Ja, das macht sicher Sinn. In meinem komplexen Modell verwende ich sowieso nur feste Schrittgrössen.

Die kontinuierliche Transferfunktion wandle ich mit c2d in eine diskrete um.

Aus der Theorie erhalte ich eine kontinuierliche Funktion. Deshalb war mein Thread auf eine kontinuierliche Funktion ausgerichtet. Ich kannte die Funktion tfdata nicht, aber damit kann ich die Parameter leicht extrahieren Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Georg J
Themenstarter

Forum-Century

Forum-Century



Beiträge: 113
Anmeldedatum: 22.06.11
Wohnort: ---
Version: R2008a
     Beitrag Verfasst am: 07.07.2011, 13:48     Titel:
  Antworten mit Zitat      
Hier noch ein wichtiger Nachtrag:

Bei der Ausarbeitung meines Problems ist mir aufgefallen, dass die erarbeitete Methode einen gravierenden Schönheitsfehler hat.

Da ich die Werte der Transferfunktion mit einem Regler vorgeben will, kann ich die Parameter nicht in der IF-Schleife updaten. Wenn ich die Reglerausgänge in den Workspace ausgebe, greift das Skript in der WHILE-Schleife nicht auf die aktuellen Werte, sondern auf die Werte bei der Initialisierung des Simulink-Modells zurück. Erst zum Schluss der Simulation wird der Workspace geupdatet. Demnach kann ich die Übertragnugsfunktion nicht mit dem Regler beeinflussen und ist der Lösungsansatz für mich unbrauchbar. Abgesehen davon ist die Simulation sehr langsam.

Deshalb bin ich zu einer eleganteren Lösung übergegangen, indem ich einfach eine S-Funktion geschrieben habe Smile Da lassen alle Parameter innerhalb des Modells in den S-Function-Block übergeben und ich habe kein Problem mehr mit dem Workspace Smile

Dass ich nicht früher darauf gekommen bin Confused
Naja, wenigstens hab ich gelernt, wie man mit set_param und get_param umgeht Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 07.07.2011, 14:02     Titel:
  Antworten mit Zitat      
Mit S Functions habe ich mich nicht außereinander gesetzt. Ich habe mir lediglich mal angesehen, was das ist. Könnst du nicht bitte bitte für das kleine Bsp. Masse-Schwinger mal bei Gelegenheit die S Function hier reinstellen? Ich und sicherlich andere wären dir sehr dankbar Exclamation
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.