タスク3.2 - 条件付きタスクを追加する

タスクの概要

このチュートリアルタスクでは、モデルの実行中にさまざまな条件に基づいて変更できるタスクを作成する方法を学びます。シミュレーションモデルになんらかの制約を追加して、これらのさまざまな条件を作成します。まず、アンロード先を2つ追加します(合計3つ)。次に、最大容量を変更して、これらのキューが一度に受け入れることができるフローアイテムの数にいくつかの制限を追加します。これらの制限により、オペレーターが単一の目的地ですべてのアイテムをアンロードできない可能性が生じ、キューにフローアイテムを受け入れる余地があるかどうかの評価が必要になります。

このロジックを作成するには、[決定]アクティビティを使用するネストされたサブフロー(サブフロー内のサブフロー)を作成します。[決定]アクティビティでは、シミュレーション実行中に目的地が最大容量に達したかどうかに基づき、動的に決定を行います。

作業が完了すると、シミュレーションモデルは次の画像のように動作します。

グループは配列としても機能

前のチュートリアルで、配列とは必要に応じて複数の値を含むことができるデータ構造であると学びました。復習すると、その配列の各要素は通常、インデックスによって識別されることも学びました。インデックスとは、配列内の値の位置を示す数字です。前のチュートリアルでは、ItemsToTransportリストからプルした2~5つのフローアイテムを含むGroupOfItemsという配列を含むラベルを作成しました。

しかし、ラベルだけが配列を含むことができるわけではありません。3Dオブジェクトグループは実際にはそのメンバーに関する情報を配列として格納します。GroupOfItems配列内の個々のフロー項目をそれらのインデックスで参照できるのと同じように、3Dオブジェクトグループの特定のメンバーをそれらのインデックスで参照することもできます。グループメンバーのインデックスは、グループ内での出現順に基づいています。

たとえば、このチュートリアルの最初のステップでは、3Dモデルにさらに2つのキューを追加します。次に、これらのキューを前のチュートリアルで作成した目的地グループに追加します。

この例では、目的地グループに3つのキューを含む配列があります。各キューは、そのインデックスである配列内の1~3の間の位置を占めます。

配列内のいずれかのキューを参照したい場合は、その特定のインデックスを使用する必要があります。前の画像の例を使用すると、FlexScript式「Group("Destinations")[2]」は、[Destination2]平面の[Queue2]への参照を返します。「Group("Destinations")[3]」の式は、[Destination3]平面の[Queue3]への参照を返します。

.length」の式は、特定の配列に含まれる要素の数を示す値を返すことを思い出してください。同様に、目的地グループには3つのメンバーがあるため、「Group("Destinations").length」という式は3の値を返します。

ステップ1 3Dモデルを修正する

このステップでは、3Dモデルにさらに2つの目的地を追加します。次に、各キューが一定時間に保持できるフローアイテムの数を制限することによって、モデルにいくつかの制約を追加します。作業が完了すると、モデルは次の画像のようになります。

これらの変更を行うには:

  1. 3Dモデルの[Destination1]平面をクリックして選択します(オレンジ色のものです)。
  2. [Ctrl + C]キーを押して、平面とその上にあるすべてのオブジェクトをコピーします。モデルの空白部分をクリックして、元の平面の選択を解除します。[Ctrl + V]を押して平面をコピーします。
  3. このステップを繰り返して、3つ目の平面を追加します。
  4. 2番目にコピーした平面を選択した状態で、[クイックプロパティ]で平面の名前を「Destination2」に変更します。
  5. [Queue2]、[プロセッサ2][シンク2]など、2番目にコピーされた平面上の各3Dオブジェクトの名前がすべて「2」で終わるように名前を変更します。
  6. これらのステップを繰り返して、3番目にコピーした平面の名前を「Destination3」に変更し、平面上のすべてのオブジェクトの名前を「3」で終わるように変更します。
  7. Queue1]をクリックして選択します。[クイックプロパティ]の[キュー]タブの[最大コンテンツ]ボックスに「2」と入力します。[OK]ボタンをクリックして変更を保存し、プロパティウィンドウを閉じます。
  8. Queue2]に対してこのステップを繰り返し、[最大コンテンツ]を「1」に変更します。
  9. Queue3]に対してこのステップを繰り返し、[最大コンテンツ]を「3」に変更します。
  10. 2つの平面をコピーすると、FlexSimは自動的に[Queue2]と[Queue3]を[目的地]グループに追加します。これを確認するには、左側のペインで[ツールボックス]を開きます。[目的地]グループをダブルクリックして、[プロパティ]ウィンドウを開きます。このグループに2つの新しいキューがあることを確認してください。
  11. すべてのグループウィンドウを閉じます。

モデルがこのステップの冒頭に表示した画像のようになっていることを確認します。

ステップ2 処理フローを再編成する

このステップでは、[アンロードのサブフロー]図形とアクティビティを再編成して処理フローを変更します。実際にサブフロー内にサブフローを含むサブフローで、このロジックの編成を作成します。作業が完了すると、処理フローは次の画像のようになります。

ここでは処理フローのいくつかの図形とアクティビティを再編成するのみですが、このステップの最後で、[サブフローを実行:アンロード]アクティビティに少し変更を加えます。

処理フローを再編成するには次を実行します。

  1. アンロードのサブフロー]図形を他の図形の下になるように移動し、サイズが大きくなるように変更します。
  2. 図形]([フローチャート]で)を追加し、それが[アンロードのサブフロー]内にくるように移動します。
  3. 新しい図形の名前を「目的地でアンロードのサブフロー」に変更します。
  4. [クイックプロパティ]で、カラーセレクターを使用して[目的地でアンロードのサブフロー]図形の色を2番目に濃い黄色に変更します。
  5. アンロードのサブフロー]内のアクティビティのスタックブロックをクリックして選択します。[リンク解除]ボタン をクリックして、[目的地でアイテムをアンロード]アクティビティを分離します。
  6. 目的地でアイテムをアンロード]アクティビティを[目的地でアンロードのサブフロー]図形に移動します。
  7. 目的地でアイテムをアンロード]アクティビティを右クリックしてメニューを開きます。[アクティビティビジュアルを編集]を選択してプロパティウィンドウを開きます。
  8. 背景色]セレクターを開き、薄黄色を選択します。
  9. ラベルを割り当て:目的地]アクティビティの名前を「ラベルを割り当て:DestinationNumber」に変更します。
  10. オペレーターのタスク]図形で、[サブフローを実行:アンロード]アクティビティをクリックして選択します。[クイックプロパティ]の[]ボックスで、現在のテキストを削除して「1」と入力します。

シミュレーションモデルを保存することをおすすめします。

ステップ3 アンロードのサブフローにアクティビティを追加する

このステップでは、アンロードのサブフローの処理フローにいくつかのアクティビティを追加します。これらのアクティビティは、最終的に3Dモデルのアンロードロジックをコントロールします。作業が完了すると、処理フローは次の画像のようになります。

ここでは、これらのアクティビティの処理フローへの追加のみを行います。後のステップで接続を追加し、プロパティを編集してロジックを追加します。

これらのアクティビティを追加するには:

  1. アンロードのサブフロー]図形で、次のアクティビティを含むスタックブロックを作成します。
    • 1つの[サブフローを実行]アクティビティ([サブフロー]の下)
    • 1つの[決定]アクティビティ([ベーシック]の下)
  2. アクティビティの名前を次のように変更します。
  3. アクティビティ 新しい名前
    サブフローを実行 サブフローを実行:目的地でアンロード
    決定 決定:その他のアイテムをアンロード?
  4. サブフローを実行:目的地でアンロード]アクティビティを右クリックしてメニューを開きます。[アクティビティビジュアルを編集]を選択してプロパティウィンドウを開きます。
  5. 背景色]セレクターを開き、薄黄色を選択します。
  6. 決定:その他のアイテムをアンロード?]アクティビティを右クリックしてメニューを開きます。[アクティビティビジュアルを編集]を選択してプロパティウィンドウを開きます。
  7. 背景色]セレクターを開き、明るいオレンジ色を選択します。
  8. アンロードのサブフロー]で、以下のアクティビティを含むスタックブロックを作成します。
    • 1つの[ラベルを割り当て]アクティビティ([ベーシック]の下)
    • 1つの[決定]アクティビティ([ベーシック]の下)
  9. アクティビティの名前を次のように変更します。
  10. アクティビティ 新しい名前
    ラベルを割り当て ラベルを割り当て:DestinationNumber+1
    決定 決定:その他の目的地を試す?
  11. 両方のアクティビティの色を薄いオレンジ色に変更します。
  12. サブフローを実行:目的地でアンロード]を含むスタックブロックをクリックして選択します。Ctrl+Cを押してスタックブロックをコピーします。Ctrl+Vを押してアクティビティをコピーします。
  13. 新しくコピーしたスタックブロックを[ラベルを割り当て:DestinationNumber +1]スタックブロックと[アンロードのサブフローを終了]アクティビティの間に来るように移動します。
  14. 新しくコピーされたスタックブロックの先頭に[イベントを待つ]アクティビティ([ベーシック]で)を追加します。
  15. イベントを待つ]アクティビティの名前を[イベントを待つ:キューにスペースがある]に変更します。
  16. ラベルを割り当て:DestinationNumber+1]アクティビティを右クリックしてメニューを開きます。[アクティビティビジュアルを編集]を選択してプロパティウィンドウを開きます。
  17. 背景色]セレクターを開き、明るいオレンジ色を選択します。
  18. 前のステップを繰り返して、残りのアクティビティの色を薄オレンジ色に変更します(黄色の[サブフローを実行]アクティビティを除く)。
  19. 目的地でアンロードのサブフロー]図形で、図形の上部付近に次のアクティビティを含むスタックブロックを作成します。
    • 1つの[開始]アクティビティ([サブフロー]の下)
    • 1つの[移動]アクティビティ([タスクシーケンス]の下)
  20. アクティビティの名前を次のように変更します。
  21. アクティビティ 新しい名前
    開始 目的地でアンロードのサブフローを開始
    移動 目的地に移動
  22. スタックブロックに[決定]アクティビティ([ベーシック]で)を追加します。ただし、そのままで未接続の状態にします。
  23. このアクティビティの名前を「決定:アイテムのスペースは?」に変更します。
  24. 別の[決定]アクティビティを追加し、それを[目的地でアイテムをアンロード]アクティビティに追加して、スタックブロックを作成します。
  25. このアクティビティの名前を「決定:その他のアイテムをアンロード?」に名前を変更します。
  26. 最後のスタックブロックの下に[終了]アクティビティ([サブフロー]で)を追加します。ただし、そのままで未接続の状態にします。
  27. このアクティビティの名前を「目的地でアンロードのサブフローを終了」に変更します。
  28. 開始:目的地でアンロード]アクティビティを右クリックしてメニューを開きます。[アクティビティビジュアルを編集]を選択してプロパティウィンドウを開きます。
  29. 背景色]セレクターを開き、薄黄色を選択します。
  30. これらのステップを繰り返して、[目的地でアンロードのサブフロー]図形ですべてのアクティビティを薄黄色に変更します。

シミュレーションモデルを保存することをおすすめします。

ステップ4 アクティビティを接続する

前のステップで、[決定]アクティビティをいくつか追加したことに注目してください。[決定]アクティビティのロジックは、アクティビティ間のコネクターを正しく設定することが重要です。そのため、このステップではすべてのアクティビティを正しく接続する作業を行います。特に重要な点は、コネクターのランキングが正しくなるように必ずアクティビティを正しい順序で接続することです。これらのステップを正確な順序で実行するようにしてください。

作業が完了すると、処理フローは次の画像のようになります。

これらのアクティビティを接続するには:

  1. ラベルを割り当て:DesinationNumber]アクティビティから出て[サブフローを実行:目的地でアンロード]アクティビティから始まるスタックブロックまで行くコネクターを作成します。
  2. 決定:その他のアイテムをアンロード?]アクティビティから出て[ラベルを割り当て:DestinationNumber+1]アクティビティまで行くコネクターを作成します。
  3. ここで作成したコネクターをクリックして選択します。[クイックプロパティ]の[名前]ボックスに「Yes」と入力します。
  4. 決定:その他のアイテムをアンロード?]アクティビティから出て[アンロードのサブフローを終了]まで行くコネクターを作成します。
  5. ここで作成したコネクターをクリックして選択します。[クイックプロパティ]の[名前]ボックスに「No」と入力します。
  6. 決定:その他の目的地を試す?]アクティビティから出て[サブフローを実行:目的地でアンロード]アクティビティから始まるスタックブロックまで行くコネクターを作成します。
  7. ここで作成したコネクターをクリックして選択します。[クイックプロパティ]の[名前]ボックスに「Yes」と入力します。
  8. 決定:その他の目的地を試す?]アクティビティから出て[イベントを待つ:キューにスペースがある]アクティビティから始まるスタックブロックまで行くコネクターを作成します。
  9. ここで作成したコネクターをクリックして選択します。[クイックプロパティ]の[名前]ボックスに「No」と入力します。
  10. 決定:その他のアイテムをアンロード?]アクティビティから出て[イベントを待つ:キューにスペースがある]アクティビティから始まるものと同じスタックブロックの先頭まで行くコネクターを作成します。
  11. ここで作成したコネクターをクリックして選択します。[クイックプロパティ]の[名前]ボックスに「Yes」と入力します。
  12. 決定:その他のアイテムをアンロード?]アクティビティから出て[アンロードのサブフローを終了]アクティビティから始まるスタックブロックまで行くコネクターを作成します。
  13. ここで作成したコネクターをクリックして選択します。[クイックプロパティ]の[名前]ボックスに「No」と入力します。
  14. 目的地への移動]アクティビティから[決定:アイテムのスペースは?]アクティビティまでのコネクターを作成します。
  15. 決定:アイテムのスペースは?]アクティビティから[目的地でアイテムをアンロード]アクティビティまでのコネクターを作成します。
  16. ここで作成したコネクターをクリックして選択します。[クイックプロパティ]の[名前]ボックスに「Yes」と入力します。
  17. 決定:アイテムのスペースは?]アクティビティから[終了:目的地でアンロードのサブフロー]アクティビティまでのコネクターを作成します。
  18. ここで作成したコネクターをクリックして選択します。[クイックプロパティ]の[名前]ボックスに「No」と入力します。
  19. 決定:その他のアイテムをアンロード?]アクティビティから[決定:アイテムのスペースは?]アクティビティまでのコネクターを作成します。
  20. ここで作成したコネクターをクリックして選択します。[クイックプロパティ]の[名前]ボックスに「Yes」と入力します。
  21. 決定:その他のアイテムをアンロード?]アクティビティから[終了:目的地でアンロードのサブフロー]アクティビティまでのコネクターを作成します。
  22. ここで作成したコネクターをクリックして選択します。[クイックプロパティ]の[名前]ボックスに「No」と入力します。

シミュレーションモデルを保存することをおすすめします。

ステップ5 主なアンロードのサブフローのロジックを編集する

このステップでは、アンロードのサブフローの主なアクティビティ(オレンジ色のアクティビティ)をコントロールするロジックを作成します。このアクティビティが機能する方法の概要を次に示します。

アクティビティ 説明
アンロードのサブフローを開始 すべてのサブフローは[開始]アクティビティで始まる必要があります。[サブフローを実行]アクティビティが子トークンをサブフローに送信すると、常にそれらがこのアクティビティに送信されます。このアクティビティにはデフォルト設定を使用します。
ラベルを割り当て:DestinationNumber 以前のチュートリアルでこのアクティビティに使用した既存の設定を変更します。トークンに割り当てられているラベルの名前を「DestinationNumber」に変更し、それに初期値「1」を割り当てます。後でこのラベルを使用して、[目的地]グループ内のいずれかのキューを[目的地]グループ(それらのインデックス)に表示される順序で参照します。
サブフローを実行:目的地でアンロード(1番目) このアクティビティは1つの子トークンを作成し、それを[目的地でアンロードのサブフロー]に送信します。また、[目的地]という名前の子トークンにラベルを作成します。前のアクティビティで作成した「DestinationNumber」ラベルを使用して、3Dモデルの[目的地]グループの最初のキューを参照できます。そのキューを最初の目的地として設定します。
決定:その他のアイテムをアンロード?(1つ目) [目的地でアンロードのサブフロー]が実行を終了すると、このアクティビティに移動します。このアクティビティは、GroupOfItems配列にアンロードするアイテムが残っているかどうかを確認することによって、アンロードする必要があるその他のアイテムがあるかどうかを確認します。残っているアイテムがある場合、トークンは次の下流のアクティビティにルーティングされます。すべてのアイテムがアンロードされている場合は、トークンを[アンロードのサブフローを終了]アクティビティに送信します。
ラベルを割り当て:DestinationNumber+1 他のアンロードするアイテムがある場合は、このアクティビティによって[DestinationNumber]ラベルが1つ増えます。このラベルは、[目的地]グループのどのキューが現在の目的地であるかを処理フローに指示することを思い出してください。オペレーターはこの目的地で(インデックス番号を使用し)アイテムをアンロードする必要があります。オペレーターは、[Queue1]を試したばかりの場合は、[Queue2]というように順にキューを試し、以降、同様に続きます。
決定:その他の目的地を試す? 前のアクティビティは[DestinationNumber]ラベルを1つ増やすので、このアクティビティで、このラベルがモデルで現在使用可能な目的地の数を超えて増えないようにする必要があります。この決定アクティビティは、[DestinationNumber]値の現在の値と、3Dモデルの[目的地]グループに現在あるキューの数とを比較します。目的地が[目的地]グループのメンバー数以下である場合は、オペレーターがアイテムのアンロードを試みることができる目的地がまだあることを意味します。もしそうなら、トークンは最初の[サブフローを実行]にループバックされます。[目的地でアンロード]アクティビティとアンロードのサブフローが次の目的地で再び実行されます。そうでなければ、トークンは[イベントを待つ:キューにスペースがある]アクティビティに移動します。
イベントを待つ:キューにスペースがある モデル内のすべてのキューが現在最大容量になっていると、トークンはこの[イベントを待つ]アクティビティに到達します。ここでトークンは、フローアイテムがいずれかのキューから出て、そのフローアイテムのスペースが空になるまで待ちます。キューのグループはリッスンされているので、[目的地]ラベルを更新し、イベントをトリガーした特定のキューへの参照が表示されるようにします。その後、トークンは2番目の[サブフローを実行]アクティビティに移動します。
サブフローを実行:目的地でアンロード(2番目) トークンがこのアクティビティに到達すると、いずれかのキューにフローアイテムを受け取るためのスペースができます。その後、前のアクティビティでイベントをトリガーした目的地で、[目的地でアンロードのサブフロー]を実行する必要があります。
決定:その他のアイテムをアンロード?(2つ目) [目的地でアンロードのサブフロー]が実行を終了すると、このアクティビティに移動します。このアクティビティは、GroupOfItems配列にアンロードするアイテムが残っているかどうかを確認することによって、アンロードする必要があるその他のアイテムがあるかどうかを確認します。残っているアイテムがある場合、トークンは[イベントを待つ]アクティビティにループバックされます。すべてのアイテムがアンロードされている場合は、トークンを[アンロードのサブフローを終了]アクティビティに送信します。
アンロードのサブフローを終了 すべてのサブフローは[終了]アクティビティで終了する必要があります。[サブフローを実行]アクティビティの親トークンは、そのすべての子トークンが[終了]アクティビティに到達するまで、そのアクティビティで待機します。このアクティビティにはデフォルト設定を使用します。

このロジックを作成するには:

  1. ラベルを割り当て:DestinationNumber]アクティビティをクリックして選択します。[名前]ボックスで、テキストを「DestinationNumber」に変更します。
  2. ]ボックスで、既存のテキストを削除し、「1.00」と入力します。
  3. サブフローを実行:目的地でアンロード]アクティビティをクリックして選択します。このアクティビティの横にある[感嘆符]ボタン をクリックして、サンプリングモードに入ります。
  4. 目的地でアンロードのサブフローを開始]アクティビティをクリックして、サンプリングします。
  5. 子にラベルを割り当て]グループの下の[クイックプロパティ]で、[追加]ボタン をクリックしてラベルを追加します。
  6. 名前]ボックスに、「Destination」と入力します。
  7. ]ボックスに「Group("Destinations")[token.DestinationNumber]」と入力します。
  8. 決定:その他のアイテムをアンロード?]アクティビティをクリックして選択します。[クイックプロパティ]で、[トークンを送信]ボックスの横にある矢印をクリックして、メニューを開きます。[条件付きで決定]を選択してプロパティウィンドウを開きます。
  9. 条件]ボックスで、現在のテキストを削除し、「token.GroupOfItems.length > 0」と入力します。
  10. 再度先を飛ばして、プロパティが一致するように、2回目の[決定:その他のアイテムをアンロード?]アクティビティで、これらの同じステップを繰り返します。
  11. ラベルを割り当て:DestinationaNumber+1]アクティビティをクリックして選択します。[クイックプロパティ]で、[追加]ボタン をクリックしてラベルを追加します。
  12. 名前]ボックスの横にある矢印をクリックしてメニューを開きます。[トークンラベル]をポイントし、次に[DestinationNumber]を選択します。
  13. ]ボックスの横にある矢印をクリックして、メニューを開きます。[増加量ラベル]を選択してプロパティウィンドウを開きます。デフォルト値の「1」を使用するので、ウィンドウの外側をクリックします。
  14. 決定:その他の目的地を試す?]アクティビティをクリックして選択します。[クイックプロパティ]で、[トークンを送信]ボックスの横にある矢印をクリックして、メニューを開きます。[条件付きで決定]を選択してプロパティウィンドウを開きます。
  15. 条件]ボックスで、現在のテキストを削除し、「token.DestinationNumber <= Group("Destinations").length」と入力します。
  16. イベントを待つ:キューにスペースがある]をクリックして選択します。[クイックプロパティ]で[オブジェクト]ボックスの横にある矢印をクリックして、メニューを開きます。[グループ]をポイントし、次に[目的地]を選択します。
  17. イベント]ボックスの横にある[サンプラー]ボタン をクリックして、サンプリングモードに入ります。
  18. 3Dモデルで、いずれかの[キュー]オブジェクトをクリックしてメニューを開きます。[終了時]を選択します。
  19. イベントオブジェクトの割り当て先]ボックスの横にある矢印をクリックしてメニューを開きます。[トークンラベル]をポイントして、[目的地]を選択します。
  20. サブフローを実行:目的地でアンロード]アクティビティをクリックして選択します。このアクティビティの横にある[感嘆符]ボタン をクリックして、サンプリングモードに入ります。
  21. 目的地でアンロードのサブフローを開始]アクティビティをクリックして、サンプリングします。

シミュレーションモデルを保存することをおすすめします。

ステップ6 目的地でアンロードのサブフローロジックを編集する

このステップでは、[目的地でアンロードのサブフロー]のアクティビティ(黄色のアクティビティ)をコントロールするロジックを作成します。このアクティビティが機能する方法の概要を次に示します。

アクティビティ 説明
目的地でアンロードのサブフローを開始 すべてのサブフローは[開始]アクティビティで始まる必要があります。[サブフローを実行]アクティビティが子トークンをサブフローに送信すると、常にそれらがこのアクティビティに送信されます。このアクティビティにはデフォルト設定を使用します。
目的地に移動 このアクティビティは、3Dモデル内のいずれかの目的地キューに移動するようにオペレーターに指示します。この子トークンを作成した[サブフローを実行]アクティビティで作成された[目的地]ラベルを使用して、どのキューが現在の目的地であるかを判断します。
決定:アイテムのスペースは? このアクティビティは、現在の目的地が最大容量に達したかどうかを判断します。最大容量に達していない場合は、トークンは[目的地でアイテムをアンロード]アクティビティに送信されます。キューがいっぱいの場合、トークンは[目的地でアンロードのサブフローを終了]アクティビティに送信されます。
目的地でアイテムをアンロード 各子トークンがこのアクティビティに到達すると、どのフローアイテムをアンロードするか、およびそれらをどの場所にロードするかをオペレーターに指示します。このタスクを実行すべきオペレーターを示す[オペレーター]ラベルを使用し、MainQueueからどのアイテムをロードするべきかをオペレーターに指示する各子トークンの[MyItem]ラベルを使用します。前のアクティビティで設定した[目的地]ラベルは、3Dモデルの[Queue1]でアイテムをアンロードするようにオペレーターに指示します。
決定:その他のアイテムをアンロード? オペレーターが1つのフローアイテムのアンロードを終了すると、このアクティビティに移動します。このアクティビティは、GroupOfItems配列にアンロードするアイテムが残っているかどうかを確認することによって、アンロードする必要があるその他のアイテムがあるかどうかを確認します。残っているアイテムがある場合、トークンは次の下流のアクティビティにルーティングされます。すべてのアイテムがアンロードされている場合は、トークンを[目的地でアンロードのサブフローを終了]アクティビティに送信します。
目的地でアンロードのサブフローを終了 すべてのサブフローは[終了]アクティビティで終了する必要があります。[サブフローを実行]アクティビティの親トークンは、そのすべての子トークンが[終了]アクティビティに到達するまで、そのアクティビティで待機します。このアクティビティにはデフォルト設定を使用します。

このロジックを作成するには:

  1. 目的地への移動]アクティビティをクリックして選択します。[クイックプロパティ]で、[実行者/タスクシーケンス]ボックスの横にある矢印をクリックして、メニューを開きます。[トークンラベル]をポイントし、次に[オペレーター]を選択します。
  2. 目的地]ボックスの横にある矢印をクリックして、メニューを開きます。[トークンラベル]をポイントして、[目的地]を選択します。
  3. 決定:アイテムのスペースは?]アクティビティをクリックして選択します。[クイックプロパティ]で、[トークンを送信]ボックスの横にある矢印をクリックし、[条件付きで決定]を選択してプロパティウィンドウを開きます。
  4. 条件]ボックスに「token.Destination.subnodes.length < getvarnum(token.Destination, "maxcontent")」と入力します。
  5. 目的地でアイテムをアンロード]アクティビティをクリックして選択します。[クイックプロパティ]の[アイテム]ボックスに「token.GroupOfItems.pop()」と入力します。
  6. 決定:その他のアイテムをアンロード?]アクティビティをクリックして選択します。[クイックプロパティ]で、[トークンを送信]ボックスの横にある矢印をクリックし、[条件付きで決定]を選択してプロパティウィンドウを開きます。
  7. 条件]ボックスに「token.GroupOfItems.length」と入力します。

シミュレーションモデルを保存することをおすすめします。

ステップ7 シミュレーションモデルを実行する

モデルをリセットして実行します。

ご覧のように、オペレーターは最初のキューでアイテムを降ろし始めます。最初のキューが2つのフローアイテムの最大容量に達すると、オペレーターは2番目のキューに移動します。2番目のキューが最大容量の「1」に達すると、オペレーターは3番目のキューに移動します。

モデルがこのように動作しない場合は、プロパティをチェックして、誤って重要なステップを飛ばしていないことを確認してください。一般的に、エラーが発生したときにどのアクティビティがトークンを持っているかを確認することで、どのアクティビティが問題を引き起こしているかを把握できます。

結論

これでチュートリアル3は終了です。このチュートリアルでは、かなり複雑な輸送ロジックを使ってモデルを作成しました。FlexScriptと[決定]アクティビティを使用したいくつかの条件付きロジックに関する少しの知識があれば、シミュレートする必要があるあらゆる種類のビジネスシステムの非常に堅牢なシミュレーションモデルを作成できることがお分かりいただけたことと思います。