Dummy-Output-S-Function für Simulink

Diese minimale S-Function implementiert eine Dummy-Output-Funktion. Sie empfängt ein Double-Eingangssignal und ignoriert es vollständig. Sie führt keine weitere Aktion aus.

Diese S-Function kann verwendet werden, um zu verhindern, dass Simulink Blöcke wegoptimiert, die keine Auswirkung auf den Modell-Output haben. Wenn du beispielsweise einen Block hast, der einige Berechnungen durchführt, aber dessen Output nirgendwo verwendet wird, könnte Simulink ihn während der Codegenerierung wegoptimieren. Indem du den Output eines solchen Blocks mit dieser Dummy-Output-S-Function verbindest, kannst du sicherstellen, dass der Block im Modell verbleibt, da Simulink nicht feststellen kann, ob der Output verwendet wird oder nicht.

dummy_output.cpp

dummy_output.cpp
#define S_FUNCTION_NAME  dummy_output
#define S_FUNCTION_LEVEL 2

#include "simstruc.h"
#include <cstdio>  // Für Dateiverarbeitung

static void mdlInitializeSizes(SimStruct *S)
{
    ssSetNumSFcnParams(S, 0);  // Keine Parameter
    ssSetNumContStates(S, 0);  // Keine kontinuierlichen Zustände
    ssSetNumDiscStates(S, 0);  // Keine diskreten Zustände
    // 1 Eingangsport mit 1 Element
    if (!ssSetNumInputPorts(S, 1)) return;
    ssSetInputPortWidth(S, 0, 1);  // Eingangsport-Breite = 1
    ssSetInputPortDataType(S, 0, SS_DOUBLE);
    ssSetInputPortComplexSignal(S, 0, COMPLEX_NO);

    ssSetInputPortRequiredContiguous(S, 0, 1);  // Zusammenhängenden Eingangsport-Speicher erforderlich
    // ssSetInputPortDirectFeedThrough(S, 0, 1);  // Direct Feedthrough

    // Keine Ausgangsports
    if (!ssSetNumOutputPorts(S, 0)) return;
    // Abtastzeiten
    ssSetNumSampleTimes(S, 1);  // Einzelne Abtastzeit

    // Work-Vektoren
    ssSetNumRWork(S, 0);  // Real-Work-Vektor
    ssSetNumIWork(S, 0);  // Integer-Work-Vektor
    ssSetNumPWork(S, 0);  // Pointer-Work-Vektor für Dateizeiger
    ssSetNumModes(S, 0);  // Mode-Vektor
    ssSetNumNonsampledZCs(S, 0);  // Nulldurchgänge

    // S-Function-Block zur Verwendung in einem Real-Time Workshop-generierten Modell befähigen
    ssSetOptions(S, 0);
}

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

// Funktion: mdlInitializeSampleTimes =========================================
// Abstract:
//    Abtastzeiten auf 1ms (1kHz) initialisieren
static void mdlInitializeSampleTimes(SimStruct *S)
{
    ssSetInputPortSampleTime(S, 0, INHERITED_SAMPLE_TIME);
    ssSetOffsetTime(S, 0, 0.0);
}

// Für dieses Beispiel nicht benötigt
static void mdlOutputs(SimStruct *S, int_T tid) {
    // Nichts tun
}

#define MDL_UPDATE
static void mdlUpdate(SimStruct *S, int_T tid)
{
    // Wert ignorieren - dies ist nur ein Dummy-Output
}

static void mdlTerminate(SimStruct *S)
{
}

// Erforderlicher S-Function-Trailer
#ifdef MATLAB_MEX_FILE
#include "simulink.c"   // MEX-Datei-Schnittstellenmechanismus
#else
#include "cg_sfun.h"    // Codegenerierungs-Schnittstelle
#endif

Kompilieren

compile_dummy_output.sh
mex dummy_output.cpp

Ähnliche Beiträge nach Kategorie: Matlab/Simulink