Process the C MEX S-function's parameters
No
C, C++
#define MDL_PROCESS_PARAMETERS void mdlProcessParameters(SimStruct *S)
S
SimStruct representing an S-Function block.
This is an optional routine that the Simulink® engine calls
after mdlCheckParameters
changes and verifies parameters.
The processing is done at the top of the simulation loop when it is
safe to process the changed parameters. This function is only valid
for simulation. C MEX S-functions must enclose the method in a #if
defined(MATLAB_MEX_FILE)
statement.
The purpose of this routine is to process newly changed parameters. An example is to cache parameter changes in work vectors. The engine does not call this routine when it is used with the Simulink Coder™ product. Therefore, if you use this routine in an S-function designed for use with the Simulink Coder product, you must write your S-function so that it doesn't rely on this routine. To do this, you must inline your S-function by using the Target Language Compiler. For information on inlining S-functions, see Inlining S-Functions (Simulink Coder).
This example processes a character vector parameter that mdlCheckParameters
has
verified to be of the form '+++'
(where there could
be any number of '+'
or '-'
characters).
#define MDL_PROCESS_PARAMETERS /* Change to #undef to remove function */ #if defined(MDL_PROCESS_PARAMETERS) && defined(MATLAB_MEX_FILE) static void mdlProcessParameters(SimStruct *S) { int_T i; char_T *plusMinusStr; int_T nInputPorts = ssGetNumInputPorts(S); int_T *iwork = ssGetIWork(S); if ((plusMinusStr=(char_T*)malloc(nInputPorts+1)) == NULL) { ssSetErrorStatus(S,"Memory allocation error in mdlStart"); return; } if (mxGetString(SIGNS_PARAM(S),plusMinusStr,nInputPorts+1) != 0) { free(plusMinusStr); ssSetErrorStatus(S,"mxGetString error in mdlStart"); return; } for (i = 0; i < nInputPorts; i++) { iwork[i] = plusMinusStr[i] == '+'? 1: -1; } free(plusMinusStr); } #endif /* MDL_PROCESS_PARAMETERS */
mdlProcessParameters
is called from mdlStart
to
load the signs character vector prior to the start of the simulation
loop.
#define MDL_START #if defined(MDL_START) static void mdlStart(SimStruct *S) { mdlProcessParameters(S); } #endif /* MDL_START */