Hauptinhalt

Die Übersetzung dieser Seite ist veraltet. Klicken Sie hier, um die neueste Version auf Englisch zu sehen.

S-Function

S-Funktion in Modell einbeziehen

  • S-Function block

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:

  1. Ziehen Sie einen S-function-Block aus dem Simulink Library Browser in Ihr Modell.

  2. Ö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.

Timestwo S-function is implemented using the S-Function block. The input to the block is a sine wave and the output of the block is connected to a Scope block.

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

alle erweitern

Sie können den Eingabeport mithilfe der Callback-Funktion mdlInitializeSizes konfigurieren. Verwenden Sie die Funktion mdlInitializeSizes, um die Anzahl der Eingabeports, die Dimension der Eingabesignale, die Abtastzeit jedes Ports und die Frage, ob es sich um direkte Durchleitungen handelt, anzugeben.

Datentypen: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point

Ausgabe

alle erweitern

Sie können den Ausgabeport mithilfe der Callback-Funktion mdlInitializeSizes konfigurieren. Verwenden Sie die Funktion mdlInitializeSizes, um die Anzahl der Ausgabeports, die Dimension der Ausgabesignale und die Abtastzeit jedes Ports anzugeben.

Datentypen: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | Boolean | fixed point | enumerated | bus

Parameter

alle erweitern

Verwenden Sie diesen Parameter, um den Namen Ihrer S-Funktion anzugeben.

Programmatische Verwendung

Um den Wert des Blockparameters programmatisch festzulegen, verwenden Sie die Funktion set_param.

Parameter: FunctionName
Werte: 'system' (Standardeinstellung) | S-function name in quotes

Geben Sie die zusätzlichen S-Funktions-Parameter an.

Die Funktionsparameter können als MATLAB-Ausdrücke oder als durch Kommas getrennte Variablen angegeben werden. Beispiel:

A, B, C, D, [eye(2,2);zeros(2,2)]

Auch wenn einzelne Parameter in Klammern gesetzt werden können, darf die Liste der Parameter nicht in Klammern gesetzt werden.

Programmatische Verwendung

Parameter: Parameters
Werte: '' (Standardeinstellung) | S-function parameters in quotes

Dieser Parameter ist nur relevant, wenn dieser Block eine C MEX S-Funktion darstellt und Sie die Software Simulink Coder™ verwenden möchten, um Code aus dem Modell zu generieren, das den Block enthält. Wenn Sie sie verwenden, müssen Sie, wenn Sie bereit sind, Code zu generieren, den Codierer zwingen, das Top-Modell neu zu erstellen, wie in unter Control Regeneration of Top Model Code (Simulink Coder) erläutert.

Weitere Informationen zur Verwendung dieses Parameters finden Sie unter Specify Additional Source Files for an S-Function (Simulink Coder).

Programmatische Verwendung

Parameter: SFunctionModules
Werte: '' (Standardeinstellung) | filenames in quotes

Blockeigenschaften

Datentypen

Booleana | busa | doublea | fixed pointa | halfa | integera | singlea | stringa

Direct Feedthrough

Jaa

Mehrdimensionale Signale

Jaa

Signale mit variabler Größe

Jaa

Erkennung von Nulldurchgängen

Jaa

a Der tatsächliche Datentyp oder die Unterstützung von Fähigkeiten hängen von der Blockimplementierung ab.

Erweiterte Fähigkeiten

alle erweitern

Versionsverlauf

Eingeführt vor R2006a