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 関数のコードを変更します。モデルを再度シミュレートします。
参考
ブロック
- MATLAB Function | State Control (HDL Coder) | Chart (Stateflow)
関数
関連するトピック
- MATLAB Function ブロックでの非直達の使用
- State Control ブロックを使用する同期サブシステムの動作 (HDL Coder)
- Moore チャートを設計する際の注意事項 (Stateflow)