このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
メディア プレーヤーのシミュレーション
この例では、C をアクション言語として使用する Stateflow® チャートと、App Designer で作成された MATLAB® アプリの間のインターフェイスを作成する方法を説明します。MATLAB をアクション言語として使用する Stateflow チャートを MATLAB アプリに接続する方法の詳細については、パワー ウィンドウ コントローラーのモデル化を参照してください。
この例では、MATLAB アプリはメディア プレーヤーのフロント エンドをモデル化します。シミュレーション中に、メディア プレーヤーの AM ラジオ、FM ラジオ、および CD プレーヤーのいずれかのコンポーネントを選択できます。CD プレーヤーがオンの場合、再生モードも選択できます。
Stateflow チャート App Interface
では、MATLAB アプリと、Simulink® モデルの制御およびプラント システムの間の双方向接続を使用できます。アプリのウィジェットを操作すると、チャートはこれに対応するコマンドをモデルのもう一方のチャートに送信します。これらのチャートは string を使用してメディア プレーヤーの動作を制御し、ステータスを示す自然言語の出力メッセージを提供します。メディア プレーヤーのステータスが変化すると、チャートではボタンの色が変わり、アプリの下部にあるテキスト フィールドが更新されます。
メディア プレーヤー モデルの実行
Simulink モデルを開き、[実行] をクリックします。Media Player Helper アプリが開きます。アプリの下部のテキスト フィールドに、メディア プレーヤーのステータス
Standby (OFF)
が表示されます。[Radio Request] セクションで、[CD] をクリックします。メディア プレーヤーのステータスが
CD Player: Empty
に変わります。[Insert Disc] をクリックします。メディア プレーヤーのステータスが短時間
Reading: Handel's Greatest Hits
になり、その後CD Player: Stopped
に変わります。[CD Request] セクションで、[PLAY] をクリックします。メディア プレーヤーのステータスが
Playing: Handel's Greatest Hits
に変わり、音楽の再生が始まります。[CD Request] セクションで、[FF] をクリックします。音楽が停止し、鳥の鳴き声の音声が始まります。メディアのステータスが
Forward >> Handel's Greatest Hits
に変わります。このメッセージ内のアルバム名は、表示全体で前方にスクロールします。Media Player Helper アプリを使用して他の操作モードを選択するか、別のアルバム名を入力します。たとえば、アルバム
Training Deep Networks
またはFun With State Machines
の再生を試みます。シミュレーションを停止するには、Media Player Helper アプリを閉じます。
チャートと MATLAB アプリとの接続
チャート App Interface
は、既に MATLAB アプリ sf_mediaplayer_app
と通信するよう構成されています。MATLAB アプリと、C をアクション言語として使用する Stateflow チャートの間で双方向の接続を作成するには、以下の手順に従ってください。MATLAB アプリで、以下を行います。
シミュレーション中にチャートとのインターフェイスをとるカスタム プロパティを作成します。アプリはこのプロパティを使用してチャートの入力、チャートの出力、ローカル データにアクセスします。詳細については、App Designer アプリ内でのデータの共有を参照してください。
アプリの
startupFcn
コールバックで新しい入力引数を追加して、前のステップで作成したプロパティとしてその値を格納し、このコールバックを変更します。詳細については、App Designer のコールバックを参照してください。
Stateflow チャートで、以下を行います。
アプリとのインターフェイスをとるローカル データ オブジェクトを作成します。チャートがアプリで補助関数を呼び出すときに、このローカル データ オブジェクトを引数として使用します。
前のステップで作成したローカル データ オブジェクトのタイプを
ml
に設定します。詳細については、Stateflow データの型の指定を参照してください。アプリが外部 MATLAB コードであることを示す
ml
名前空間演算子を使用して、アプリを実行します。キーワードthis
を引数として渡し、シミュレーション中にアプリがチャートにアクセスできるようにします。関数呼び出しによりアプリに返された値を、アプリとのインターフェイスをとるために作成したローカル データ オブジェクトとして格納します。詳細については、C チャート内の MATLAB 関数およびワークスペース データへのアクセスを参照してください。
この例では、Media Player Helper アプリは chart
というプロパティを使用して、チャート App Interface
とのインターフェイスをとります。アプリのコールバックはこのプロパティを使用してチャートの出力に書き込みます。
ディスクを挿入するか取り出すと、
EjectButtonPushed
コールバックによりinsert
、eject
、Album
の値が設定されます。アプリの [Radio Request] セクションでボタンをクリックすると、対応するコールバックにより
RadioReq
の値が設定されます。アプリの [CD Request] セクションでボタンをクリックすると、対応するコールバックにより
CDReq
の値が設定されます。アプリを閉じると、
UIFigureCloseRequest
コールバックによりStop
の値がtrue
に設定されます。
逆に、チャートでは、InterfaceWithApp
ステートの entry アクションがアプリ sf_mediaplayer_app
を実行し、戻り値をローカル データ オブジェクト app
として格納します。チャートは、補助関数 updateButtons
および updateStatus
を呼び出すときに、このローカル データ オブジェクトを使用します。アプリでは、チャート入力 RadioMode
、CDMode
、および CDStatus
の値に基づいて、これらの補助関数によりボタンの色が変更され、アプリの下部のテキスト フィールドが更新されます。
メディア プレーヤーのモードの管理
Mode Manager
チャートは、App Interface
チャートから受け取った入力に応じてメディア プレーヤーの適切なサブコンポーネント (AM ラジオ、FM ラジオまたは CD プレーヤー) をアクティブにします。チャート入力 RadioReq
および CDReq
には、チャートの動作を制御する string データが格納されています。この string データを評価するため、チャートは string 演算子strcmp
、およびこれと等価の省略形 ==
を使用します。チャート出力 CurrentRadioMode
はアプリに自然言語出力を提供し、MechCmd
は CD プレーヤー サブコンポーネントの動作を制御します。これらの出力に値を代入するため、チャートは string 演算子strcpy
、およびこれと等価の省略形 =
を使用します。
シミュレーションの開始に際し、NormalOperation
ステートがアクティブになります。boolean データ DiscEject
が true
の場合、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 演算子strcat
、strlen
、およびsubstr
を使用します。
シミュレーションの開始に際し、Empty
ステートがアクティブになります。
boolean データ DiscInsert
が true
の場合、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
は表示全体で前方にスクロールします。
参考
after
| hasChanged
| strcat
| strcmp
| strcpy
| strlen
| substr