Эта минимальная S-функция реализует функцию фиктивного вывода. Она принимает входной сигнал double и полностью его игнорирует. Она не выполняет никаких дальнейших действий.
Эта S-функция может использоваться для предотвращения оптимизации Simulink блоков, не влияющих на выход модели. Например, если у вас есть блок, выполняющий некоторые вычисления, но его выход нигде не используется, Simulink может оптимизировать его при генерации кода. Подключив выход такого блока к этой S-функции фиктивного вывода, вы можете гарантировать, что блок останется в модели, поскольку Simulink не может определить, используется выход или нет.
dummy_output.cpp
dummy_output.cpp
#define S_FUNCTION_NAME dummy_output
#define S_FUNCTION_LEVEL 2
#include "simstruc.h"
#include <cstdio> // Для работы с файлами
static void mdlInitializeSizes(SimStruct *S)
{
ssSetNumSFcnParams(S, 0); // Нет параметров
ssSetNumContStates(S, 0); // Нет непрерывных состояний
ssSetNumDiscStates(S, 0); // Нет дискретных состояний
// 1 входной порт с 1 элементом
if (!ssSetNumInputPorts(S, 1)) return;
ssSetInputPortWidth(S, 0, 1); // Ширина входного порта = 1
ssSetInputPortDataType(S, 0, SS_DOUBLE);
ssSetInputPortComplexSignal(S, 0, COMPLEX_NO);
ssSetInputPortRequiredContiguous(S, 0, 1); // Требовать непрерывную память входного порта
// ssSetInputPortDirectFeedThrough(S, 0, 1); // Прямой проход
// Нет выходных портов
if (!ssSetNumOutputPorts(S, 0)) return;
// Времена сэмплирования
ssSetNumSampleTimes(S, 1); // Одно время сэмплирования
// Рабочие векторы
ssSetNumRWork(S, 0); // Вектор real work
ssSetNumIWork(S, 0); // Вектор integer work
ssSetNumPWork(S, 0); // Вектор pointer work для указателя на файл
ssSetNumModes(S, 0); // Вектор режимов
ssSetNumNonsampledZCs(S, 0); // Пересечения нуля
// Сделать S-функциональный блок пригодным для использования в модели, сгенерированной Real-Time Workshop
ssSetOptions(S, 0);
}
#define MDL_START
static void mdlStart(SimStruct *S) {
}
// Function: mdlInitializeSampleTimes =========================================
// Abstract:
// Инициализация времён сэмплирования как 1мс (1кГц)
static void mdlInitializeSampleTimes(SimStruct *S)
{
ssSetInputPortSampleTime(S, 0, INHERITED_SAMPLE_TIME);
ssSetOffsetTime(S, 0, 0.0);
}
// Не нужно для этого примера
static void mdlOutputs(SimStruct *S, int_T tid) {
// Ничего не делать
}
#define MDL_UPDATE
static void mdlUpdate(SimStruct *S, int_T tid)
{
// Игнорировать значение - это просто фиктивный вывод
}
static void mdlTerminate(SimStruct *S)
{
}
// Требуемый трейлер S-функции
#ifdef MATLAB_MEX_FILE
#include "simulink.c" // Механизм интерфейса MEX-файла
#else
#include "cg_sfun.h" // Интерфейс генерации кода
#endifКак скомпилировать
compile_dummy_output.sh
mex dummy_output.cpp
Check 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