带向量输入和输出的 Matlab/Simulink S-Function
以下 S-function 示例演示了如何在 Matlab/Simulink 中创建带向量输入和输出的 S-Function。
- 它接受一个 3 元素实数输入向量
- 它将输入逐元素平方
- 它将输出一个 3 元素实数输出向量
通常,在编写向量 I/O S-function 时,请记住:
ssSetInputPortWidth(S, 0, n);或ssSetOutputPortWidth(S, 0, n);将向量中的元素数设置为n。你必须在mdlInitializeSizes中调用此函数。- 输入数据不是作为连续数组给出的,而是作为指针数组给出的!要将其转换为向量:
square_vector.cpp
InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S, 0);
// ...
std::array<double, 3> input = { *uPtrs[0], *uPtrs[1], *uPtrs[2] };- 输出作为指向连续向量的指针给出
square_vector.cpp
square_vector_full.cpp
#define S_FUNCTION_NAME square_vector
#define S_FUNCTION_LEVEL 2
#include "simstruc.h"
// Function: mdlInitializeSizes ==============================================
static void mdlInitializeSizes(SimStruct *S) {
ssSetNumSFcnParams(S, 0); // No parameters
if (!ssSetNumInputPorts(S, 1)) return;
ssSetInputPortWidth(S, 0, 3); // Single input
ssSetInputPortDirectFeedThrough(S, 0, 1); // Direct feedthrough
if (!ssSetNumOutputPorts(S, 1)) return;
ssSetOutputPortWidth(S, 0, 3); // Single output
ssSetNumSampleTimes(S, 1);
ssSetOptions(S, 0);
}
// Function: mdlInitializeSampleTimes =========================================
static void mdlInitializeSampleTimes(SimStruct *S) {
ssSetSampleTime(S, 0, INHERITED_SAMPLE_TIME);
ssSetOffsetTime(S, 0, 0.0);
}
// Function: mdlOutputs ======================================================
static void mdlOutputs(SimStruct *S, int_T tid) {
// Get input signal
InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S, 0);
// Get output signal
real_T *y = ssGetOutputPortRealSignal(S, 0);
// Square the input
y[0] = *uPtrs[0] * *uPtrs[0];
y[1] = *uPtrs[1] * *uPtrs[1];
y[2] = *uPtrs[2] * *uPtrs[2];
}
// Function: mdlTerminate ====================================================
static void mdlTerminate(SimStruct *S) {
// No termination tasks required
}
#ifdef MATLAB_MEX_FILE
#include "simulink.c" // MEX-file interface mechanism
#else
#include "cg_sfun.h" // Code generation registration function
#endifMakefile
Makefile
all:
mex square_vector.cpp
如何在 Simulink 中使用
示例用法:

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