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 ブロックの [直達を許可] プロパティがオフになっています。

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

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

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

モデルのシミュレーションを実行します。以下の理由により、シミュレーションはエラーを返します。

  • 永続変数 n の初期値は入力 u に応じて異なります。

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

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

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

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

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

モデルのシミュレーションを実行します。以下の理由により、シミュレーションはエラーを返します。

  • 永続変数 n の初期値は入力 u に応じて異なります。

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

  • チャートは Moore セマンティクスを実装しています。

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

参考

ブロック

関数

関連するトピック