S-функция фиктивного вывода для Simulink

Эта минимальная 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