Main Content

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

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

永続変数を含む MATLAB 関数を Simulink® モデルで使用する場合は、次のガイドラインに従ってください。

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

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

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

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

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

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

たとえば、下記の関数 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 に加算します。モデルには [状態制御]Synchronous に設定された State Control ブロックが含まれています。

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

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

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

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

前述の修正したバージョンの fcn に従って、MATLAB Function ブロックのコードを変更します。モデルを再度シミュレートします。

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

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

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

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

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

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

前述の修正したバージョンの fcn に従って、MATLAB 関数のコードを変更します。モデルを再度シミュレートします。

参考

| | (HDL Coder) | (Stateflow)

関連するトピック