サンプル時間継承ルールを指定する S-Function
モデルが親モデルからサンプル時間を継承できるかどうかを判断する Simulink® エンジンでは、モデルの S-Function で、サンプル時間がどのように使用されるのかを指定しなければなりません。この情報は、mdlInitializeSizes
または mdlSetWorkWidths
からマクロ ssSetModelReferenceSampleTimeInheritanceRule
を呼び出すと指定できます。このマクロを使うには、以下のようにします。
S-Function が次のいずれかのマクロを呼び出すかどうかを確認します。
S-Function TLC コードで以下を確認します。
LibBlockSampleTime
CompiledModel.SampleTime
LibBlockInputSignalSampleTime
LibBlockInputSignalOffsetTime
LibBlockOutputSignalSampleTime
LibBlockOutputSignalOffsetTime
検索結果に応じて、次の表に示されているように
ssSetModelReferenceSampleTimeInheritanceRule
を使用します。条件 使用する機能 例 マクロまたは関数のいずれも存在せず、S-Function によってモデルのサンプル時間の継承が阻害されない。 ssSetModelReferenceSampleTimeInheritanceRule (S, USE_DEFAULT_FOR_DISCRETE_INHERITANCE)
マクロまたは関数のいずれかが、次の目的で使用される。
サンプル時間が継承されるか、連続か、または定数の場合、エラーをスローする
ssIsSampleHit
を確認する設定前に
mdlSetInputPortSampleTime
またはmdlSetOutputPortSampleTime
でサンプル時間が継承されるかどうかを確認する
ssSetModelReferenceSampleTimeInheritanceRule... (S,USE_DEFAULT_FOR_DISCRETE_INHERITANCE)
次の
mdlOutputs
のコードについて考えます。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]; }
S-Function がパラメーター、出力などの計算にサンプル時間を使用する。 ssSetModelReferenceSampleTimeInheritanceRule (S, DISALLOW_SAMPLE_TIME_INHERITANCE)
S-Function の例
sfun_multirate.c
からのmdlOutputs
コードを考えます。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 */
メモ:
S-Function が ssSetModelReferenceSampleTimeInheritanceRule
マクロを設定しない場合は、既定の設定で Simulink は、その S-Function が S-Function を含んでいるモデルでのサンプル時間の継承を阻害することはないとみなします。ただし、エンジンは、このマクロが設定されていない S-Function がモデルに含まれていることを示す警告を発します。
[診断] 、 [サンプル時間] ペインでコンフィギュレーション パラメーターの設定を使用して、指定されていないサンプル時間継承ルールがある S-Function を検出したときに Simulink エンジンがどのように反応するかを制御できます。[指定のないサンプル時間の継承] 診断を、[なし]
、[警告]
または [エラー]
に切り替えます。既定の設定は [警告]
です。
Model ブロックのサンプル時間の継承の詳細については、参照モデルのサンプル時間を参照してください。