S-Function
S-Funktion in Modell einbeziehen
Bibliotheken:
Simulink /
User-Defined Functions
Beschreibung
Mit dem S-Function-Block können Sie Ihre in C, C++ oder Fortran® geschriebenen S-Funktions- oder Systemfunktionsalgorithmen, die als C MEX S-Funktionen bekannt sind, in Simulink-Modelle integrieren. Sie können den Block verwenden, um C-MEX-S-Funktionen der Ebene 1 oder 2 zu implementieren. Um Ihre S-Funktion in ein Modell zu integrieren, gehen Sie nach dem Kompilieren Ihrer C MEX S-Funktion wie folgt vor:
Ziehen Sie einen S-function-Block aus dem Simulink Library Browser in Ihr Modell.
Öffnen Sie das Dialogfeld Block Parameters und geben Sie den Namen der S-Funktion im Feld S-function name an, um die Funktionalität für den S-function-Block bereitzustellen. Geben Sie beispielsweise
timestwo
ein und wählen Sie Apply aus.
Eine S-Function ist eine computersprachliche Beschreibung eines Simulink®-Blocks in MATLAB®, C, C++ oder Fortran. Wenn Sie C, C++ oder Fortran S-Funktionen haben, müssen diese mithilfe des mex
-Dienstprogramms als MEX-Dateien kompiliert werden (siehe Build C MEX Function). S-Funktionen definieren, wie ein Block während verschiedener Teile der Simulation funktioniert, z. B. Initialisierung, Aktualisierung, Ableitungen, Ausgaben und Beendigung. S-Funktionen verwenden eine spezielle Aufrufsyntax, die S-Funktions-API, die Ihnen die Interaktion mit der Simulink-Engine ermöglicht. Diese Interaktion ist der Interaktion zwischen der Engine und den integrierten Simulink-Blöcken sehr ähnlich. Bei jedem Schritt einer Simulation wird eine Methode von der Simulations-Engine aufgerufen, um eine bestimmte Aufgabe zu erfüllen.
Unten sehen Sie beispielsweise eine einfache C MEX S-Funktion namens timestwo.c
, die das Doppelte ihrer Eingabe ausgibt.
#define S_FUNCTION_NAME timestwo /* Specifies the name of the S-function (timestwo) */
#define S_FUNCTION_LEVEL 2 /* Specifies that the S-function is in the Level 2 format */
#include "simstruc.h" /* Defines the data structure */
static void mdlInitializeSizes(SimStruct *S) /* Initialize the input and output ports and their size */
{
ssSetNumSFcnParams(S, 0);
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
return; /* Parameter mismatch reported by the Simulink engine*/
}
if (!ssSetNumInputPorts(S, 1)) return;
ssSetInputPortWidth(S, 0, DYNAMICALLY_SIZED);
ssSetInputPortDirectFeedThrough(S, 0, 1);
if (!ssSetNumOutputPorts(S,1)) return;
ssSetOutputPortWidth(S, 0, DYNAMICALLY_SIZED);
ssSetNumSampleTimes(S, 1);
/* Take care when specifying exception free code - see sfuntmpl.doc */
ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE);
}
static void mdlInitializeSampleTimes(SimStruct *S) /* Set the sample time of the S-function as inherited */
{
ssSetSampleTime(S, 0, INHERITED_SAMPLE_TIME);
ssSetOffsetTime(S, 0, 0.0);
}
static void mdlOutputs(SimStruct *S, int_T tid) /* Calculate the block output for each time step */
{
int_T i;
InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,0);
real_T *y = ssGetOutputPortRealSignal(S,0);
int_T width = ssGetOutputPortWidth(S,0);
for (i=0; i<width; i++) {
*y++ = 5.0 *(*uPtrs[i]);
}
}
static void mdlTerminate(SimStruct *S){} /* Perform tasks at the end of the simulation */
#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */
#include "simulink.c" /* MEX-file interface mechanism */
#else
#include "cg_sfun.h" /* Code generation registration function */
#endif
S-Funktionen folgen einer allgemeinen Form und können kontinuierliche, diskrete und hybride Systeme aufnehmen. Sie können einen Algorithmus in eine S-Funktion implementieren und den S-Funktionsblock verwenden, um ihn einem Simulink-Modell hinzuzufügen. Nachdem Sie Ihre S-Funktion geschrieben und ihren Namen in einem S-Funktionsblock (verfügbar in der Blockbibliothek für benutzerdefinierte Funktionen) platziert haben, können Sie die Benutzeroberfläche mithilfe von Maskierung anpassen. In diesem Beispiel wird die Funktion timestwo.c
mit mex timestwo.c
kompiliert und mit dem S-Function-Block implementiert.
Der S-Function-Block zeigt den Namen der angegebenen S-Funktion und die Anzahl der durch die S-Funktion angegebenen Eingabe- und Ausgabeports an. Signale, die mit den Eingabe verbunden sind, müssen die durch die S-Funktion für die Eingaben angegebenen Dimensionen aufweisen.
Hinweis
Verwenden Sie den Level-2 MATLAB S-Function-Block, um eine MATLAB-S-Funktion der Ebene 2 in ein Blockdiagramm aufzunehmen.
Beispiele
Ports
Eingabe
Ausgabe
Parameter
Blockeigenschaften
Datentypen |
|
Direct Feedthrough |
|
Mehrdimensionale Signale |
|
Signale mit variabler Größe |
|
Erkennung von Nulldurchgängen |
|
a Der tatsächliche Datentyp oder die Unterstützung von Fähigkeiten hängen von der Blockimplementierung ab. |
Erweiterte Fähigkeiten
Versionsverlauf
Eingeführt vor R2006a