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

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

Risposta accettata

MathWorks Support Team
MathWorks Support Team il 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をロードしても毎回同じ開始状態が使用されます。

Più risposte (0)

Categorie

Scopri di più su コード生成 in Help Center e File Exchange

Prodotti

Community Treasure Hunt

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

Start Hunting!