Verfasst am: 01.07.2011, 16:18
Titel: Werte in Übertragungsfunktion während Simulation anpassen
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.
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?
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.
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
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 Im Command Window steht noch bis status pause und jetzt läuft es schon seit einiger Zeit
Zuletzt bearbeitet von DSP am 05.07.2011, 17:25, insgesamt einmal bearbeitet
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
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.
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?
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
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 Da lassen alle Parameter innerhalb des Modells in den S-Function-Block übergeben und ich habe kein Problem mehr mit dem Workspace
Dass ich nicht früher darauf gekommen bin
Naja, wenigstens hab ich gelernt, wie man mit set_param und get_param umgeht
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
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
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.