[an error occurred while processing this directive]   Suche  

S-Functions

Eine 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 Block

Eine 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.

S-Function-Block

Im zugehörigen Parameterfenster zu diesem Block:

S-Function-Block

legt man dann den Namen der S-Funktion fest. Dieser Name erscheint auch im S-Funktions-Block (hier: system). Ausserdem werden hier die Blockparameter p festgelegt.

Wie andere Simulink-Blöcke auch, hat ein S-Funktions-Block:

  • einen Eingabevektor u
  • einen Zustandsvektor x
  • einen Ausgabevektor y
wobei der eine oder andere Vektor im Einzelfall auch entfallen kann.

M-File zu einer S-Funktion

Ein 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:
  • t für die aktuelle Zeit
  • x für den aktuellen Zustand des S-Funktions-Blocks
  • u für den Eingabevektor
  • flag für einen numerischen Wert, der die Aufgabe der S-Funktion festlegt
  • p1,p2,... für die Blockparameter
Im Laufe der Simulation wird eine S-Funktion wiederholt mit unterschiedlichen Werten für flag aufgerufen und muss dann die dementsprechende Ausgabe liefern.

Beispiel 1:

Wir betrachten das folgende Modell:

Modell mit S-Function

mit einer S-Function, die ein Eingabesignal empfängt und zwei Ausgabesignale liefert. Als Name der S-Function wurde kreis angegeben, es wurden keine Parameter angegeben.

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:
  • keine kontinuierlichen Zustandswerte (sizes.NumContStates = 0;)
  • keine diskreten Zustandswerte (sizes.NumDiscStates = 0;)
  • 2 Ausgabewerte (sizes.NumOutputs = 2;)
  • 1 Eingabewert (sizes.NumInputs = 1;)
Ferner sind die Ausgabewerte Funktionen des Eingabewertes (sizes.DirFeedthrough = 1;), es können also algebraische Schleifen entstehen. Der Wert 1 steht hier für das logische 'wahr', nicht für einen numerischen Wert.

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