Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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

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

次の状況で MATLAB 関数をプログラミングする場合、

  • 直達がない MATLAB Function ブロック

  • [同期] モードで State Control ブロックを含むモデル内の MATLAB Function ブロック

  • Moore マシンのセマンティクスを実装する Stateflow® チャート内の MATLAB 関数

特殊なセマンティクスによって、関数がその永続データを初期化する方法が影響を受けます。初期化は関数への入力からは独立していなければならないため、次のガイドラインに従います。

  • 関数は、定数へのアクセスによってのみ永続変数を初期化します。

  • 関数の制御フローは、初期化が発生するかどうかによって変化しません。

たとえば、この関数には永続変数 n があります。

function y = fcn(u)
    persistent n
        
    if isempty(n)
        n = u;
        y = 1;
        return
    end
    
    y = n;
    n = n + u; 
end
n の初期値は入力 u に応じて異なり、return ステートメントは関数の通常の制御フローへの割り込みを行うため、この種類の初期化はエラーになります。

エラーを修正するには、永続変数を定数値に設定し、return ステートメントを削除して永続変数を初期化します。たとえば、次の関数はエラーを生成せずに永続変数を初期化します。

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

直達がない MATLAB Function ブロック

このモデルには、前述の関数 fcn を定義する MATLAB Function ブロックが含まれます。入力 u は値が 1 と -1 の矩形波です。

MATLAB Function ブロックでは、

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

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

[直達を許可] チェック ボックスがオフになっているため、初期化はエラーになります。

入力に関係なく n を初期化するように関数を変更すると、エラーのないモデルのシミュレーションを実行できます。

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

このモデルには、前述の関数 fcn を定義する MATLAB Function ブロックが含まれます。入力 u は値が 1 と -1 の矩形波です。

MATLAB Function ブロックでは、

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

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

モデルには Synchronous モードの State Control ブロックが含まれているため、初期化はエラーになります。

入力に関係なく n を初期化するように関数を変更すると、エラーのないモデルのシミュレーションを実行できます。

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

このモデルには、Moore マシンのセマンティクスを実装する Stateflow チャートが含まれています。チャートには、前述の関数 fcn を定義する MATLAB 関数が含まれています。入力値 u の値は 1 と -1 ですが、チャートのステートに応じて異なります。

MATLAB 関数では、

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

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

このチャートは Moore セマンティクスを実装しているため、初期化はエラーになります。

入力に関係なく n を初期化するように関数を変更すると、エラーのないモデルのシミュレーションを実行できます。

参考

| (Simulink) | (HDL Coder) |

関連するトピック