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
#endifKompilieren
compile_dummy_output.sh
mex dummy_output.cppÄhnliche Beiträge nach Kategorie:
Matlab/Simulink
Wenn dieser Beitrag dir geholfen hat, erwäge, mir einen Kaffee zu spendieren oder per PayPal zu spenden, um die Recherche und Veröffentlichung neuer Beiträge auf TechOverflow zu unterstützen