[an error occurred while processing this directive]
CallbacksCallbacks nennt man Funktionen oder Routinen, die ausgeführt werden, wenn ein bestimmtes Ereignis auftritt. In Simulink beziehen sich diese Ereignisse häufig auf den Ablauf des Simulationsprozesses, die Callback-Routinen werden also aufgerufen, wenn der Simulationsprozess ein bestimmtes Stadium erreicht hat, etwa wenn ein Modell geladen wird oder wenn ein Simulationslauf gestartet wird. Andere Ereignisse werden durch Aktionen der Benutzer ausgelöst, etwa durch Doppelklick auf einen Block. Graphische Benutzeroberflächen sind ein Beispiel dafür, wo Callback-Funktionen eingesetzt werden, graphische Animationen ein anderes.Beispiel 1:Das folgende einfache Beispiel soll zeigen, wie Callbacks aufgebaut, verwendet und wann sie ausgeführt werden. Wir verwenden ein Modell mit Namen 'cb.mdl', das im aktuellen Arbeitsverzeichnis liegt:
» W1=1;W2=1;W3=1;und nachfolgender Simulationslauf über das Modell-Fenster liefert das Ergebnis 1. Für die Ausführung stehen unterschiedliche Zeitpunkte zur Wahl, je nach Ausführungszeitpunkt spricht man von Init-Funktionen, Start-Funktionen u.s.w. Wir benutzen zuerst W1F als InitFcn zum Block Wert1: » set_param('cb/Wert1','InitFcn','W1F')
Nach dem Start im Modell-Fenster erhält man im Matlab-Fenster
dann die Anfrage:
» W1?und nach der Antwort 10 das Ergebnis 10 und nicht, wie man auch vermuten könnte, 200. Der Zeitpunkt zu dem eine StartFcn ausgeführt wird, liegt nach der Festlegung der Parameterwerte für den nachfolgenden Simulationslauf. Änderungen von Parameterwerten wirken sich daher nicht auf diesen Lauf aus. Wenn wir in einem nachfolgenden Lauf W1 und W2 mit 10 und 30 besetzen, erhalten wir als Ergebnis 200, denn jetzt wirkt sich die Besetzung von W2 mit dem Wert 20 im Vorlauf aus, noch nicht aber die Besetzung mit dem Wert 30 aus dem aktuellen Lauf. Wir löschen die StartFcn von Wert2 mit: » set_param('cb/Wert2','StartFcn','')
und besetzen stattdessen OpenFcn von Wert2 mit W2F:
» set_param('cb/Wert2','OpenFcn','W2F')
Der Zeitpunkt zu dem eine OpenFcn ausgeführt wird, wird vom Anwender durch
Doppelklicken auf den betreffenden Block vorgegeben. Änderungen eines Parameterwertes
wirken sich auf einen nachfolgenden Simulationslauf aus.
Eine OpenFcn ersetzt also die übliche Reaktion eines Blockes auf einen Doppelklick, das Öffnen des Blockparameter-Fensters, durch die Ausführung der betreffenden OpenFcn.
» W1? W2?die wir mit 10 bzw. 20 beantworten, das gelieferte Ergebnis ist 10.
Callback-Routinen können einzelnen Blöcken eines Modelles zugeordnet werden,
aber auch dem gesamten Modell. Teilweise werden dabei gleiche Namen für die
Callback-Funktionen verwendet, teilweise verschiedene.
» gcs % set_param funktioniert nur beim aktuellen System
ans = cb
» set_param('cb/Wert1','InitFcn','') % loeschen der InitFcn
» set_param('cb/Wert2','InitFcn','') % loeschen der InitFcn
» set_param('cb/Wert3','InitFcn','') % loeschen der InitFcn
» set_param('cb/Wert3','StartFcn','') % loeschen der StartFcn
» set_param('cb/Wert2','StartFcn','') % loeschen der StartFcn
» set_param('cb/Wert1','StartFcn','') % loeschen der StartFcn
» set_param('cb/Wert1','OpenFcn','') % loeschen der OpenFcn
» set_param('cb/Wert2','OpenFcn','') % loeschen der OpenFcn
» set_param('cb/Wert3','OpenFcn','') % loeschen der OpenFcn
»
» set_param('cb/Wert1','LoadFcn','W1LF') % LoadFcn für Wert1
» set_param('cb/Wert2','LoadFcn','W2LF') % LoadFcn für Wert2
» set_param('cb/Wert2','InitFcn','W2F') % InitFcn für Wert2
» set_param('cb/Wert3','LoadFcn','W3LF') % LoadFcn für Wert3
» set_param('cb','PreLoadFcn','SPrLF') % LoadFcn für Wert1
» set_param('cb','PostLoadFcn','SPoLF') % LoadFcn für Wert1
» set_param('cb','StartFcn','SStF') % LoadFcn für Wert1
» close_system % aktuelles System schließen, Modellfenster verschwinden
» cb % Modell cb laden, wird aktuelles System
ans = % Preload-Funktion fragt Werte ab
PreLoadFunction
W1?1
W2?1
W3?1
ans = % Postload-Funktion fragt Werte ab
PostLoadFunction
W1?2
W2?2
W3?2
W1-LoadFcn: W1?3 % Load-Funktion zu Wert1
W2-LoadFcn: W2?3 % Load-Funktion zu Wert2
W3-LoadFcn: W3?3 % Load-Funktion zu Wert3
» [t,x,y]=sim('cb'); % Simulationslauf starten
W2?4 % Init-Funktion zu Wert2 (Initialisierungsphase der Simulation)
ans = % Start-Funktion zum System (Startphase der Simulation)
StartFunction
W1?4
W2?4
W3?4
» y % Abfrage des y-Vektors
y = % da keine Angaben zu Schrittweite und Simulationslauf gemacht
36 % wurden, werden Default-Werte benutzt. Wir erhalten 50 mal
36 % dasselbe Ergebnis. Das Ergebnis W1*W2*W3 = 36 ergibt sich
36 % aus 3*4*3. W1=3 durch LoadFcn zu Wert1, W2=4 durch InitFcn zu
36 % Wert2, W3=3 durch LoadFcn zu Wert3. Die Wertzuweisungen durch
36 % die StartFcn wirken sich auf diesen Lauf nicht aus.
..
» [t,x,y]=sim('cb',[0 0]); % Simulationslauf starten (nur 1 Zeipunkt)
W2?5 % Init-Funktion zu Wert2 (Initialisierungsphase der Simulation)
ans =
StartFunction % Start-Funktion zum System (Startphase der Simulation)
W1?5
W2?5
W3?5
» y % Abfrage des y-Vektors. Ergebnis 4*5*4 = 80, bei W1, W3 werden die
y = % Wertzuweisungen der StartFcn des vorangegangenen Simulationslaufes
80 % wirksam, bei W2 die der InitFcn zu Wert2 des aktuellen Laufes.
Auch für das Ende eines Simulationsprozesses sind verschiedene
Zeitpunkte für Callback-Routinen vorgesehen.
Die StopFcn zu einem System wird nach einem Simulationslauf ausgeführt, nachdem die Ergebnisse in den Matlab-Namensraum oder in Dateien geschrieben wurden. Die StopFcn wird häufig dazu benutzt Ergebnisplots auszugeben. Die CloseFcn wird ausgeführt bevor das Modell geschlossen wird (z.B.: File -> Close). Dieser Zeitpunkt bietet sich an, nicht mehr notwendige Objekte auf dem Bildschirm und im Matlab-Namensraum zu löschen. Beispiel 2:Eine Masse m kann sich in x-Richtung um den Punkt x=0 herum bewegen. Auf die Masse wirken ein:
m*x''(t) + c*x'(t) + k*x(t) = 0Die Anfangsbedingungen seien: x(0) = 1, x'(0) = 0Damit haben wir das Simulink-Modell:
» c=1;k=1;m=1;
» [t,x]=sim('A1')
» plot(t,x)
liefern die Graphen von x(t) und x'(t) in einem Fenster. Wir wollen aber sicherstellen,
dass diese Werte immer besetzt sind und definieren deshalb eine PreLoad-Funktion für
das System, die diesen Variablen Default-Werte zuordnet. Dies soll durch das M-File A1PLF
erfolgen, das den folgenden Inhalt hat:
% PreLoadFcn zu Modell A1 c = 1; k = 1; m = 1;Die Verknüpfung von M-File und Simulink-Modell erfolgt mittels Matlab-Kommando:
» set_param('A1','PreLoadFcn','A1PLF')
wenn unser Modell A1 das aktuelle System ist. Beim Aufruf des Modells
A1 erhalten die Variablen jetzt die betreffenden Werte und das Modell
kann nach dem Laden problemlos gestartet werden. Mit dem Kommando:
» set_param('A1','StopFcn','plot(t,x)')
erreichen wir, dass die Ergebnisse nach Ende des Simulationslaufes
automatisch in einem Graphik-Fenster angezeigt werden. Als StopFcn
haben wir diesmal ein Matlab-Kommando angegeben, das t und x als
Argumente benutzt. Wir müssen daher dafür sorgen, dass:
» set_param('A1','CloseFcn','delete(gcf)')
Wie alle Objekte der Matlab-Graphik, werden auch die Fenster durch
spezifische 'Handles' identifiziert. gcf steht für
'get current figure' und ist eine Funktion, die als Funktionswert
das Handle der aktuellen Figur liefert.
Die einzelnen Callback-Routinen sollen hier nur klarmachen, wann die
speziellen Callback-Funktionen ausgeführt werden und wozu man
sie verwenden kann. Für den konkreten Einsatz müssten sie
in verschiedene Richtungen abgesichert werden.
|