Simulink : fonction S de sortie factice

Cette fonction S minimale implémente une fonction de sortie factice. Elle reçoit un signal d’entrée de type double et l’ignore complètement. Elle n’effectue aucune autre action.

Cette fonction S peut être utilisée pour empêcher Simulink d’optimiser (supprimer) les blocs qui n’ont aucun effet sur la sortie du modèle. Par exemple, si vous avez un bloc qui effectue des calculs mais dont la sortie n’est utilisée nulle part, Simulink pourrait le supprimer lors de la génération de code. En connectant la sortie d’un tel bloc à cette fonction S de sortie factice, vous pouvez garantir que le bloc reste dans le modèle, car Simulink ne peut pas déterminer si la sortie est utilisée ou non.

dummy_output.cpp

dummy_output.cpp
#define S_FUNCTION_NAME  dummy_output
#define S_FUNCTION_LEVEL 2

#include "simstruc.h"
#include <cstdio>  // Pour la gestion des fichiers

static void mdlInitializeSizes(SimStruct *S)
{
    ssSetNumSFcnParams(S, 0);  // Aucun paramètre
    ssSetNumContStates(S, 0);  // Aucun état continu
    ssSetNumDiscStates(S, 0);  // Aucun état discret
    // 1 port d'entrée avec 1 élément
    if (!ssSetNumInputPorts(S, 1)) return;
    ssSetInputPortWidth(S, 0, 1);  // Largeur du port d'entrée = 1
    ssSetInputPortDataType(S, 0, SS_DOUBLE);
    ssSetInputPortComplexSignal(S, 0, COMPLEX_NO);

    ssSetInputPortRequiredContiguous(S, 0, 1);  // Exiger une mémoire contiguë pour le port d'entrée
    // ssSetInputPortDirectFeedThrough(S, 0, 1);  // Feedthrough direct

    // Aucun port de sortie
    if (!ssSetNumOutputPorts(S, 0)) return;
    // Temps d'échantillonnage
    ssSetNumSampleTimes(S, 1);  // Temps d'échantillonnage unique

    // Vecteurs de travail
    ssSetNumRWork(S, 0);  // Vecteur de travail réel
    ssSetNumIWork(S, 0);  // Vecteur de travail entier
    ssSetNumPWork(S, 0);  // Vecteur de travail de pointeur pour le pointeur de fichier
    ssSetNumModes(S, 0);  // Vecteur de mode
    ssSetNumNonsampledZCs(S, 0);  // Traversées de zéro

    // Rendre le bloc de fonction S utilisable dans un modèle généré par Real-Time Workshop
    ssSetOptions(S, 0);
}

#define MDL_START
static void mdlStart(SimStruct *S) {
}

// Fonction : mdlInitializeSampleTimes =========================================
// Résumé :
//    Initialiser les temps d'échantillonnage à 1 ms (1 kHz)
static void mdlInitializeSampleTimes(SimStruct *S)
{
    ssSetInputPortSampleTime(S, 0, INHERITED_SAMPLE_TIME);
    ssSetOffsetTime(S, 0, 0.0);
}

// Non nécessaire pour cet exemple
static void mdlOutputs(SimStruct *S, int_T tid) {
    // Ne rien faire
}

#define MDL_UPDATE
static void mdlUpdate(SimStruct *S, int_T tid)
{
    // Ignorer la valeur - il s'agit simplement d'une sortie factice
}

static void mdlTerminate(SimStruct *S)
{
}

// Trailer requis pour la fonction S
#ifdef MATLAB_MEX_FILE
#include "simulink.c"   // Mécanisme d'interface de fichier MEX
#else
#include "cg_sfun.h"    // Interface de génération de code
#endif

Comment compiler

compile_dummy_output.sh
mex dummy_output.cpp

Check out similar posts by category: Matlab/Simulink