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モデルを再度シミュレートします。

参考
ブロック
- MATLAB Function | State Control (HDL Coder) | Chart (Stateflow)
関数
トピック
- MATLAB Function ブロックでの非直達の使用
- State Control ブロックを使用する同期サブシステムの動作 (HDL Coder)
- Moore チャートを設計する際の注意事項 (Stateflow)