主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

シミュレーションおよびコード実行時のパラメーター値セットの切り替え

同じブロックパラメーターの複数の独立した値のセットを保存するには,構造体の配列を使用します。パラメーターのセットを切り替えるには,配列のインデックスとして動作する変数を作成し,変数の値を変更します。シミュレーション時,および変数が調整可能な場合は生成されたコードの実行時に,変数の値を変更できます。

モデル例の確認

モデル例を開きます。

open_system (“sldemo_fuelsys_dd_controller”

このモデルは,ガソリンエンジンの燃料供給システムを表しています。モデルの出力は,エンジンへの燃料流量の比率です。

入れ子にされたサブシステムswitchable_compensationに移動します。

open_system ([“sldemo_fuelsys_dd_controller / fuel_calc /”...“switchable_compensation”])

このサブシステムは,燃料比信号のノイズを修正および除去します。サブシステムは燃料供給モードに基づいてさまざまなフィルター係数を使用します。燃料供給モードはエンジン内のセンサーの障害に基づいて制御ロジックにより変更されます。たとえば,制御アルゴリズムは,通常の動作中にlow_modeサブシステムをアクティブにします。このアルゴリズムは,センサー障害に応答してrich_modeサブシステムをアクティブにします。

low_modeサブシステムを開きます。

open_system ([“sldemo_fuelsys_dd_controller / fuel_calc /”...“switchable_compensation / low_mode”])

离散滤波器ブロックは,燃料比信号をフィルター処理します。ブロックのダイアログボックスで,[分子係数]パラメーターにフィルターの分子係数を設定します。

兄弟サブシステムrich_modeには,異なる係数を使用する离散滤波器ブロックも含まれます。

モデルブロック線図を更新して信号データ型を表示します。ブロックの入出力信号では,単精度の浮動小数点データ型を使用します。

モデルの左下隅でモデルデータバッジをクリックしてから,[データディクショナリ]リンクをクリックします。このモデルのデータディクショナリsldemo_fuelsys_dd_controller.slddがモデルエクスプローラーで開きます。

モデルエクスプローラーの[モデルの階層構造)ペインで[データの設計]ノードを選択します。

[コンテンツ]ペインで,s16En15などの金宝app仿真软件。NumericTypeオブジェクトのプロパティを表示します。これらすべてのオブジェクトは現在単精度の浮動小数点データ型を表します。モデルはこれらのオブジェクトを使用して,离散滤波器ブロックの入出力信号を含む信号のデータ型を設定します。

シミュレーション中および生成されたコードの実行中に,これらの各サブシステムで,ユーザーが制御する値をもつ変数に基づいてさまざまな分子係数を切り替えます。

構造体の配列へのパラメーター値の保存

既存の分子係数のセットを,値が構造体の金宝app仿真软件。参数オブジェクトに保存します。構造体の各フィールドには,いずれかの离散滤波器ブロックの係数が保存されます。

lowBlock = [“sldemo_fuelsys_dd_controller / fuel_calc /”...“switchable_compensation / low_mode /离散滤波器”];richBlock = [“sldemo_fuelsys_dd_controller / fuel_calc /”...“switchable_compensation / rich_mode /离散滤波器”];参数个数。lowNumerator = eval (get_param (lowBlock“分子”));参数个数。richNumerator = eval (get_param (richBlock“分子”));params = 金宝appSimulink.Parameter (params);

参数个数の値を一時変数にコピーします。この一時構造体のフィールドの値を変更し,変更した構造体を参数个数の2番目の要素として代入します。

temp = params.Value;temp.lowNumerator = params.Value.lowNumerator * 2;temp.richNumerator = params.Value.richNumerator * 2;params.Value (2) = temp;清晰的临时

参数个数の値は2つの構造体の配列です。各構造体はフィルター係数の1つのセットを格納しています。

パラメーターセットを切り替える変数を作成する

Ctrlという名前の金宝app仿真软件。参数オブジェクトを作成します。

Ctrl = 金宝appSimulink.Parameter (2);Ctrl。数据类型=“uint8”

low_modeサブシステムの离散滤波器ブロックのダイアログボックスで,[分子係数]パラメーターを式参数(Ctrl) .lowNumeratorに設定します。

set_param (lowBlock“分子”“params (Ctrl) .lowNumerator”);

rich_modeサブシステムの离散滤波器ブロックで,[分子係数]パラメーターの値を参数(Ctrl) .richNumeratorに設定します。

set_param (richBlock“分子”“params (Ctrl) .richNumerator”);

この式は変数Ctrlを使用して参数个数内の構造体の1つを選択します。式ではその後構造体のフィールドの1つを逆参照します。フィールド値には分子係数の値が設定されています。

係数のセットを切り替えるには,Ctrlの値を構造体の配列の対応するインデックスに変更します。

バスオブジェクトを構造体配列のデータ型として使用する

必要に応じて金宝app仿真软件。公共汽车オブジェクトを作成して構造体配列のデータ型として使用します。次のようにして実行できます。

  • 構造体の形状の制御。

  • フィールドごとにデータ型や物理単位などの特性を制御。

  • 生成コード内の结构体型の名前の制御。

関数金宝appSimulink.Bus.createObjectを使用してオブジェクトを作成し,オブジェクトの名前をparamsTypeに変更します。

金宝appSimulink.Bus.createObject(params.Value) paramsType = slBus1;清晰的slBus1

データディクショナリの金宝app仿真软件。NumericTypeオブジェクトを使用して,構造体のフィールドのデータ型を制御できます。バスオブジェクトでデータ型オブジェクトの名前を使用して,各要素の数据类型プロパティを設定します。

paramsType.Elements(1)。数据类型=“s16En15”;paramsType.Elements(2)。数据类型=“s16En7”

バスオブジェクトを構造体配列のデータ型として使用します。

参数个数。数据类型=“巴士:paramsType”

切り替え変数に列挙型を使用する

必要に応じて切り替え変数のデータ型として列挙型を使用します。それぞれのパラメーターセットに意味のある名前を関連付けると共に,切り替え変数が使用できる値を制限できます。

FilterCoeffsという名前の列挙型を作成します。参数个数内の各構造体について,列挙型メンバーを作成します。各列挙型メンバーの基となる整数値を,参数个数の対応するインデックスに設定します。

金宝appSimulink.defineIntEnumType (“FilterCoeffs”, {“弱”“咄咄逼人”} [1 - 2])

この列挙型を切り替え変数のデータ型として使用します。この変数の値を咄咄逼人的に設定します。これはインデックス2に対応します。

Ctrl。值= FilterCoeffs.Aggressive;

データディクショナリに新しいオブジェクトを追加する

作成したオブジェクトをデータディクショナリsldemo_fuelsys_dd_controller.slddに追加します。

dictObj = 金宝appSimulink.data.dictionary.open (“sldemo_fuelsys_dd_controller.sldd”);sectObj = getSection (dictObj,设计数据的);addEntry (sectObj“热”Ctrl) addEntry (sectObj“参数”params) addEntry (sectObj“paramsType”paramsType)

列挙型をデータディクショナリに保存することもできます。ただし,変更をsldemo_fuelsys_dd_controller.slddに保存することはできないため,この場合は列挙型をインポートすることはできません。データディクショナリへの列挙型の保存の詳細については,データディクショナリの列挙値を参照してください。

シミュレーション中にパラメーターセットを切り替える

モデル例sldemo_fuelsys_ddを開きます。このモデルはコントローラーモデルsldemo_fuelsys_dd_controllerを参照しています。

open_system (“sldemo_fuelsys_dd”

シミュレーション中にモデルを操作できるように,シミュレーション終了時間をに設定します。

シミュレーションの実行を開始し,范围ブロックのダイアログボックスを開きます。エンジンの通常動作時の燃料流量(燃料信号)の振動と大幅な振幅がスコープに表示されます。

モデルエクスプローラーでデータディクショナリsldemo_fuelsys_dd_controller.slddの内容を表示します。Ctrlの値をFilterCoeffs。弱に設定します。

モデルブロック線図sldemo_fuelsys_ddを更新します。アグレッシブの度合いが低いフィルター係数のために,燃料比の振動の振幅が減少することがスコープによって示されます。

シミュレーションを停止します。

コードの生成と検査

金宝app仿真软件编码器ソフトウェアをお持ちの場合,コードの実行中にパラメーターセットを切り替えることができるコードを生成できます。

モデルエクスプローラーでデータディクショナリsldemo_fuelsys_dd_controller.slddの内容を表示します。[コンテンツ]ペインで,(列ビュー]存储类に設定します。

構造体配列が生成コード内で調整可能なグローバル変数として現れるように,(StorageClass)列を使用してストレージクラスExportedGlobal参数个数に適用します。コードの実行中に切り替え変数の値を変更できるように,同じストレージクラスをCtrlに適用します。

または,オブジェクトを構成するために,次のコマンドを使用します。

tempEntryObj = getEntry (sectObj,“参数”);params = getValue (tempEntryObj);参数个数。StorageClass =“ExportedGlobal”;setValue (tempEntryObj params);tempEntryObj = getEntry (sectObj,“热”);Ctrl = getValue (tempEntryObj);Ctrl。StorageClass =“ExportedGlobal”;setValue (tempEntryObj Ctrl);

コントローラーモデルからコードを生成します。

slbuild (“sldemo_fuelsys_dd_controller”
### ### ### ###成功完成代码生成:模型重建行动的原因  ================================================================================================ sldemo_fuelsys_dd_controller代码生成的代码生成信息文件不存在。建造时间:0h 0m 33.839s

コード生成レポートで,ヘッダーファイルsldemo_fuelsys_dd_controller_types.hを表示します。このコードは列挙データ型FilterCoeffsを定義します。

文件= fullfile (“sldemo_fuelsys_dd_controller_ert_rtw”...“sldemo_fuelsys_dd_controller_types.h”);rtwdemodbtype(文件,“ifndef DEFINED_TYPEDEF_FOR_FilterCoeffs_”...'/* rtModel的正向声明*/', 1,0)
#ifndef DEFINED_TYPEDEF_FOR_FilterCoeffs_ #define DEFINED_TYPEDEF_FOR_FilterCoeffs_ typedef enum {Weak = 1, /*默认值*/ Aggressive} FilterCoeffs;# endif

また,このコードは金宝app仿真软件。公共汽车オブジェクトに対応付けられている構造体型paramsTypeも定義します。このフィールドは,モデルの単精度浮動小数点データ型を使用します。

rtwdemodbtype(文件,“ifndef DEFINED_TYPEDEF_FOR_paramsType_”...“ifndef DEFINED_TYPEDEF_FOR_FilterCoeffs_”, 1,0)
#ifndef DEFINED_TYPEDEF_FOR_paramsType_ #define DEFINED_TYPEDEF_FOR_paramsType_ typedef struct {real32_T lowNumerator[2];real32_T richNumerator [2];} paramsType;# endif

ソースファイルsldemo_fuelsys_dd_controller.cを表示します。このコードは,列挙型を使用して切り替え変数Ctrlを定義します。

文件= fullfile (“sldemo_fuelsys_dd_controller_ert_rtw”...“sldemo_fuelsys_dd_controller.c”);rtwdemodbtype(文件,'FilterCoeffs Ctrl = Aggressive;'...'/*块信号(默认存储)*/', 1,0)
FilterCoeffs Ctrl = Aggressive;/*变量:Ctrl *引用:* '/离散过滤器' * '/离散过滤器' */

このコードは,構造体配列参数个数も定義します。

rtwdemodbtype(文件,'/*导出块参数*/'...“/ *变量:参数”, 1, 1)
/*输出块参数*/ paramsType params[2] = {{8.7696F, -8.5104F}, {0.0F, 0.2592F}}, {{17.5392F, -17.0208F}, {0.0F, 0.5184F}};/ *变量:参数

モデルの関数一步のコードアルゴリズムは,構造体配列のインデックスを指定するために切り替え変数を使用します。

構造体配列に格納されているパラメーターセットを切り替えるには,コードの実行中にCtrlの値を変更します。

データディクショナリへの接続を閉じます。この例では未保存の変更は破棄されます。変更を保存するには,“保存”オプションを使用します。

金宝appSimulink.data.dictionary.closeAll (“sldemo_fuelsys_dd_controller.sldd”“丢弃”

関連するトピック