Main Content

サンプル時間継承ルールを指定する S-Function

モデルが親モデルからサンプル時間を継承できるかどうかを判断する Simulink® エンジンでは、モデルの S-Function で、サンプル時間がどのように使用されるのかを指定しなければなりません。この情報は、mdlInitializeSizes または mdlSetWorkWidths からマクロ ssSetModelReferenceSampleTimeInheritanceRule を呼び出すと指定できます。このマクロを使うには、以下のようにします。

  1. S-Function が次のいずれかのマクロを呼び出すかどうかを確認します。

  2. S-Function TLC コードで以下を確認します。

    • LibBlockSampleTime

    • CompiledModel.SampleTime

    • LibBlockInputSignalSampleTime

    • LibBlockInputSignalOffsetTime

    • LibBlockOutputSignalSampleTime

    • LibBlockOutputSignalOffsetTime

  3. 検索結果に応じて、次の表に示されているように 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 ブロックのサンプル時間の継承の詳細については、参照モデルのサンプル時間を参照してください。

関連するトピック