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
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 :
Faites glisser un bloc S-function de Simulink Library Browser vers votre modèle.
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.
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
Sortie(s)
Paramètres
Caractéristiques des blocs
Types de données |
|
Traversée directe |
|
Signaux multidimensionnels |
|
Signaux de taille variable |
|
Détection des passages à zéro |
|
a Le support actuel des types de données ou des fonctionnalités dépend de l'implémentation des blocs. |
Capacités étendues
Historique des versions
Introduit avant R2006a