Simulink 関数を使用した共有プリンターでのインク状態の監視
この例では、複数のクライアントから 1 つのサーバーにリクエストを送信し、サーバーから状態を受信する方法を示します。Simulink® 関数を使用すると、さまざまなサブシステムで他のサブシステムの関数を呼び出し、Simulink および Stateflow® でやり取りできます。この例では、Simulink 関数を使用して共有プリンターのインク状態の監視をモデル化します。
この例では、クライアントは 3 台のコンピューターであり、サーバーはコンピューターによって共有されているネットワーク プリンターです。コンピューター コンポーネントを関数の呼び出し元としてモデル化します。コンピューターがそれぞれ、ランダムなサイズの印刷ジョブを一定の間隔で生成します。プリンターは、Simulink キャンバス上にある 2 つの Simulink Function と、Stateflow 内の 1 つのエクスポートされたグラフィカル関数を通してコンピューターとやり取りします。この例をシミュレートして、Stateflow チャートのコードを生成できます。
モデルを開きます。
open_system("slexPrinterExample")
このモデルの変数は次のとおりです。
job
は印刷ジョブのページ数を表します。work
はキューに入っている、印刷する合計ページ数を表します。ink_status
はプリンターにインクがあるかどうかを示すブール値です。ink
はプリンター内のインクの量を表します。値が 1 未満の場合、警告が表示されます。値が 0 の場合、ink_status
はfalse
です。
このモデルの関数は次のとおりです。
関数
addPrintJob
は、ink_status
が 1 より大きい場合、キューに入れる印刷ジョブをランダムに生成します。印刷ジョブをキューに追加するために、関数addPrintJob
はqueuePrintJob
を呼び出します。関数
queuePrintJob
は、変数work
を更新することで印刷ジョブをキューに追加します。printerInk
はジョブの印刷を表すためにink
を更新します。
プリンターは、Idle
と Busy
の 2 つの状態を遷移します。work
が 0 以下の場合、プリンターはアイドル状態です。これは、キューに入っている印刷ジョブがないことを意味します。work
が 0 より大きい場合、プリンターはビジー状態です。これは、印刷ジョブがキューに入っていることを意味します。プリンターがビジー状態の場合、キュー内のページ数を減らすために work
が更新され、ink_status
を更新するために printerInk
が呼び出されます。
Simulink 関数と関数の呼び出し元の実装
コンピューターは、Function Callerブロックを使用してプリンターの addPrintJob
インターフェイスを呼び出すクライアント コンポーネントです。この関数呼び出しでモデル化するクライアント/サーバー型の対話では、プリンターのインクが切れている場合、負の戻り値が返される場合があります。
関数 addPrintJob
は Simulink Function ブロック内に実装されます。Simulink Function の内部には、Stateflow のエクスポートされたグラフィカル関数である queuePrintJob
を呼び出す Function Caller ブロックがあります。
関数 queuePrintJob
は、Stateflow チャート内に実装されます。Stateflow チャートでは、queuePrintJob
はローカルのチャート変数 work
を使用してチャート内の他のコンテンツとやり取りします。
チャートの実装は、Simulink 関数である printerInk
への呼び出しを行います。関数 printerInk
は、グラフィカル入出力を使用して関数 addPrintJob
とやり取りする Simulink Function ブロックに実装されます。
関数シーケンスの表示
Simulink 関数を可視化およびデバッグすることもできます。関数とそれぞれの呼び出し元の関係を可視化するには、Simulink エディターの [デバッグ] タブにある [情報のオーバーレイ] で、[コネクタ] をクリックします。Simulink キャンバス上の [コネクタ] ペインで [関数コネクタ] を選択します。
モデルを実行します。
sim("slexPrinterExample");
Sequence Viewerブロックは、コンピューターがいつ関数呼び出しを生成するかを示します。この情報を使用すると、呼び出しの流れを時間に基づいて把握したり、これらの関数の呼び出しの間に送信される引数を解析したりすることができます。
参考
Simulink Function | Function Caller | シーケンス ビューアー