タスク1.2 - リソースをリストのように機能させる
タスクの概要
ここまでに、モデルで2名のタスク実行者のためにベーシックな輸送タスクのシーケンスを構築しました。実際には、処理フローツールを使用せずにこのベーシック機能を作成できますが、処理フローツールを使用すると、カスタムモデルロジック(特にタスクシーケンス用)を簡単に作成できます。
このチュートリアルのタスクでは、オペレーターの通常の輸送タスクシーケンスを中断することのある処理フローロジックを追加します。100メートル以上移動するたびに、水飲み場で水を飲むようにオペレーターに送信するロジックを設計します。
このロジックを作成するには、休憩タスクシーケンス用として処理フローにセクションを追加します。また前のチュートリアルで、リソース共有アセットが3Dモデルで2名のオペレーターにリンクされていることを思い出してください。休憩タスクを作成するには、オペレーターが移動した距離を追跡するリソース共有アセットが必要になります。そのため、リソースがリストのように機能するようにリソースを変更する必要があります。リストでは、リスト上のエントリに関するデータを追跡し、更新できます。また特定の基準に一致するエントリをリストから取得するクエリを作成できます。
幸いにも、リソースには実際にリストと同じ機能を持つように設定できる内部リストがあります。このチュートリアルのタスクでは、リソースの内部リストを設定して、オペレーターがシミュレーションモデルで移動した合計距離と、最後の休憩後に移動した距離を追跡する方法を学習します。また、休憩タスクシーケンスが、最後の休憩後に100メートル以上移動したオペレーターをプルするようにクエリを設計します。
作業が完了すると、モデルは次の画像のようになります。
ステップ1 リソースで内部リストを使用する
これでベーシックな輸送タスクシーケンスが設定されたので、オペレーターを通常の輸送作業からプルし、水分を取るようにさせる一連のタスクを作成します。オペレーターが100メートル以上移動した後に水飲み場で水分を取ることをシミュレートします。
現時点で、リストとリソースの共有アセットに似たような機能があることに気づいているかもしれません。実際、リソースは単に特種なリストです。この処理フローで使用しているリソースは、利用可能なオペレーターの内部リストを実際に保持しています。[リソースを取得]アクティビティと[リソースをリリース]アクティビティでは、オペレーターをこのリストからプッシュまたはプルします。
このステップでは、後のステップで休憩機能を追加するために、この内部リストにいくつかのフィールドを追加する必要があります。次の2つのフィールドを追加します。
- lastDrinkTotalTravel - オペレーターに「lastDrinkTotalTravel」という名前のラベルを作成するフィールドを追加します。このラベルでは、オペレーターが最後の休憩を取った後に移動した距離を追跡します。処理フローでは、各オペレーターが休憩を取った後、このラベルを更新します。
- totalTravel - シミュレーションが開始されてからオペレーターが移動した距離の合計を追跡するフィールドも追加します。すべてのオペレーターの3Dオブジェクトでは、FlexSimで標準(デフォルト)の統計として移動した距離合計を追跡します。したがって、リソースのリストに、統計の現在値を取得するフィールドを追加します。
これらのフィールドをリソースの内部リストに追加するには:
- [リソース:オペレーター]共有アセットをクリックし、選択します。
- [プロパティ]で、[詳細]ボタンをクリックしてリソースのリストプロパティを開きます。
- [フィールド]タブで[追加]ボタン をクリックして、メニューを開きます。[ラベル]を選択し、ラベルフィールドをリストに追加します。
- ラベルフィールドの名前を「lastDrinkTotalTravel」に変更します。
- [追加]ボタン をクリックして、メニューを開きます。[TaskExecuter]をポイントし、次に[totalTravel]を選択します。
- デフォルト設定を使用し、設定が次の画像と同様であることを確認します。
シミュレーションモデルを保存することをおすすめします。
ステップ2 水分補給休憩タスクシーケンスを追加する
このステップでは、処理フローにさらにアクティビティを追加します。これらのアクティビティは、休憩機能をコントロールします。作業が終了すると、処理フローは次の画像のようになります。
現時点では、これらのアクティビティの追加と処理フローへの接続のみを行います。後のステップで、プロパティを編集して機能を追加します。
これらのアクティビティを追加して接続するには:
- 処理フローが開いていてアクティブであることを確認してください。
- ライブラリの[表示]グループで、新しい[コンテナ]形状を新しい処理フローに追加します。
- わかりやすくするために、[処理]形状の名前を「休憩」に変更してください。
- [休憩]形状に[スケジュールソース]を追加します。
- [休憩]形状で、次のアクティビティを追加してスタックブロックを作成します。
- [リソースを取得]アクティビティ([共有アセット]の下)
- [タスクシーケンスを作成]([タスクシーケンス]の下)
- [移動]アクティビティ([タスクシーケンス]の下)
- [遅延]アクティビティ([タスクシーケンス]の下)
- [ラベルを割り当て]アクティビティ([ベーシック]の下)
- [タスクシーケンスを終了]([タスクシーケンス]の下)
- [リソースをリリース]アクティビティ([共有アセット]の下)
- [スケジュールソース]から[リソースを取得]までのコネクターを作成します(アクティビティの下部中央にマウスをポイントしてコネクター アイコンに変更するまでそのままにします。他のアクティビティにスナップするまで、コネクターをクリックしてドラッグします)。
- [リソースをリリース]アクティビティの最後から[リソースを取得]アクティビティにループするコネクターを作成します。
- 分かりやすくするために、アクティビティの名前を次のように変更します。
アクティビティ | 新しい名前 |
---|---|
ソース | ソース:シミュレーションを開始 |
取得 | 取得:オペレーターに水分補給をさせる |
TSを作成 | タスクシーケンスを作成 |
移動 | 水飲み場に移動する |
遅延 | 遅延:水分補給 |
ラベルを割り当て | ラベルを割り当て:最終水分補給後の総移動距離 |
TSを終了 | タスクシーケンスを終了 |
リリース | オペレーターをリリース |
シミュレーションモデルを保存することをおすすめします。
ステップ3 アクティビティのプロパティを編集する
このステップでは、処理フローの[休憩]セクションでアクティビティのプロパティを編集して、単純な輸送タスクシーケンスを作成します。このセクションの各アクティビティが機能する方法の概要を次に示します。
アクティビティ | 説明 |
---|---|
ソース:シミュレーションを開始 | [スケジュールソース]アクティビティでは、シミュレーションの開始直後にトークンを1つ作成します。その後、トークンを[取得:オペレーターに水分補給をさせる]アクティビティに送ります。このトークンを作成した後は、追加のトークンは作成されません。トークンは、シミュレーションが終了するまで他のアクティビティをループし続けます。 |
取得:オペレーターに水分補給をさせる | このアクティビティでは、リソースの内部リストに、最後の休憩後100m以上移動したオペレーターがいるかどうか確認します。リストのオペレーターがその要件に一致すると、そのオペレーターを取得します。オペレーターがその条件に一致しない場合は、リストでバックオーダーが作成されます。休憩を取るように割り当てられたオペレーターを追跡するために、トークンに「thirstyOperator」というラベルを作成します。 |
タスクシーケンスを作成 | このアクティビティでは、割り当てられたオペレーターが実行するタスクのシーケンスとして、一連のタスクを設定します。 |
水飲み場に移動する | オペレーターを水飲み場に送ります。 |
遅延:水分補給 | このタスクでは、オペレーターが水飲み場で飲み物を飲むまでの時間をシミュレートします。 |
ラベルを割り当て:lastDrinkTotalTravel | このアクティビティでは、オペレーターが最後に水飲み場で水を飲んだ時刻が記録されます。 |
タスクシーケンスを終了 | このアクティビティは、タスクシーケンスの終了処理を指示します。 |
オペレーターをリリース | オペレーターをリリースして、別の輸送タスクシーケンスで作業できるようにします。 |
これらのアクティビティのプロパティを編集するには:
- [スケジュールソース]アクティビティをクリックして選択します。このアクティビティではデフォルトのプロパティを使用するため、次の画像と設定が一致することを確認してください。
- [取得:オペレーターに水分を補給させる]アクティビティの横にある[感嘆符]ボタン をクリックして、サンプリングモードに入ります。
- [リソース:オペレーター](処理フロー内)をクリックしてサンプリングします。リソースが現在リンクされていることを示す青い線が表示されます。
- [取得:オペレーターに水分を補給させる]アクティビティの[クイックプロパティ]で、[ラベルに割り当てる]ボックスを「
token.thirstyOperator
」に変更します。 - [クエリ]ボックスで、現在のテキストを削除し、「
WHERE totalTravel - lastDrinkTotalTravel > 100
」と入力します。 - [タスクシーケンスを作成]アクティビティをクリックして選択します。[プロパティ]で、[実行者/タスクシーケンス]ボックスの横にある矢印をクリックして、メニューを開きます。[トークンラベル]をポイントし、[thirstyOperator]を選択します。これにより、作成中のタスクシーケンスは、先ほど取得したオペレーターに割り当てられます。他の設定はデフォルト値のままにします。このアクティビティにより、「taskSequence」という新しいラベルがトークンに作成されることが分かります。このシーケンスのタスクはすべて、このラベルを通じてシーケンスに割り当てられます。
- [水飲み場に移動する]アクティビティの[プロパティ]で、[実行者/タスクシーケンス]のデフォルトが「token.taskSequence」であることを確認します。
- [目的地]ボックスの横にある[サンプラー]ボタン をクリックしてサンプリングモードに入ります。
- 3Dモデルの[水飲み場]形状をクリックしてメニューを開きます。メニューから[水飲み場]を選択します。
- [遅延:水分補給]アクティビティについても、このステップを繰り返します。次に、[遅延時間]を「
30.00
」に変更します。 - [ラベルを割り当て:lastDrinkTotalTravel]アクティビティの[プロパティ]で[ラベルの割り当て先]ボックスの横にある矢印をクリックして、メニューを開きます。[トークンラベル]をポイントし、[thirstyOperator]を選択します。
- [追加]ボタン をクリックして、新しいラベルを追加します。
- [名前]ボックスに、「
lastDrinkTotalTravel
」と入力します。 - [値]ボックスに「
getvarnum(token.thirstyOperator, "totaltraveldist")
」と入力します。 - [タスクシーケンスを終了]はデフォルト設定のままにします。[タスクシーケンス]ボックスが「token.taskSequence」となっていることを確認してください。これは、タスクシーケンスの終了処理の実行を指示します。
- [オペレーターをリリース]アクティビティの[プロパティ]で、[割り当て先のリソース]ボックスの横にある矢印をクリックして、メニューを開きます。[トークンラベル]をポイントし、[thirstyOperator]を選択します。
シミュレーションモデルを保存することをおすすめします。
ステップ4 オペレーターにラベルを追加する
このステップでは、lastDrinkTotalTravelラベルをオペレーターに追加し、その初期値を0に設定します。ロジックを機能させるには、これを行う必要があります。初期値を0に設定しない限り、オペレーターが最後に飲み物を飲んでからの経過時間を計算する場合に、このラベルはNULL値を返します。そのようなことが起こった場合、[取得:オペレーターに水分を補給させる]アクティビティでは、リソースの内部リストからオペレーターを正常に取得できません。
これらのラベルを追加するには:
- モデルをリセットします。
- [オペレーター]をクリックして、右側でそのプロパティを表示します。
- [ラベル]セクションで、[追加]ボタンをクリックして、メニューを開きます。[数値ラベルを追加]を選択します。
- [labelName]ボックスをダブルクリックし、現在のテキストを削除して「lastDrinkTotalTravel」と入力します。
- ラベルの初期値が「
0
」に設定されていることを確認します。 - [自動的にラベルをリセット]チェックボックスをオンにします。
- 2番目のオペレーターに対してこの処理を繰り返します。
モデルを保存することをおすすめします。
ステップ5 シミュレーションモデルを実行する
このステップでは、シミュレーションモデルを実行して、シミュレーションモデルが正しく機能していることを確認します。モデルを実行する前に:
- 処理フローで[リソース:オペレーター]共有アセットをクリックし、選択します。[プロパティ]で、[エントリを表示]ボタンをクリックして、リソースの内部リストを表示します。
- シミュレーションコントロールパネルの[リセット]と[実行]ボタンをクリックします。
次のモデルが速度10.00で実行されていることに注意してください。
モデルが実行される際、オペレーターは100メートル以上移動すると、水飲み場に飲み物を取りに行くことに注意します。最初の飲み物の後、リソースのリストでは、最後の飲み物からの移動距離の追跡を開始します。
結論
これで、リソースとリストの両方でさまざまな用途が確認できました。次のチュートリアルタスクでは、最後の共有アセットタイプ「ゾーン」を使用する方法を学習します。「チュートリアルタスク1.3 - ゾーンを追加してデータを収集する」に進みます。