Main Content

AUTOSAR モード スイッチ通信の設定

AUTOSAR モード スイッチ (M-S) 通信は、モード マネージャーおよび接続されているモード ユーザーに依存します。モード マネージャーは、現在のモードに対してクエリを実行し、モードが変わると (切り替わると) 通知を受信するソフトウェア コンポーネントの正式なソースです。モード マネージャーは、AUTOSAR 基本ソフトウェア (BSW) により提供されるか、AUTOSAR ソフトウェア コンポーネントとして実装できます。ソフトウェア コンポーネントとして実装されるモード マネージャーは、アプリケーション モード マネージャーと呼ばれます。モデル マネージャーをクエリして、モード スイッチに関する通知を受け取るソフトウェア コンポーネントは、モード ユーザーです。

モード ユーザーに対するモード受信ポートとモデル ユーザーのモデル スイッチ イベントの設定

モデル ユーザー ソフトウェア コンポーネントをモデル化するには、AUTOSAR モード受信ポートとモード スイッチ イベントを使用します。モード受信ポートでは、モード スイッチ (M-S) インターフェイスを使用してモード マネージャーに接続し、通信します。モード マネージャーはモード変更の通知を提供します。関連付けられたランナブルを有効にして、指定されたモードの変化に応答するようモード スイッチ イベントを設定します。この例では、AUTOSAR モード受信ポート、モード スイッチ イベントおよびモード ユーザーの関連要素を設定する方法を示します。

メモ

この例では、現在の ECU モードに基づいてコンポーネントの実行を制御するための有意義なアルゴリズムは実装しません。

  1. モデル例 autosar_swc_expfcns の書き込み可能なコピーを開きます。

  2. Simulink® の列挙型を使用して、モード値のグループであるモード宣言グループを宣言します。ストレージ型を符号なし整数に指定します。MATLAB® コマンド ウィンドウに次のコマンドを入力します。

    Simulink.defineIntEnumType('mdgEcuModes', ... 
     {'Run', 'Sleep'}, [0;1], ... 
     'Description', 'Mode declaration group for ECU modes', ...
     'DefaultValue', 'Run', ...
     'HeaderFile', 'Rte_Type.h', ...
     'AddClassNameToEnumNames', false,...
     'StorageType', 'uint16');
  3. Simulink 入力端子の名前を RPort_DE1 (ErrorStatus) から MRPort (ECU mode) に変更します。たとえば、モデル データ エディターを開きます ([モデル化] タブで [モデル データ エディター] をクリック)。[Source] 列を使用して入力端子の名前を変更します。後の手順で、この入力端子を AUTOSAR のモード受信ポートにマッピングします。

  4. 次にモード宣言グループ mdgEcuModes を入力端子に適用します。モデル データ エディターで、入力端子用に [Data Type]Enum: mdgEcuModes に設定します。さらに、[Complexity][auto] に設定します。

  5. モデル ウィンドウで Runnable1_subsystem という名前の Function-Call Subsystem を開いて次の変更を行います。

    1. 入力端子 ErrorStatus の名前を CurrentMode に変更します。

    2. Constant ブロック RTE_E_OK を Enumerated Constant ブロックに置き換えます (Enumerated Constant ブロックは Sources ブロック グループにあります)。このブロックをダブルクリックして [ブロック パラメーター] ダイアログ ボックスを開きます。[出力データ型]Enum: mdgEcuModes に設定し、[値]mdgEcuModes.Run に設定します。[OK] をクリックします。

  6. AUTOSAR モード スイッチ インターフェイスをモデルに追加します。AUTOSAR ディクショナリを開きます。[M-S Interfaces] を選択します。[追加] ボタン をクリックします。[Add Interfaces] ダイアログ ボックスで、[Name]Interface3 を、[ModeGroup]mgEcuMode を指定します。

    M-S インターフェイスの [IsService] プロパティの既定値は [true] です。この例の目的上、変更する理由がない限りは [IsService] を既定の設定のまま残すことができます。

    [追加] をクリックします。

    AUTOSAR のモード グループに指定した値は、Simulink の入力端子を AUTOSAR のモード受信ポートと要素にマッピングする、後の手順で使用します。

  7. AUTOSAR モード受信ポートをモデルに追加します。[AtomicComponents] を展開し、コンポーネント ASWC を展開し、[ModeReceiverPorts] を選択します。[Add Ports] ダイアログ ボックスを開くには、[追加] ボタン をクリックします。[Add Ports] ダイアログ ボックスで [Name]MRPort を指定します。[Interface] は既に [Interface3] (この構成で唯一可能な値) に、[Type] は既に [ModeReceiver] に設定されています。[追加] をクリックします。

  8. コード マッピング エディターで、Simulink の入力端子 MRPort (ECU mode) を AUTOSAR のモード受信ポートと要素にマッピングします。コード マッピング エディターを開き、[Inports] タブを選択します。入力端子 MRPort (ECU mode) の行で、[DataAccessMode][ModeReceive] に、[Port][MRPort] に、[Element][mgEcuMode] に設定します。(AUTOSAR 要素の値は、AUTOSAR モード スイッチ インターフェイス Interface3 を追加したときに指定した [ModeGroup] の値と同じです)。

    この手順により AUTOSAR モード受信ポートのコンフィギュレーションは完了します。[検証] ボタン をクリックして、AUTOSAR コンポーネントの構成を検証します。エラーが報告された場合は、対処した上で検証を再試行します。モデルが検証にパスしたらモデルを保存します。

    メモ

    以降の手順では AUTOSAR モード スイッチ イベントを作成し、AUTOSAR ランナブルのアクティブ化をトリガーするようにセットアップします。ランナブルをアクティブにするイベントを使用せずに、ECU モードを使用してプログラムの実行を制御する場合は、以降の手順をスキップして必要なフロー制御ロジックを設計に実装します。

  9. AUTOSAR モード スイッチ イベントをランナブルに追加するには、次の手順に従います。

    1. AUTOSAR ディクショナリを開きます。[AtomicComponents] を展開し、ASWC コンポーネントを展開し、[Runnables] を選択します。ランナブルのリストから [Runnable1] を選択します。選択するとランナブルの [Events] 構成ペインが有効になります。

    2. Runnable1 のイベント リストにイベントを追加するために、[イベントの追加] をクリックします。新しいイベントの [イベント タイプ][ModeSwitchEvent] に設定します (これにより [Event Properties] サブペインが有効になります)。[イベント名]Event_Run を指定します。

    3. [Event Properties] サブペインで [Mode Activation][OnEntry] に、[Mode Receiver Port][MRPort] に、[Mode Declaration][実行] に設定します。[適用] をクリックします。

  10. コード マッピング エディターを開き [Functions] タブを選択します。このモデル例では Simulink のエントリポイント関数は既に AUTOSAR のランナブルにマップされており、モード スイッチ イベントを追加したばかりのランナブル Runnable1 も含まれています。

  11. 以上で AUTOSAR モード スイッチ イベントのコンフィギュレーションは完了です。[検証] ボタン をクリックして、AUTOSAR コンポーネントの構成を検証します。エラーが報告された場合は、対処した上で検証を再試行します。モデルが検証にパスしたらモデルを保存します。必要に応じてこのモデルから XML および C コードを生成して、結果を検査できます。

アプリケーション モード マネージャーでのモード送信ポートとモード スイッチ ポイントの設定

アプリケーション モード マネージャー ソフトウェア コンポーネントをモデル化するには、AUTOSAR モード送信ポートを使用します。モード送信ポートは、モード スイッチ (M-S) インターフェイスを使用して、接続されているモード ユーザー コンポーネントにモード スイッチを出力します。

モード送信ポートを、AUTOSAR モード送信ポートおよびモード スイッチ (M-S) インターフェイスにマッピングされているモデル ルート出力端子としてモデル化します。出力端子のデータ型は符号なし整数のストレージ型をもつ列挙型クラスで、AUTOSAR モードの宣言グループを表します。

この例では、モード送信ポートと関連の要素をアプリケーション モード マネージャー向けに設定する方法を示します。

  1. AUTOSAR コード生成用に設定するモデルを開きます。この例では、エンジン状態を維持する Stateflow® ロジックを含むモデルを使用します。このモデルは、現在のエンジン モード値を出力します。

  2. モード値のグループであるモード宣言グループを宣言します。Simulink 列挙型を使用してモード値を宣言できます。この例では、Stateflow ロジックによって EngineModes 値である OffCrankStallIdle および Run を定義します。以下に例を示します。

  3. AUTOSAR M-S インターフェイスをモデルに追加します。AUTOSAR ディクショナリを開き、[M-S Interfaces] を選択します。[追加] ボタン をクリックします。[Add Interfaces] ダイアログ ボックスで、[isService][true] に設定し、[ModeGroup] に名前を入力します。この例では、モード宣言グループは EngineModes です。

  4. AUTOSAR モード送信ポートをモデルに追加します。[AtomicComponents] を展開し、コンポーネントを展開し、[ModeSenderPorts] を選択します。[追加] ボタン をクリックします。[Add Ports] ダイアログ ボックスで、[Interface] を作成した M-S インターフェイスの名前に設定します。

  5. モード値を出力する Simulink 出力端子を作成した AUTOSAR モード送信ポートにマッピングします。コード マッピング エディターを開き、[Outports] タブを選択します。出力端子を AUTOSAR モード送信ポートにマッピングするには、[DataAccessMode][ModeSend] に設定します。[Port] 名を選択し、[Element] で、M-S インターフェイスに指定したモード宣言グループの名前を選択します。

  6. モデルのコードを生成します。

    ARXML コードには、参照先の ModeSwitchPoint、ModeSwitchInterface および ModeDeclarationGroup が含まれます。たとえば、次の ARXML コードでは、AUTOSAR モード送信ポートの ModeSwitchPoint を記述しています。

    <RUNNABLE-ENTITY>
      ...
      <MODE-SWITCH-POINTS>
        <MODE-SWITCH-POINT UUID="...">
          <SHORT-NAME>OUT_currentState_EngineModes</SHORT-NAME>
          <MODE-GROUP-IREF>
            <CONTEXT-P-PORT-REF DEST="P-PORT-PROTOTYPE">/pkg/swc/mEngineFailureMode/currentState
              </CONTEXT-P-PORT-REF>
            <TARGET-MODE-GROUP-REF DEST="MODE-DECLARATION-GROUP-PROTOTYPE">
              /pkg/if/msInterface/EngineModes</TARGET-MODE-GROUP-REF>
          </MODE-GROUP-IREF>
        </MODE-SWITCH-POINT>
      </MODE-SWITCH-POINTS>
      ...
    </RUNNABLE-ENTITY>

    C コードには、モード スイッチを他のソフトウェア コンポーネントに伝達する Rte_Switch API 呼び出しが含まれています。たとえば、次のコードは EngineModes モード スイッチを伝達します。

    /* Outport: '<Root>/EngineMode' */
    Rte_Switch_currentState_EngineModes(mEngineFailureMode_B.engstate);

関連する例

詳細