タスク3.1 - ベーシックなサブフローを構築する
タスクの概要
このチュートリアルタスクでは、処理フローツールでサブフローを構築するための基本について学習します。サブ処理フローは、複数の処理フローの別々のアクティビティやイベントによってトリガーされたときに実行される別個の処理フローです。サブフローは、シミュレーションモデルまたは一般的な処理フローの特定のイベントによってトリガーされたときに実行される、自己完結型ロジックをまとめたものです。
サブフローは必要に応じて細分化し、処理フローの複数の場所に処理フローアクティビティの特定のブロックを作成できます。サブフローを使用すると、メイン処理フローの特定のアクティビティやイベントによってトリガーされる、より複雑なプロシージャを計算したり、シミュレーションを実行したりできます。サブフローに関連する主要な概念の詳細については、「処理フローサブフロー」を参照してください。
このチュートリアルでは、プロセッサの処理時間を動的に決定する内部サブフローを作成します。作業が完了すると、3Dモデルと処理フローは次の画像のようになります。
サブフローのベーシックコンポーネント
サブフローは、[トークンを作成]または[サブフローを実行]アクティビティが[サブフローを開始]アクティビティにトークンを送信するときに開始します。サブフローは、サブフローのすべてのアクティビティを通過して[終了]アクティビティに達すると終了します。
親トークンと子トークン
通常サブフローでは、[トークンを作成]または[サブフローを実行]アクティビティがサブフローにトークンを送信するときに、新しいトークンが作成されます。ユーザー独自のモデルロジック要件に沿って、サブフローで新しく作成したこのトークンとメイン処理フローで作成されたトークンの関係性をユーザーが決定する必要があります。次の3つのベーシックオプションがあります。
- 独立したトークン - 作成されたトークンは元のトークンに関連付けられません。トークンは、独立したトークンを作成するとすぐに、メイン処理フローで次の下流アクティビティに移動します。独立したトークンでは、必要に応じて元のトークンからラベルをコピーできます。
- 子トークン - 作成されたトークンは元のトークンの子トークンになります。メイン処理フローの元のトークンは親トークンになります。子トークンには、親トークンのラベルへの読み取りまたは書き込みアクセス権を持たせることができます。
- 兄弟トークン - 作成されたトークンは元のトークンの兄弟トークンになります。つまり、元のトークンと同じ親を持つことになります。
このチュートリアルタスクでは、主に子トークンと親トークンで作業します。サブフローの子トークンは、メイン処理フローの親トークンでラベルにアクセスする必要があります。
ステップ1 3Dモデルを構築する
このステップでは、基本的な3Dモデルを構築します。作業が完了すると、3Dモデルは次の画像のようになります。
このモデルを構築するには:
- ライブラリから次のオブジェクトをドラッグし、左から順にこの順番でモデルに配置します。
- 1つの[ソース]
- 1つの[キュー]
- 1つの[プロセッサ]
- 1つの[シンク]
- このステップのはじめに画像で示したレイアウトとほぼ同じレイアウトになるように、オブジェクトを移動します。
- 分かりやすくするために、オブジェクトの名前を次のように変更します。
- 次のポート接続(A接続)を作成します。
- [ソース]を[キュー]に接続する
- [キュー]から[プロセッサ]に
- [プロセッサ]から[シンク]に
オブジェクト | 新しい名前 |
---|---|
Source1 | ソース |
Queue1 | キュー |
Processor1 | プロセッサ |
Sink1 | シンク |
このセクションの冒頭に表示した画像のようにモデルがなっていることを確認します。
ステップ2 処理フローにアクティビティを追加する
このステップでは、アクティビティを一般的な処理フローに追加して、プロセッサの処理時間を変更する処理フローを構築します。
作業が完了すると、処理フローは次の画像のようになります。
現時点では、これらのアクティビティの追加と処理フローへの接続のみを行います。後のステップで、プロパティを編集して機能を追加します。
これらのアクティビティを追加して接続するには:
- メインツールバーで[処理フロー]ボタンをクリックして、メニューを開きます。[一般的な処理フロー]を選択します。
- [クイックプロパティ]の[処理フローの名前]ボックスで、現在のテキストを削除し、処理フローの名前を「ProcessingTimes」に変更します。
- ライブラリの[フローチャート]グループで、3つの[処理]形状を新しい処理フローに追加します。
- 分かりやすくするために、3つの処理形状の名前を次のように変更します。
- 高速処理時間
- 低速処理時間
- 処理時間をオーバーライド
- ライブラリから、次のアクティビティを[高速処理時間]形状に追加します。
- [スケジュールソース]アクティビティ([トークンの作成]の下)
- [ラベルを割り当て]アクティビティ([ベーシック]の下)
- 3つの[サブフローを実行]アクティビティ([サブフロー]の下)
- 分かりやすくするために、これらのアクティビティの名前を次のように変更します。
- [ソース]から[ラベルを割り当て]アクティビティまでのコネクターを作成します(アクティビティの下部中央にマウスを置き、コネクター アイコンに変更するまでそのままにします。他のアクティビティにスナップするまで、コネクターをクリックしてドラッグします)。
- [ラベルを割り当て]アクティビティと[サブフローを実行]アクティビティをスタックブロックに結合します。
- ライブラリから、次のアクティビティを[低速処理時間]形状に追加します。
- [ラベルを割り当て]アクティビティ([ベーシック]の下)
- 2つの[サブフローを実行]アクティビティ([サブフロー]の下)
- 分かりやすくするために、これらのアクティビティの名前を次のように変更します。
- [高速処理時間]形状のスタックブロックの最後から[低速処理時間]形状の最初のアクティビティまでのコネクターを作成します。
- [サブフローを実行:低速2]アクティビティの最後から[ラベルを割り当て:高速に設定]アクティビティにループするコネクターを作成します。
- ライブラリで、次のアクティビティを[処理時間をオーバーライド]形状に追加して、スタックブロックを作成します。
- [開始]アクティビティ([サブフロー]の下)
- [イベントを待つ]アクティビティ([ベーシック]の下)
- [終了]アクティビティ([サブフロー]の下)
- 分かりやすくするために、これらのアクティビティの名前を次のように変更します。
アクティビティ | 新しい名前 |
---|---|
ソース | ソース:シミュレーションを開始 |
ラベルを割り当て | ラベルを割り当て:高速に設定 |
最初のサブフローを実行 | サブフローを実行:高速1 |
2回目のサブフローを実行 | サブフローを実行:高速2 |
3回目のサブフローを実行 | サブフローを実行:高速3 |
アクティビティ | 新しい名前 |
---|---|
ラベルを割り当て | ラベルを割り当て:低速に設定 |
最初のサブフローを実行 | サブフローを実行:低速1 |
2回目のサブフローを実行 | サブフローを実行:低速2 |
アクティビティ | 新しい名前 |
---|---|
開始 | サブフローを開始 |
イベントを待つ | イベントを待つ:処理時間 |
終了 | 終了して処理時間をオーバーライド |
シミュレーションモデルを保存することをおすすめします。
ステップ3 アクティビティのプロパティを編集する
このステップでは、処理フローのアクティビティのプロパティを編集します。各アクティビティの機能の概要を次に示します。
アクティビティ | 説明 |
---|---|
ソース:シミュレーションを開始 | [スケジュールソース]アクティビティでは、シミュレーションの開始直後にトークンを1つ作成し、そのトークンを[ラベルを割り当て]アクティビティに送信します。このトークンを作成した後は、追加のトークンは作成されません。トークンは、シミュレーションが終了するまで他のアクティビティをループし続けます。このアクティビティにはデフォルトのプロパティを使用します。 |
[ラベルを割り当て]アクティビティ | 両方の[ラベルを割り当て]アクティビティでは、サブフローがプロセッサの処理時間をコントロールするときに参照する「processTime」というラベルを作成して設定します。最初の[ラベルを割り当て]アクティビティではラベルを2 に設定し、2番目のアクティビティでは10 に設定します。 |
[サブフローを実行]アクティビティ | [サブフローを実行]アクティビティでは、[サブフローを開始]アクティビティで子トークンを作成します。子トークンがサブフローの最後に達するまで、親トークンは[サブフローを実行]アクティビティに残ります。子トークンがサブフローを終了すると、トークンは次の下流アクティビティに移動します。 |
サブフローを開始 | すべてのサブフローは、[サブフローを実行]アクティビティによって作成された子トークンを受け取る[開始]アクティビティから始める必要があります。次に、子トークンを次のアクティビティにリリースします。 |
イベントを待つ:処理時間 | [イベントを待つ]アクティビティはイベントリスニングのアクティビティです。つまり、リスニング対象のイベントが発生するまで、トークンはこのアクティビティで待機します。このアクティビティは、処理時間イベントのプロセッサをリッスンします。プロセッサで処理時間を開始する準備ができると、トークンは[終了]アクティビティにリリースされます。また、このアクティビティを設定して処理時間をオーバーライドします。 |
終了して処理時間をオーバーライド | [終了]アクティビティでは、プロセッサに処理時間の戻り値を提供します。アクティビティではこの戻り値を提供した後、子トークンを破棄し、[サブフローを実行]アクティビティの親トークンに子トークンがサブフローを終了したことを警告します。 |
これらのプロパティを編集するには:
- [ラベルを割り当て:高速に設定]アクティビティの[クイックプロパティ]で[追加]ボタン をクリックして新しいラベルを追加します。
- 新しいラベルの[名前]ボックスで、既存のテキストを削除して「
processTime
」と入力します。 - [値]ボックスに、2つのシミュレーション時間単位を表す「
2.00
」を入力します。 - これらのステップを繰り返し[ラベルを割り当て:低速に設定]に適用します。ただし今度は[値]ボックスをシミュレーション時間単位「10」を示す「
10
」に変更します。 - [サブフローを実行:高速1]アクティビティをクリックして選択します。
- このアクティビティの横にある[感嘆符]ボタン をクリックして、サンプリングモードに入ります。アクティビティがリンクされていることを示す青い線が表示されます。
- [サブフローを開始]アクティビティをクリックして、サンプリングします。
- すべての[サブフローを実行]アクティビティに対して、前のステップを繰り返します。
- [イベントを待つ:処理時間]アクティビティをクリックして選択します。このアクティビティの横にある[感嘆符]ボタン をクリックして、サンプリングモードに入ります。
- 3Dモデルで、[プロセッサ]をクリックして、メニューを開きます。[プロセッサ:処理時間]をメニューから選択し、このイベントをサンプリングします。プロセッサの名前がアクティビティの横に表示され、リンクされていることが示されます。
- [イベントを待つ:処理時間]アクティビティの[クイックプロパティ]で、[戻り値をオーバーライドします]チェックボックスをオンにします。
- [終了して処理時間をオーバーライド]アクティビティをクリックして選択します。
- [クイックプロパティ]で[戻り値]ボックスの横にある矢印をクリックして、メニューを開きます。[トークンラベル]をポイントし、[processTime]を選択します。
シミュレーションモデルを保存することをおすすめします。
ステップ4 モデルを実行する
モデルをリセットして実行します。
[ソース]で時間0にトークンが作成された後、そのトークンが[高速に設定]アクティビティに入り、そのprocessTimeラベルが2に設定されることがわかります。トークンはその後、最初の[高速1]アクティビティに移動します。ここでは子トークンが作成され、サブフローの[処理時間を待つ]アクティビティに置かれます。
モデルのプロセッサでアイテムが受け取られるとすぐに、[イベントを待つ]ではトークンがリリースされ、処理時間がオーバーライドされます。子トークンはその後破棄され、親トークンは次の[サブフローを実行]アクティビティに移動し、サブフローが再び開始します。これは各アイテムがプロセッサに入るごとに続きます。トークンは、[低速2]を終了すると先頭に戻り、パターンを続けます。
シミュレーションを一時停止し、サブフローのトークンの1つをクリックすると、トークン間の親子接続を示す青い線が表示されます。
ロジックはコーディングせずに簡単に作成できるだけでなく、プロセッサが処理時間のセットのどこにあるかを目視できます。これは貴重なデバッグツールとして使用できます。または統計を収集する際に役立ちます。統計は、アクティビティまたは領域に対して個別にまたは集合的に収集し、プロセッサが一定の状態でどれくらいの時間を費やしたかを記録できます。
結論
次のチュートリアルタスクでは、複数の終了アクティビティを追加してサブフローを構築する別の方法について学習します。チュートリアルタスク3.2 - 複数の終了アクティビティを追加するに進みます。