Contenu principal

La traduction de cette page n'est pas à jour. Cliquez ici pour voir la dernière version en anglais.

S-Function

Inclure une S-function dans un modèle

  • S-Function block

Bibliothèques :
Simulink / User-Defined Functions

Description

Le bloc S-Function vous permet d’intégrer vos algorithmes S-function (fonction système) écrits en C, C++ ou Fortran®, appelés S-functions MEX C, dans les modèles Simulink. Vous pouvez utiliser ce bloc pour implémenter des S-functions MEX C de niveau 1 ou 2. Pour incorporer une S-function dans un modèle, procédez comme suit après l’avoir compilée en S-function MEX C :

  1. Faites glisser un bloc S-function de Simulink Library Browser vers votre modèle.

  2. Ouvrez la boîte de dialogue Block Parameters et spécifiez le nom de la S-function dans le champ S-function name pour affecter une fonctionnalité au bloc S-function. Par exemple, saisissez timestwo et sélectionnez Apply.

Une S-function est une description d'un bloc Simulink® écrite en langage MATLAB®, C, C++ ou Fortran. Si vous utilisez des S-functions en C, C++ ou Fortran, elles doivent être compilées sous forme de fichiers MEX avec l’utilitaire mex (voir Build C MEX Function). Les S-functions définissent le fonctionnement d’un bloc dans les différentes parties d’une simulation telles que l’initialisation, la mise à jour, les dérivées, les sorties et l’arrêt. Les S-functions utilisent une syntaxe d’appel spéciale nommée API S-function permettant d’interagir avec le moteur Simulink. Cette interaction est très semblable à celle qui se produit entre le moteur et les blocs Simulink prédéfinis. À chaque étape d’une simulation, le moteur de simulation invoque une méthode pour accomplir une tâche spécifique.

L’exemple ci-dessous montre une S-function MEX C simple nommée timestwo.c dont la sortie est égale au double de l’entrée.

#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

Les S-functions ont un format général qui s’adapte aux systèmes continus, discrets et hybrides. Vous pouvez implémenter un algorithme dans une S-function et utiliser le bloc S-Function pour l’ajouter à un modèle Simulink. Après avoir écrit votre S-function et indiqué son nom dans un bloc S-Function (disponible dans la bibliothèque de blocs User-Defined Functions), vous pouvez personnaliser l’interface utilisateur par masquage. Dans cet exemple, la fonction timestwo.c est compilée avec mex timestwo.c et implémentée avec le bloc 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.

Le bloc S-Function affiche le nom de la S-function concernée ainsi que le nombre de ports d’entrée et de sortie spécifiés par la S-function. Les signaux connectés aux entrées doivent avoir les dimensions spécifiées pour celles-ci par la S-function.

Remarque

Utilisez le bloc Level-2 MATLAB S-Function pour insérer une S-function MATLAB de niveau 2 dans un schéma bloc.

Exemples

Ports

Entrée

développer tout

Vous pouvez configurer le port d’entrée avec la fonction de callback mdlInitializeSizes. Utilisez la fonction mdlInitializeSizes pour spécifier le nombre de ports d’entrée, la dimension des signaux d’entrée, le pas d’échantillonnage de chaque port et si les ports sont en traversée directe (direct feedthrough).

Types de données : single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fixed point

Sortie(s)

développer tout

Vous pouvez configurer le port de sortie avec la fonction de callback mdlInitializeSizes. Utilisez la fonction mdlInitializeSizes pour spécifier le nombre de ports de sortie, la dimension des signaux de sortie et le pas d’échantillonnage de chaque port.

Types de données : single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | Boolean | fixed point | enumerated | bus

Paramètres

développer tout

Utilisez ce paramètre pour spécifier le nom de votre S-function.

Utilisation programmatique

Pour définir la valeur du paramètre du bloc de manière programmatique, utilisez la fonction set_param.

Paramètre : FunctionName
Valeurs : 'system' (par défaut) | S-function name in quotes

Spécifiez les paramètres supplémentaires de la S-function.

Vous pouvez les spécifier les paramètres de la fonction sous forme d’expressions MATLAB ou de variables séparées par des virgules. Par exemple :

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

Vous pouvez placer des paramètres individuels entre crochets mais la liste de paramètres ne doit pas être entre crochets.

Utilisation programmatique

Paramètre : Parameters
Valeurs : '' (par défaut) | S-function parameters in quotes

Ce paramètre n’est applicable que si ce bloc représente une S-function MEX C et que vous comptez utiliser le software Simulink Coder™ pour générer du code à partir du modèle qui contient le bloc. Si vous l’utilisez, lorsque vous êtes prêt à générer le code, vous devez forcer le codeur à reconstruire le modèle de plus haut niveau comme expliqué dans Control Regeneration of Top Model Code (Simulink Coder).

Pour plus d'informations sur l'utilisation de ce paramètre, voir Specify Additional Source Files for an S-Function (Simulink Coder).

Utilisation programmatique

Paramètre : SFunctionModules
Valeurs : '' (par défaut) | filenames in quotes

Caractéristiques des blocs

Types de données

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

Traversée directe

ouia

Signaux multidimensionnels

ouia

Signaux de taille variable

ouia

Détection des passages à zéro

ouia

a Le support actuel des types de données ou des fonctionnalités dépend de l'implémentation des blocs.

Capacités étendues

développer tout

Historique des versions

Introduit avant R2006a