Contenuto principale

La traduzione di questa pagina non è aggiornata. Fai clic qui per vedere l'ultima versione in inglese.

S-Function

Includere S-function nel modello

  • S-Function block

Librerie:
Simulink / User-Defined Functions

Descrizione

Il blocco S-Function consente di integrare nei modelli di Simulink gli algoritmi di S-function o di funzioni di sistema scritti in C, C++ o Fortran®, noti come C MEX S-function. È possibile utilizzare il blocco per implementare C MEX S-function di Level-1 o Level-2. Per incorporare la S-function in un modello, dopo aver compilato la C MEX S-function:

  1. Trascinare un blocco S-function da Simulink Library Browser nel modello.

  2. Aprire la finestra di dialogo Block Parameters e specificare il nome della S-function nel campo S-function name per fornire la funzionalità al blocco S-function. Ad esempio, digitare timestwo e selezionare Apply.

Una S-function è una descrizione in linguaggio informatico di un blocco Simulink®, scritto in MATLAB®, C, C++ o Fortran. Se sono presenti S-function C, C++ e Fortran, è necessario che siano compilate come file MEX utilizzando l'utilità mex (vedere Build C MEX Function). Le S-function definiscono il funzionamento di un blocco durante le diverse fasi della simulazione, come l'inizializzazione, l'aggiornamento, il calcolo delle derivative, la generazione degli output e il termine. Le S-function utilizzano una sintassi di chiamata speciale denominata API della S-function che consente di interagire con il motore di Simulink. Questa interazione è molto simile a quella che avviene tra il motore e i blocchi Simulink integrati. In ogni fase della simulazione, il motore di simulazione invoca un metodo per svolgere un'attività specifica.

Ad esempio, di seguito è riportato un esempio di una semplice C MEX S-function chiamata timestwo.c che genera un output doppio del suo input.

#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

Le S-function seguono una forma generale e possono ospitare sistemi continui, discreti e ibridi. È possibile implementare un algoritmo in una S-function e utilizzare il blocco S-Function per aggiungerlo a un modello di Simulink. Dopo aver scritto la S-function e averne inserito il nome in un blocco S-Function (disponibile nella libreria di blocchi User-Defined Functions (Funzioni definite dall'utente)), è possibile personalizzare l'interfaccia utente utilizzando il mascheramento. In questo esempio, la funzione timestwo.c viene compilata utilizzando mex timestwo.c e viene implementata utilizzando il blocco S-Function.

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.

Il blocco S-Function visualizza il nome della S-function specificata e il numero delle porte di input e di output specificate dalla S-function. I segnali collegati agli input devono avere le dimensioni specificate dalla S-function per gli input.

Nota

Utilizzare il blocco Level-2 MATLAB S-Function per includere una S-function di MATLAB di livello 2 nel diagramma del blocco.

Esempi

Porte

Input

espandi tutto

È possibile configurare la porta di input utilizzando la funzione di richiamo mdlInitializeSizes. Utilizzare la funzione mdlInitializeSizes per specificare il numero di porte di input, la dimensione dei segnali di input, il tempo di campionamento di ciascuna porta e se le porte sono a passaggio diretto.

Tipi di dati: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point

Output

espandi tutto

È possibile configurare la porta di output utilizzando la funzione di richiamo mdlInitializeSizes. Utilizzare la funzione mdlInitializeSizes per specificare il numero di porte di output, la dimensione dei segnali di output e il tempo di campionamento di ciascuna porta.

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

Parametri

espandi tutto

Utilizzare questo parametro per specificare il nome della S-function.

Utilizzo programmatico

Per impostare il valore del parametro del blocco in modo programmatico, utilizzare la funzione set_param.

Parametro: FunctionName
Valori: 'system' (predefinito) | S-function name in quotes

Specificare ulteriori parametri della S-function.

I parametri della funzione possono essere specificati come espressioni di MATLAB o come variabili separate da virgole. Ad esempio:

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

Sebbene i singoli parametri possano essere racchiusi tra parentesi, l'elenco dei parametri non deve esserlo.

Utilizzo programmatico

Parametro: Parameters
Valori: '' (predefinito) | S-function parameters in quotes

Questo parametro si applica solo se il blocco rappresenta una C MEX S-Function e si intende utilizzare il software Simulink Coder™ per generare codice dal modello contenente il blocco. Se lo si utilizza, quando si è pronti a generare il codice, si deve forzare il codificatore a ricostruire il modello superiore, come spiegato in Control Regeneration of Top Model Code (Simulink Coder).

Per ulteriori informazioni sull'utilizzo di questo parametro, vedere Specify Additional Source Files for an S-Function (Simulink Coder).

Utilizzo programmatico

Parametro: SFunctionModules
Valori: '' (predefinito) | filenames in quotes

Caratteristiche del blocco

Tipi di dati:

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

Passaggio diretto

a

Segnali multidimensionali

a

Segnali di dimensioni variabili

a

Rilevamento zero-crossing

a

a Il supporto effettivo di tipi di dati o funzionalità dipende dall’implementazione del blocco.

Funzionalità estese

espandi tutto

Cronologia versioni

Introduzione prima di R2006a