S-Functions That Specify Sample Time Inheritance Rules
For the Simulink® engine to determine whether a model can inherit a sample time from a
parent model, the S-functions in the model need to specify how they use sample times.
You can specify this information by calling the macro ssSetModelReferenceSampleTimeInheritanceRule
from
mdlInitializeSizes
or mdlSetWorkWidths
. To
use this macro:
Check whether the S-function calls any of these macros:
Check for these in your S-function TLC code:
LibBlockSampleTime
CompiledModel.SampleTime
LibBlockInputSignalSampleTime
LibBlockInputSignalOffsetTime
LibBlockOutputSignalSampleTime
LibBlockOutputSignalOffsetTime
Depending on your search results, use
ssSetModelReferenceSampleTimeInheritanceRule
as indicated in this table.If... Use... Example None of the macros or functions are present, the S-function does not preclude the model from inheriting a sample time. ssSetModelReferenceSampleTimeInheritanceRule (S, USE_DEFAULT_FOR_DISCRETE_INHERITANCE)
Any of the macros or functions are used for:
Throwing errors if sample time is inherited, continuous, or constant
Checking
ssIsSampleHit
Checking whether sample time is inherited in either
mdlSetInputPortSampleTime
ormdlSetOutputPortSampleTime
before setting
ssSetModelReferenceSampleTimeInheritanceRule... (S,USE_DEFAULT_FOR_DISCRETE_INHERITANCE)
Consider this
mdlOutputs
code:static void mdlOutputs(SimStruct *S, int_T tid) { const real_T *u = (const real_T*) ssGetInputPortSignal(S,0); real_T *y = ssGetOutputPortSignal(S,0); y[0] = ssGetSampleTime(S,tid) * u[0]; }
The S-function uses its sample time for computing parameters, outputs, and so on. ssSetModelReferenceSampleTimeInheritanceRule (S, DISALLOW_SAMPLE_TIME_INHERITANCE)
Consider the
mdlOutputs
code from the S-function examplesfun_multirate.c
:static void mdlOutputs(SimStruct *S, int_T tid) { InputRealPtrsType enablePtrs; int *enabled = ssGetIWork(S); int enableTid = ssGetInputPortSampleTimeIndex(S,ENABLE_IPORT); int signalTid = ssGetInputPortSampleTimeIndex(S,SIGNAL_IPORT); real_T enableTs = ssGetInputPortSampleTime(S,ENABLE_IPORT); real_T enableTsOffset = ssGetInputPortOffsetTime(S,ENABLE_IPORT); if (enableTs == CONTINUOUS_SAMPLE_TIME && enableTsOffset == 0.0) { if (ssIsMajorTimeStep(S) && ssIsContinuousTask(S,tid)) { if (signalTid == enableTid || ssIsSpecialSampleHit(S, signalTid, enableTid, tid)) { enablePtrs = ssGetInputPortRealSignalPtrs(S,ENABLE_IPORT); *enabled = (*enablePtrs[0] > 0.0); } } } else { int enableTid = ssGetInputPortSampleTimeIndex(S,ENABLE_IPORT); if (ssIsSampleHit(S, enableTid, tid)) { if (enableTid == signalTid || ssIsSpecialSampleHit(S, signalTid, enableTid, tid)) { enablePtrs = ssGetInputPortRealSignalPtrs(S,ENABLE_IPORT); *enabled = (*enablePtrs[0] > 0.0); } } } if (ssIsSampleHit(S, signalTid, tid) && (*enabled)) { InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,SIGNAL_IPORT); real_T signal = *uPtrs[0]; int i; for (i = 0; i < NOUTPUTS; i++) { int outTid = ssGetOutputPortSampleTimeIndex(S,i); if (outTid==signalTid || ssIsSpecialSampleHit(S, outTid, signalTid, tid)) { real_T *y = ssGetOutputPortRealSignal(S,i); *y = signal; } } } } /* end mdlOutputs */
Note
If an S-function does not set the
ssSetModelReferenceSampleTimeInheritanceRule
macro, by
default the Simulink engine assumes that the S-function does not preclude the model
containing that S-function from inheriting a sample time. However, the engine issues
a warning indicating that the model includes S-functions for which this macro is not
set.
You can use settings in the Configuration Parameters on the Diagnostics > Sample Time pane to control how the Simulink engine responds when it encounters S-functions that have unspecified
sample time inheritance rules. Toggle the Unspecified
inheritability of sample time diagnostic to
none
,
warning
, or error
. The default
is warning
.
For information about Model block sample time inheritance, see Referenced Model Sample Times.