C-MEX/FORTRAN MEX S-function​にあるstatic変​数がシミュレーション​後にリセットされない​のはなぜですか?

10 views (last 30 days)
persistent変数やstatic変数やglobal変数を含むC-MEX/FORTRAN S-functionを含むSimulinkモデルを実行しています。シミュレーションを繰り返すと、S-functionの中にあるstatic変数が初期化されず異なる結果が得られます。

Accepted Answer

MathWorks Support Team
MathWorks Support Team on 16 Nov 2018
一般には、S-functionがpersistentとしてメモリを必要とするときは、static変数やglobal変数の代わりにワークベクトルを使用することが推奨されています。
しかし、やむを得ずこのような変数を使用するときは、C-MEX/FORTRANが共有ライブラリであり、シミュレーション終了時にメモリから削除されないことを意識してください。このような変数を再初期化するいくつかの方法を紹介します。
1.メモリにロードされているすべてのMEX関数(S-functionを含む)を以下のコマンドでクリアできます。
clear mex
このコマンドをシミュレーションごとに実行します。
2.シミュレーションする前に、当該MEX関数のみをメモリからクリアすることもできます。メモリからクリアしたい関数の名前がmySfunctionであったときは、以下のコマンドを入力します。
clear mySfunction
3.ひとつのS-functionを複数のモデルで使用し、モデルをまたぐコールバック関数を使用したくないときは、特定のS-functionに対するコールバック関数の中でS-functionをメモリからクリアすることもできます。以下のコマンドを当該S-functionのInitFcnコールバック自体に記述します。
clear(get_param(gcb, 'FunctionName'))
この方法のサンプルモデル(testmodel_wo2)が回答欄上部からダウンロードできます。
4.static変数をS-function自体で初期化することもできます。この方法のサンプルモデル(testmodel_wo3)では、S-functionを生成するためにLegacy Code Toolが使用されています。この方法ではStartFcnSpec でシミュレーションスタート時にコールされるC関数を特定するために使われています。この関数は毎回のシミュレーション開始時にコールされるので、S-functionをロードしても毎回同じ開始状態が使用されます。

More Answers (0)

Categories

Find more on コード生成 in Help Center and File Exchange

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!