[an error occurred while processing this directive]
S-FunctionsEine S-Funktion (system function) ist die Beschreibung eines Simulink-Blockes in Matlab oder Maschinen-Code, wobei der Maschinen-Code zur Zeit aus C, C++, Ada oder Fortran erzeugt werden kann und in Form eines MEX-Files vorliegen muss.S-Funktionen erlauben dem Anwender den Block-Vorrat von Simulink den eigenen Bedürfnissen entsprechend zu erweitern. Die Einbindung in Simulink-Prozesse erfordert auf Seiten der S-Funktionen eine spezielle Syntax, die wir hier nur anhand von Matlab-S-Functions erlätern. S-Function BlockEine S-Funktion wird mit Hilfe eines S-Function-Blockes in ein Simulink-Modell eingefügt. In Simulink 3 findet man diesen Block in der Bibliothek Functions & Tables.
Wie andere Simulink-Blöcke auch, hat ein S-Funktions-Block:
M-File zu einer S-FunktionEin M-File zu einer S-Funktion wird in der Form:[sys,x0,str,ts] = f(t,x,u,flag,p1,p2,....)aufgerufen und muss dementsprechend geschrieben werden. Dabei steht:
Beispiel 1:Wir betrachten das folgende Modell:
Das M-File kreis.m wird in diesem Falle nur mit den flag-Werten 0 und 3 aufgerufen und lautet:
% M-file kreis
function [sys,x0,str,ts] = kreis(t,x,u,flag)
switch flag
case 0
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 2;
sizes.NumInputs = 1;
sizes.DirFeedthrough = 1;
sys = simsizes(sizes);
case 3
sys = [cos(u),sin(u)];
end
Im Falle des Aufrufes mit flag=0 muss die S-Funktion eine
sizes-Struktur zurückliefern, die wir zunächst leer
mit:
sizes = simsizes;erzeugen. Eine Struktur ist eine Menge von Daten, deren Elemente durch Namen und nicht wie bei einem Feld durch Nummern identifiziert werden. Danach besetzen wir einige der Struktur-Elemente: sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 2;
sizes.NumInputs = 1;
sizes.DirFeedthrough = 1;
Die S-Funktion hat demnach:
Die gefüllte Struktur weisen wir dann mit: sys = simsizes(sizes);der Ausgabevariablen sys zu. Die restlichen Ausgabevariablen müssen aus syntaktischen Gründen in der Definition der S-Funktion aufgeführt werden, müssen hier aber nicht mit Werten besetzt werden. Jede S-Funktion wird im Simulationslauf mit flag=0 aufgerufen. Der Aufruf mit flag=3 erfolgt, wenn die S-Funktion die Ausgabewerte liefern soll. In unserem Falle läuft die Simulation von 0 bis 2*pi und die Eingabevariable u gibt die Zeit an. Die S-Funktion liefert die beiden Ausgabewerte cos(u) und sin(u), so dass im XY-Graphen (bei einheitlicher Skalierung) ein Kreis gezeichnet wird.
Beispiel 2:Differentialgleichungssysteme fallen häufig in der Form A(x)*x'=F(x) an. In Matlab gibt es Integratoren, die diese Form direkt integrieren, was sich aus verschiedenen Gründen auch empfiehlt. In Simulink muss man solche Systeme zur Zeit noch in die Form x' = A^(-1)(x)*F(x) bringen bzw. das Gleichungssystem A(x)*x' = F(x) nach x' auflösen, sofern dies möglich ist.Im folgenden Modell wird eine S-Funktion verwendet, die einen Vektor der Länge 2 als Eingabesignal empfängt und daraus der Reihe nach F(x), A(x) sowie die Lösung y=A\F der Gleichung A(x)*y = F(x) berechnet und als Ausgangssignal den Vektor y der Länge 2 liefert. Die Matrix A nähert sich im Laufe der Zeit immer näher einer singulären Matrix, was sich hier jedoch nicht auswirkt. Nebenbei sei bemerkt, dass man hier ohne Mühe beliebig grosse Differentialgleichungssysteme formulieren kann, was mit Hilfe der vorhandenen Simulink-Blöcke meist sehr aufwendig ist. Das zugehörige M-File AinvF lautet: % M-file AinvF function [sys,x0,str,ts] = kreis(t,x,u,flag) switch flag case 0 sizes = simsizes; sizes.NumContStates = 0; sizes.NumDiscStates = 0; sizes.NumOutputs = 2; sizes.NumInputs = 2; sizes.DirFeedthrough = 1; sys = simsizes(sizes); case 3 F = [ u(1)^2 + 2*u(2); u(1)*u(2) + 2*u(2) ]; A = [ 2*u(1), 2; u(2), u(1) + 2 ]; sys = -A\F; end |