用于 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.cppCheck 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