AUTOSAR 要素のバリアント パラメーター値の構成
AUTOSAR ソフトウェア コンポーネントでは、バリアント パラメーターを使用して AUTOSAR 要素のパラメーター値を柔軟に指定できます。Simulink® で可変のパラメーター値を使用して AUTOSAR 要素をモデル化するには、次のようにします。
AUTOSAR 要素を表すブロックを作成する。
Simulink.VariantVariable
データ オブジェクトを追加して、変化するパラメーター値を表す。AUTOSAR.Parameter
データ オブジェクトを使用して、AUTOSAR システム定数をモデル化する。この AUTOSAR データ オブジェクトで、バリアント パラメーターのアクティブな値を決定する条件値を表します。Simulink.VariantControl
データ オブジェクトを使用して、アクティベーションのタイミングを AUTOSAR システム定数に関連付ける。アクティベーションのタイミングにより、コード生成のどの段階でバリアント パラメーター値を変更できるかが決まります。
バリアント パラメーターを使用すると、コードのコンパイル前やモデルの起動時にパラメーター値を変更できます。モデルをビルドすると、生成された C コードにバリアント パラメーターに対応する値と条件が含まれます。エクスポートされた ARXML コードの中で、バリアントの選択肢は VARIATION-POINT-PROXY
エントリとして記述され、バリアント制御変数は関連付けられた条件値を表すシステム定数として記述されます。
プリコンパイル時のバリアント パラメーターの指定
この例では、バリアント パラメーターを含む AUTOSAR 要素のコードを生成する方法を示します。この方法を使用すれば、値のセットごとにコードを再生成する必要はありません。生成されたコードで、プリプロセッサ条件の #if
と #elif
で囲まれたバリアント パラメーター値を使用して、コードのコンパイル前に値を切り替えることができます。
たとえば、次の AUTOSAR コンポーネント モデルには、Gain ブロックの複数の値をモデル化したバリアント パラメーター k が含まれています。
open_system('mAutosarVariantParameter')
このパラメーターで、[ゲイン] パラメーターの複数の値を定義し、それぞれの値をバリアント条件ロジックに関連付けています。バリアント条件ロジックは、式または式を含むSimulink.VariantExpression
オブジェクトとして指定できます。
ADAPTIVE = Simulink.VariantExpression('MySys == 10'); LINEAR = Simulink.VariantExpression('MySys == 1'); NONLINEAR = Simulink.VariantExpression('MySys == 2'); k = Simulink.VariantVariable('Choices',{'ADAPTIVE', 10 ,'LINEAR',1,'NONLINEAR',3});
AUTOSAR システム定数をモデル化するために、このモデルでは AUTOSAR.Parameter
データ オブジェクト tmpSysCon
を定義しています。
tmpSysCon = AUTOSAR.Parameter(int32(1)); tmpSysCon.CoderInfo.StorageClass = 'Custom'; tmpSysCon.CoderInfo.CustomStorageClass = 'SystemConstant';
tmpSysCon
の値によって k
のアクティブな値が決まります。
モデルのコードを生成すると、次のようになります。
ARXML コードの中で、バリアントの選択肢は省略名が
ADAPTIVE
、LINEAR
、およびNONLINEAR
のVARIATION-POINT-PROXY
エントリとして記述されます。MySys
は関連付けられた条件値を表すシステム定数として記述されます。
<VARIATION-POINT-PROXYS> <VARIATION-POINT-PROXY UUID="744b1a40-2029-54ae-fba9-79a6ca104b8c"> <SHORT-NAME>ADAPTIVE</SHORT-NAME> <CATEGORY>CONDITION</CATEGORY> <CONDITION-ACCESS BINDING-TIME="PRE-COMPILE-TIME"><SYSC-REF DEST="SW-SYSTEMCONST">/DataTypes/SystemConstants/MySys</SYSC-REF> == 10</CONDITION-ACCESS> </VARIATION-POINT-PROXY> <VARIATION-POINT-PROXY UUID="af1f057b-45e6-58f7-7e12-b66857813de6"> <SHORT-NAME>LINEAR</SHORT-NAME> <CATEGORY>CONDITION</CATEGORY> <CONDITION-ACCESS BINDING-TIME="PRE-COMPILE-TIME"><SYSC-REF DEST="SW-SYSTEMCONST">/DataTypes/SystemConstants/MySys</SYSC-REF> == 1</CONDITION-ACCESS> </VARIATION-POINT-PROXY> <VARIATION-POINT-PROXY UUID="6ba924d2-49e1-5948-cbd1-c0990240bb21"> <SHORT-NAME>NONLINEAR</SHORT-NAME> <CATEGORY>CONDITION</CATEGORY> <CONDITION-ACCESS BINDING-TIME="PRE-COMPILE-TIME"><SYSC-REF DEST="SW-SYSTEMCONST">/DataTypes/SystemConstants/MySys</SYSC-REF> == 2</CONDITION-ACCESS> </VARIATION-POINT-PROXY> </VARIATION-POINT-PROXYS>
RTE 互換の C コードの中で、
k
の値はプリプロセッサ条件の#if
と#elif
で囲んで記述されます。このコードをコンパイルすると、Simulink® で条件式が評価されます。true
と評価される条件式に基づいて、その条件ロジックに関連付けられたゲイン値がアクティブになり、そのゲイン値についてのみコードがコンパイルされます。その後、バリアント制御変数MySy
の値を変更することで、別のゲイン パラメーター値についてコードをコンパイルできます。ゲインの値ごとにコードを再生成する必要はありません。
Parameters rtP = { #if Rte_SysCon_ADAPTIVE || Rte_SysCon_LINEAR || Rte_SysCon_NONLINEAR /* Variable: k * Referenced by: '<Root>/Gain' */ #if Rte_SysCon_ADAPTIVE 10.0 #elif Rte_SysCon_LINEAR 1.0 #elif Rte_SysCon_NONLINEAR 3.0 #endif #define PARAMETERS_VARIANT_EXISTS #endif #ifndef PARAMETERS_VARIANT_EXISTS 0 #endif /* PARAMETERS_VARIANT_EXISTS undefined */ };
ポストビルド時のバリアント パラメーターの指定
この例では、異なるバリアント パラメーター値のセットについて実行される AUTOSAR 要素のランナブルを生成する方法を示します。この方法を使用すれば、値のセットごとにコードを再コンパイルする必要はありません。生成されたコードで、通常の if
条件で囲まれたバリアント パラメーター値を使用して、モデルの起動時に値を切り替えることができます。
たとえば、次の AUTOSAR コンポーネント モデルには、Gain ブロックの複数の値をモデル化したバリアント パラメーター k
が含まれています。MATLAB® コマンド ラインで次のコードを入力して、モデルを開きます。
このパラメーターで、[ゲイン] パラメーターの複数の値を定義し、それぞれの値をバリアント条件ロジックに関連付けています。バリアント条件ロジックは、式または式を含む Simulink.VarianExpression
オブジェクトとして指定できます。
ADAPTIVE = Simulink.VariantExpression('MyPBCrit == 10'); LINEAR = Simulink.VariantExpression('MyPBCrit == 1'); NONLINEAR = Simulink.VariantExpression('MyPBCrit == 2'); k = Simulink.VariantVariable('Choices',{'ADAPTIVE', 10 ,'LINEAR',1,'NONLINEAR',3});
MyPBCrit
の値によって k
のアクティブな値が決まります。
MyPBCrit = Simulink.VariantControl('Value', 1, 'ActivationTime', 'startup');
モデルのコードを生成すると、次のようになります。
ARXML コードの中で、バリアントの選択肢は省略名が
ADAPTIVE
、LINEAR
、およびNONLINEAR
のVARIATION-POINT-PROXY
エントリとして記述されます。MyPBCrit
は関連付けられた条件値を表すシステム定数として記述されます。<VARIATION-POINT-PROXYS> <VARIATION-POINT-PROXY UUID="e773053e-d2a7-568c-768b-fee924d1fad6"> <SHORT-NAME>ADAPTIVE</SHORT-NAME> <CATEGORY>CONDITION</CATEGORY> <POST-BUILD-VARIANT-CONDITIONS> <POST-BUILD-VARIANT-CONDITION> <MATCHING-CRITERION-REF DEST="POST-BUILD-VARIANT-CRITERION">/DataTypes/PostBuildCriterions/MyPBCrit</MATCHING-CRITERION-REF> <VALUE>10</VALUE> </POST-BUILD-VARIANT-CONDITION> </POST-BUILD-VARIANT-CONDITIONS> </VARIATION-POINT-PROXY> <VARIATION-POINT-PROXY UUID="3ce69abb-b974-591d-c7a8-180c64bedfb5"> <SHORT-NAME>LINEAR</SHORT-NAME> <CATEGORY>CONDITION</CATEGORY> <POST-BUILD-VARIANT-CONDITIONS> <POST-BUILD-VARIANT-CONDITION> <MATCHING-CRITERION-REF DEST="POST-BUILD-VARIANT-CRITERION">/DataTypes/PostBuildCriterions/MyPBCrit</MATCHING-CRITERION-REF> <VALUE>1</VALUE> </POST-BUILD-VARIANT-CONDITION> </POST-BUILD-VARIANT-CONDITIONS> </VARIATION-POINT-PROXY> <VARIATION-POINT-PROXY UUID="b4b96126-4744-5093-360b-3965883aeeda"> <SHORT-NAME>NONLINEAR</SHORT-NAME> <CATEGORY>CONDITION</CATEGORY> <POST-BUILD-VARIANT-CONDITIONS> <POST-BUILD-VARIANT-CONDITION> <MATCHING-CRITERION-REF DEST="POST-BUILD-VARIANT-CRITERION">/DataTypes/PostBuildCriterions/MyPBCrit</MATCHING-CRITERION-REF> <VALUE>2</VALUE> </POST-BUILD-VARIANT-CONDITION> </POST-BUILD-VARIANT-CONDITIONS> </VARIATION-POINT-PROXY> </VARIATION-POINT-PROXYS>
RTE 互換の C コードの中で、
k
の値は通常のif
条件で囲んで記述されます。このコードからビルドされたランナブルを実行すると、Simulink で条件式が評価されます。true
と評価される条件式に基づいて、その条件ロジックに関連付けられたゲイン値がアクティブになり、そのゲイン値についてのみランナブルが実行されます。その後、バリアント制御変数MyPBCrit
の値を変更することで、別のゲイン パラメーター値についてランナブルを実行できます。ゲイン パラメーターの値ごとにコードを再コンパイルしてランナブルをビルドする必要はありません。void mBasic_Init(void) { /* Variant Parameters startup activation time */ if (Rte_PbCon_ADAPTIVE()) { rtP.k = 10.0; } else if (Rte_PbCon_LINEAR()) { rtP.k = 1.0; } else if (Rte_PbCon_NONLINEAR()) { rtP.k = 3.0; } }
参考
バリアント パラメーターを使用した値が異なるブロック パラメーターの再利用