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 コールバックにより Stop の値が 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 チャートは、コマンド "PLAY""REW""FF" および "STOP" を、string データ MechCmd を介して CD Player チャートに出力します。

  • RadioReq の値が "AM" の場合は、サブステート 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を参照) を使用します。出力 string CDStatus でテキストを生成する場合、チャートは 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 は表示全体で前方にスクロールします。

参考

| | | | | |

関連するトピック