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
#endifComment compiler
compile_dummy_output.sh
mex dummy_output.cppCheck out similar posts by category:
Matlab/Simulink
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow