Main Content

MATLAB 関数での永続変数の初期化

"永続変数" は、関数の呼び出し間でその値がメモリに保持される、MATLAB® 関数のローカル変数です。モデルからコードを生成する場合は、MATLAB 関数の永続変数を初期化する必要があります。詳細については、persistent を参照してください。

永続変数を含む MATLAB 関数を Simulink® モデルで使用する場合は、以下のガイドラインに従う必要があります。

  • 関数内の永続変数は、定数へのアクセスのみで初期化します。

  • 関数の制御フローが、初期化が行われるかどうかに依存しないことを確認します。

これらのガイドラインに従わない場合、次のような条件で初期化エラーが発生します。

  • [直達を許可] プロパティがオフになっている、永続変数を含む MATLAB Function ブロック

  • [状態制御][同期] に設定されている State Control ブロックを含むモデル内の、永続変数を含む MATLAB Function ブロック

  • Moore マシン セマンティクスを実装し、永続変数を含む MATLAB 関数を使用する Stateflow® チャート

たとえば、次の関数 fcn では永続変数 n が使用されています。fcn は両方のガイドラインに違反しています。n の初期値は入力 u に応じて異なり、return ステートメントは関数の通常の制御フローへの割り込みを行います。したがって、上記のいずれかの条件を備えたモデルでこのコードを使用すると、エラーが発生します。

function y = fcn(u)
    persistent n
        
    if isempty(n)
        n = u;
        y = 1;
        return
    end
    
    y = n;
    n = n + u; 
end

エラーを防ぐには、永続変数を定数値に設定し、return ステートメントを削除して永続変数を初期化します。次の修正バージョンの fcn は、エラーを生成せずに永続変数を初期化します。

function y = fcn(u)
    persistent n
        
    if isempty(n)
        n = 1;
    end
    
    y = n;
    n = n + u; 
end

直達がない MATLAB Function ブロック

このモデルには、前述した最初のバージョンの fcn を使用する MATLAB Function ブロックが含まれます。この MATLAB Function ブロックの入力は、Sign ブロックと Sine Wave ブロックによって指定される矩形波です。この MATLAB Function ブロックは、各タイム ステップで、u の値を永続変数 n に追加します。

モデルのシミュレーションを実行します。このシミュレーションでは、次の理由によりエラーが返されます。

  • 永続変数 n の初期値が入力 u に応じて異なる。

  • return ステートメントは、関数の通常の制御フローへの割り込みを行います。

  • MATLAB Function ブロックの [直達を許可] プロパティがオフになっています。

MATLAB Function ブロック コードを、修正バージョンの fcn に示すように変更します。モデルのシミュレーションを再度実行します。

同期モードの State Control ブロック

このモデルには、前述した最初のバージョンの fcn を使用する MATLAB Function ブロックが含まれます。この MATLAB Function ブロックの入力は、Sign ブロックと Sine Wave ブロックによって指定される矩形波です。この MATLAB Function ブロックは、各タイム ステップで、u の値を永続変数 n に追加します。このモデルには、[状態制御][Synchronous] に設定されている State Control ブロックが含まれます。

モデルのシミュレーションを実行します。このシミュレーションでは、次の理由によりエラーが返されます。

  • 永続変数 n の初期値が入力 u に応じて異なる。

  • return ステートメントは、関数の通常の制御フローへの割り込みを行います。

  • このモデルには、[状態制御][Synchronous] に設定されている State Control ブロックが含まれます。

MATLAB Function ブロック コードを、修正バージョンの fcn に示すように変更します。モデルのシミュレーションを再度実行します。

Moore セマンティクスを実装する Stateflow チャート

このモデルには、前述した最初のバージョンの fcn を使用する MATLAB 関数をもつ Stateflow チャートが含まれます。この MATLAB 関数は、各タイム ステップで、アクティブ ステートによって特定された値 (1 または -1) を永続変数 n に追加します。

モデルのシミュレーションを実行します。このシミュレーションでは、次の理由によりエラーが返されます。

  • 永続変数 n の初期値が入力 u に応じて異なる。

  • return ステートメントが、関数の通常の制御フローへの割り込みを行う。

  • このチャートが Moore セマンティクスを実装している。

MATLAB 関数コードを、修正バージョンの fcn に示すように変更します。モデルのシミュレーションを再度実行します。

参考

| | | (Stateflow)

関連するトピック