Main Content

メディア プレーヤーのシミュレーション

この例では、C をアクション言語として使用する Stateflow® チャートと、App Designer で作成された MATLAB® アプリの間のインターフェイスを作成する方法を説明します。MATLAB をアクション言語として使用する Stateflow チャートを MATLAB アプリに接続する方法の詳細については、パワー ウィンドウ コントローラーのモデル化を参照してください。

この例では、MATLAB アプリはメディア プレーヤーのフロント エンドをモデル化します。シミュレーション中に、メディア プレーヤーの AM ラジオ、FM ラジオ、および CD プレーヤーのいずれかのコンポーネントを選択できます。CD プレーヤーがオンの場合、再生モードも選択できます。

Stateflow チャートApp Interfaceでは、MATLAB アプリと、Simulink® モデルの制御およびプラント システムの間の双方向接続を使用できます。アプリのウィジェットを操作すると、チャートはこれに対応するコマンドをモデルのもう一方のチャートに送信します。これらのチャートは string を使用してメディア プレーヤーの動作を制御し、ステータスを示す自然言語の出力メッセージを提供します。メディア プレーヤーのステータスが変化すると、チャートではボタンの色が変わり、アプリの下部にあるテキスト フィールドが更新されます。

メディア プレーヤー モデルの実行

  1. Simulink モデルを開き、[実行]をクリックします。Media Player Helper アプリが開きます。アプリの下部のテキスト フィールドに、メディア プレーヤーのステータスStandby (OFF)が表示されます。

  2. [Radio Request]セクションで、[CD]をクリックします。メディア プレーヤーのステータスがCD Player: Emptyに変わります。

  3. [Insert Disc]をクリックします。メディア プレーヤーのステータスが短時間Reading: Handel's Greatest Hitsになり、その後CD Player: Stoppedに変わります。

  4. [CD Request]セクションで、[PLAY]をクリックします。メディア プレーヤーのステータスがPlaying: Handel's Greatest Hitsに変わり、音楽の再生が始まります。

  5. [CD Request]セクションで、[FF]をクリックします。音楽が停止し、鳥の鳴き声の音声が始まります。メディアのステータスがForward >> Handel's Greatest Hitsに変わります。このメッセージ内のアルバム名は、表示全体で前方にスクロールします。

  6. Media Player Helper アプリを使用して他の操作モードを選択するか、別のアルバム名を入力します。たとえば、アルバムTraining Deep NetworksまたはFun With State Machinesの再生を試みます。シミュレーションを停止するには、Media Player Helper アプリを閉じます。

チャートと MATLAB アプリとの接続

チャートApp Interfaceは、既に MATLAB アプリsf_mediaplayer_appと通信するよう構成されています。MATLAB アプリと、C をアクション言語として使用する Stateflow チャートの間で双方向の接続を作成するには、以下の手順に従ってください。MATLAB アプリで、以下を行います。

  1. シミュレーション中にチャートとのインターフェイスをとるカスタム プロパティを作成します。アプリはこのプロパティを使用してチャートの入力、チャートの出力、ローカル データにアクセスします。詳細については、App Designer アプリ内でのデータの共有を参照してください。

  2. アプリのstartupFcnコールバックで新しい入力引数を追加して、前のステップで作成したプロパティとしてその値を格納し、このコールバックを変更します。詳細については、App Designer でコールバックを記述するを参照してください。

Stateflow チャートで、以下を行います。

  1. アプリとのインターフェイスをとるローカル データ オブジェクトを作成します。チャートがアプリで補助関数を呼び出すときに、このローカル データ オブジェクトを引数として使用します。

  2. 前のステップで作成したローカル データ オブジェクトのタイプをmlに設定します。詳細については、Stateflow データの型の指定を参照してください。

  3. アプリが外部 MATLAB コードであることを示すml名前空間演算子を使用して、アプリを実行します。キーワードthisを引数として渡し、シミュレーション中にアプリがチャートにアクセスできるようにします。関数呼び出しによりアプリに返された値を、アプリとのインターフェイスをとるために作成したローカル データ オブジェクトとして格納します。詳細については、C チャート内の MATLAB 関数およびワークスペース データへのアクセスを参照してください。

この例では、Media Player Helper アプリはchartというプロパティを使用して、チャートApp Interfaceとのインターフェイスをとります。アプリのコールバックはこのプロパティを使用してチャートの出力に書き込みます。

  • ディスクを挿入するか取り出すと、EjectButtonPushedコールバックによりinsertejectAlbumの値が設定されます。

  • アプリの[Radio Request]セクションでボタンをクリックすると、対応するコールバックによりRadioReqの値が設定されます。

  • アプリの[CD Request]セクションでボタンをクリックすると、対応するコールバックによりCDReqの値が設定されます。

  • アプリを閉じると、UIFigureCloseRequestコールバックにより停止の値がtrueに設定されます。

逆に、チャートでは、InterfaceWithAppステートの entry アクションがアプリsf_mediaplayer_appを実行し、戻り値をローカル データ オブジェクトappとして格納します。チャートは、補助関数updateButtonsおよびupdateStatusを呼び出すときに、このローカル データ オブジェクトを使用します。アプリでは、チャート入力RadioModeCDMode、およびCDStatusの値に基づいて、これらの補助関数によりボタンの色が変更され、アプリの下部のテキスト フィールドが更新されます。

メディア プレーヤーのモードの管理

Mode Managerチャートは、App Interfaceチャートから受け取った入力に応じてメディア プレーヤーの適切なサブコンポーネント (AM ラジオ、FM ラジオまたは CD プレーヤー) をアクティブにします。チャート入力RadioReqおよびCDReqには、チャートの動作を制御する string データが格納されています。この string データを評価するため、チャートは string 演算子strcmp、およびこれと等価の省略形==を使用します。チャート出力CurrentRadioModeはアプリに自然言語出力を提供し、MechCmdは CD プレーヤー サブコンポーネントの動作を制御します。これらの出力に値を代入するため、チャートは string 演算子strcpy、およびこれと等価の省略形=を使用します。

シミュレーションの開始に際し、NormalOperationステートがアクティブになります。boolean データDiscEjecttrueの場合、Ejectステートへの遷移が発生し、続いてNormalOperationステートに戻る遷移が発生します。

NormalOperationがアクティブになると、ヒストリ ジャンクションにより記録された、直前にアクティブであったサブステート (StandbyまたはON) がアクティブになります。StandbyサブステートとONサブステート間のその後の遷移は、式strcmp(RadioReq,"OFF")の値によって決まります。

  • strcmpが値 0 を返す場合、RadioReq"OFF"であり,Standbyサブステートがアクティブ化されます。

  • strcmpが非ゼロの値を返す場合、RadioReqは "|OFF|" ではなく、ONサブステートがアクティブ化されます。

ONサブステートでは、3 つのサブステートがメディア プレーヤーの動作モードを表します。すなわち、CD プレーヤー、AM ラジオ、および FM ラジオです。サブステートはそれぞれ、入力RadioReqの異なる値に対応します。ONステート内の内部遷移は、演算子hasChangedを使用して、RadioReqの値に変化がないかどうかを継続的にスキャンします。

  • RadioReqの値が"CD"の場合は、サブステートCDModeがアクティブになり、メディア プレーヤーが CD プレーヤー モードに切り替わります。Mode Managerチャートは、コマンド“玩”"REW"“FF"および"STOP"を、string データMechCmdを介してCD Playerチャートに出力します。

  • RadioReqの値が“我”の場合は、サブステートAMModeがアクティブになり、メディア プレーヤーが AM ラジオ モードに切り替わります。Mode Managerチャートは、"STOP"コマンドを、string データMechCmdを介してCD Playerチャートに出力します。

  • RadioReqの値が“FM"の場合は、サブステートFMModeがアクティブになり、メディア プレーヤーが FM ラジオ モードに切り替わります。Mode Managerチャートは、"STOP"コマンドを、string データMechCmdを介してCD Playerチャートに出力します。

CD プレーヤー モードの管理

CD Playerチャートは、App InterfaceチャートとMode Managerチャートから受け取った入力に応じて CD プレーヤーの適切な動作モードをアクティブにします。チャート入力CmdおよびAlbumには、チャートの動作を制御する string データが格納されています。チャート出力AlbumNameは、自然言語出力をアプリに提供します。string データの代入と比較を行う場合、チャートは省略形の演算=(strcpyを参照) および==(strcmpを参照) を使用します。出力 stringCDStatusでテキストを生成する場合、チャートは string 演算子strcatstrlen、およびsubstrを使用します。

シミュレーションの開始に際し、Emptyステートがアクティブになります。

boolean データDiscInserttrueの場合、Insertingステートへの遷移が発生します。短い時間遅延の後、DiscPresentステートへの遷移が発生します。データCmd"EJECT"になるまで、DiscPresentステートはアクティブなままです。この時点でEjectingステートへの遷移が発生します。短い時間遅延の後、Emptyステートへの遷移が発生します。時相論理演算子afterは、ディスクの挿入と取り出し中の遷移のタイミングを制御します。

ステートの遷移が発生すると、新しいステートの entry アクションでは、CD プレーヤーのステータスを反映してCDStatusの値が変更されます。サブステートFFまたはREWでは、スクロールのモーション エフェクトを生成するために、during アクションによってCDStatusの値が継続的に変更されます。

  • アクティブ ステートがEmptyのとき、CDStatusの値は"CD Player: Empty"です。

  • アクティブ ステートがInsertingのとき、CDStatusの値は"Reading:AlbumName"です。

  • アクティブ ステートがEjectingのとき、CDStatusの値は"Ejecting:AlbumName"です。

  • アクティブ ステートがDiscPresent。STOPのとき、CDStatusの値は"CD Player: Stopped"です。

  • アクティブ ステートがDiscPresent。PLAYのとき、CDStatusの値は"Playing:AlbumName"です。

  • アクティブ ステートがDiscPresent。REWのとき、CDStatusの値は"Reverse <<AlbumName"です。AlbumNameは表示全体で後方にスクロールします。

  • アクティブ ステートがDiscPresent。FFのとき、CDStatusの値は“Forward >>AlbumName"です。AlbumNameは表示全体で前方にスクロールします。

参考

||||||

関連するトピック