// -*-c++-*-
// <mtt_model_name>_sfun.c:
// Matlab S-function simulation of <mtt_model_name>
#define S_FUNCTION_NAME <mtt_model_name>_sfun
#define S_FUNCTION_LEVEL 2
#include "simstruc.h"
#include "<mtt_model_name>_def.h"
static mxArray *dX = mxCreateDoubleMatrix (MTTNX , 1, mxREAL);
static mxArray *P = mxCreateDoubleMatrix (MTTNPAR , 1, mxREAL);
static mxArray *T = mxCreateDoubleMatrix (1 , 1, mxREAL);
static mxArray *U = mxCreateDoubleMatrix (MTTNU , 1, mxREAL);
static mxArray *X = mxCreateDoubleMatrix (MTTNX , 1, mxREAL);
static mxArray *Y = mxCreateDoubleMatrix (MTTNY , 1, mxREAL);
static mxArray *YZ = mxCreateDoubleMatrix (MTTNYZ , 1, mxREAL);
static double *mttdx = mxGetPr (dX);
static double *mttu = mxGetPr (U);
static double *mttpar = mxGetPr (P);
static double *mttx = mxGetPr (X);
static double *mtty = mxGetPr (Y);
static double *mttyz = mxGetPr (YZ);
static double *mtttp = mxGetPr (T);
void
update_parameters_from_simulink (SimStruct *S)
{
for (int i = 0; i < MTTNPAR; i++) {
mttpar [i] = *mxGetPr (ssGetSFcnParam (S, i));
}
}
void
update_states_from_simulink (SimStruct *S)
{
static double *x;
x = ssGetContStates (S);
for (int i = 0; i < MTTNX; i++) {
mttx [i] = x [i];
}
}
void
update_inputs_from_simulink (SimStruct *S)
{
for (int i = 0; i < MTTNU; i++) {
mttu [i] = *ssGetInputPortRealSignalPtrs (S, i)[0];
}
}
void
update_simtime_from_simulink (SimStruct *S)
{
mtttp [0] = ssGetT (S);
}
// S-function methods
static void mdlInitializeSizes(SimStruct *S)
{
ssSetNumSFcnParams(S, MTTNPAR);
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
return;
}
ssSetNumContStates(S, MTTNX);
ssSetNumDiscStates(S, 0);
if (!ssSetNumInputPorts(S, MTTNU)) return;
for (int i = 0; i < MTTNU; i++) {
ssSetInputPortWidth(S, i, 1);
ssSetInputPortDirectFeedThrough(S, i, 1);
}
if (!ssSetNumOutputPorts(S, MTTNY)) return;
for (int i = 0; i < MTTNY; i++) {
ssSetOutputPortWidth(S, i, 1);
}
ssSetNumSampleTimes(S, 1);
ssSetNumRWork(S, 0);
ssSetNumIWork(S, 0);
ssSetNumPWork(S, 0);
ssSetNumModes(S, 0);
ssSetNumNonsampledZCs(S, 0);
ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE);
}
static void mdlInitializeSampleTimes(SimStruct *S)
{
ssSetSampleTime(S, 0, CONTINUOUS_SAMPLE_TIME);
ssSetOffsetTime(S, 0, 0.0);
}
#define MDL_INITIALIZE_CONDITIONS
static void mdlInitializeConditions(SimStruct *S)
{
update_parameters_from_simulink (S);
#include "<mtt_model_name>_state.sfun"
for (int i = 0; i < MTTNX; i++) {
ssGetContStates (S)[i] = mttx [i];
}
}
static void mdlOutputs(SimStruct *S, int_T tid)
{
update_states_from_simulink (S);
update_inputs_from_simulink (S);
update_simtime_from_simulink (S);
update_parameters_from_simulink (S);
UNUSED_ARG(tid); // not used in single tasking mode
#include "<mtt_model_name>_odeo.sfun"
for (int i = 0; i < MTTNY; i++) {
ssGetOutputPortRealSignal (S,i)[0] = mtty [i];
}
}
#define MDL_DERIVATIVES
static void mdlDerivatives(SimStruct *S)
{
update_states_from_simulink (S);
update_inputs_from_simulink (S);
update_simtime_from_simulink (S);
update_parameters_from_simulink (S);
#include "<mtt_model_name>_ode.sfun"
for (int i = 0; i < MTTNX; i++) {
ssGetdX (S)[i] = mttdx [i];
}
}
static void mdlTerminate(SimStruct *S)
{
UNUSED_ARG(S);
}
#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */
#include "simulink.c" /* MEX-file interface mechanism */
#else
#include "cg_sfun.h" /* Code generation registration function */
#endif