用于 Simulink 的虚拟输出 S-Function

这个最小化的 S-Function 实现了一个虚拟输出函数。它接收一个 double 类型的输入信号并完全忽略它,不执行任何其他操作。

这个 S-Function 可用于防止 Simulink 优化掉那些对模型输出没有影响的模块。例如,如果你有一个执行某些计算的模块,但其输出在任何地方都没有被使用,Simulink 可能会在代码生成期间将其优化掉。通过将此类模块的输出连接到此虚拟输出 S-Function,你可以确保该模块保留在模型中,因为 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);  // 实数工作向量
    ssSetNumIWork(S, 0);  // 整数工作向量
    ssSetNumPWork(S, 0);  // 指针工作向量,用于文件指针
    ssSetNumModes(S, 0);  // 模式向量
    ssSetNumNonsampledZCs(S, 0);  // 过零检测

    // 使 S-Function 模块可用于 Real-Time Workshop 生成的模型
    ssSetOptions(S, 0);
}

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

// 函数:mdlInitializeSampleTimes =========================================
// 摘要:
//    将采样时间初始化为 1ms(1kHz)
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-Function 尾部
#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