メインコンテンツ

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

"永続変数" は、関数の呼び出し間でその値がメモリに保持される、MATLAB® 関数のローカル変数です。persistent を参照してください。MATLAB Function ブロック、および Stateflow® チャート内の MATLAB 関数で永続変数を初期化できます。ただし、一部のコーディング手法では、永続変数を使用するとエラーが生じることがあります。

coder.opaque と永続変数の併用の回避

coder.opaque (MATLAB Coder) 関数で宣言された変数を永続変数として使用している場合、モデルをシミュレーションするとエラーが発生します。たとえば、次の関数では、coder.opaque を使用して最初に宣言された永続変数 pp を使用しています。モデルでこの関数をシミュレーションすると、このコードによりエラーが発生します。

function y = fcn(u)
%#codegen
persistent pp;
if isempty(pp)
    pp = eml.opaque("int","0");
end
q = 0;
q = eml.ceval("(int)",pp);
q = q + 1;

pp = eml.ceval("(int)",q);
y = 0;
y = eml.ceval("(int)",pp);

ベスト プラクティスの使用によるエラーの回避

永続変数が原因で生じる初期化エラーを回避するには、以下のベスト プラクティスに従います。

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

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

これらのガイドラインに従わないと、次の状況で初期化エラーが発生します。

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

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

  • Moore マシンのセマンティクスを実装する Stateflow チャートで永続変数を含む MATLAB 関数が使用されている

たとえば、このバージョンの fcn では永続変数 n を使用しています。n の初期値は入力 u に応じて異なり、return ステートメントは関数の通常の制御フローへの割り込みを行います。このコードを上記のいずれかの状況にあるモデルで使用すると、エラーが発生します。

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

直達がない MATLAB Function ブロック

このモデル例には、MATLAB 関数で永続変数を使用するためのベスト プラクティスに従っていない MATLAB Function ブロックが含まれています。MATLAB Function ブロックの入力は矩形波で、Sign ブロックと Sine Wave ブロックから提供されます。MATLAB Function ブロックは、u の値を各タイム ステップで永続変数 n に加算します。

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

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

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

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

MATLAB Function ブロックで、永続変数を定数値に設定し、return ステートメントを削除することで、永続変数を初期化します。次のコードを使用して関数を再定義します。

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

モデルを再度シミュレートします。

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

このモデル例には、MATLAB 関数で永続変数を使用するためのベスト プラクティスに従っていない MATLAB Function ブロックが含まれています。MATLAB Function ブロックの入力は矩形波で、Sign ブロックと Sine Wave ブロックから提供されます。MATLAB Function ブロックは、u の値を各タイム ステップで永続変数 n に加算します。モデルには [状態制御]Synchronous に設定された State Control ブロックが含まれています。

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

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

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

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

MATLAB Function ブロックで、永続変数を定数値に設定し、return ステートメントを削除することで、永続変数を初期化します。次のコードを使用して関数を再定義します。

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

モデルを再度シミュレートします。

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

このモデル例には、永続変数を使用するためのベスト プラクティスに従っていない MATLAB 関数を含む Stateflow チャートが含まれています。

この MATLAB 関数は、アクティブ ステートに応じて 1 または -1 を永続変数 n に加算します。

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

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

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

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

MATLAB 関数で、永続変数を定数値に設定し、return ステートメントを削除することで、永続変数を初期化します。次のコードを使用して関数を再定義します。

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

モデルを再度シミュレートします。

参考

ブロック

関数

トピック