タスクシーケンスロジックについての主要な概念

タスクシーケンスロジックシステムの概要

3Dオブジェクトを使用する」に関する章で説明したように、タスク実行者はタスクシーケンスを実行する3Dオブジェクトです。タスク実行者は、モデル全体を移動したり、フローアイテムをロードまたはアンロードしたり、固定リソースステーションで利用されたりします。

シミュレーションモデルで実行するタスクシーケンスを割り当てることができるため、タスク実行者と呼ばれています。タスクシーケンスロジックは、タスク実行者とタスクシーケンスが関係するあらゆる種類のロジックです。FlexSimでは、タスクシーケンスロジックを定義するためのさまざまなオプションが用意されているため、個々のシミュレーション問題に細かく対応することができます。

次のように、タスクシーケンスロジックを定義するための主なファセットが4つあります。

タスクシーケンス生成 タスクシーケンスをどのように定義するか?

ジョブディスパッチング 誰がまたは何がどんなジョブを実行するか?

アイテムフローとルーティング アイテムをどこに移動する必要があるか?

輸送または移動 タスク実行者をどのように移動させるか?

これらの問題のそれぞれをシミュレーションのニーズに合わせて解決できます。シミュレーションモデルにはこれらの問題のうちの複数に対する非常にシンプルな答えがあるかもしれません。その場合、ロジックの設定はシンプルかつ簡単でしょう。一方で、多くのシミュレーションモデルにこれらの問題の1つ以上に対するカスタマイズされたソリューションが必要です。FlexSimの機能は、このカスタマイズの定義に究極の柔軟性を提供します。このトピックでは、これらのさまざまな問題について詳しく説明し、それらを解決するために使用できるツールとプロセスについて説明します。

タスクシーケンス生成

タスクシーケンス生成 タスクシーケンスをどのように定義するか?

タスクシーケンスロジックの設計にあたり対処する必要がある最初の問題の1つは、タスク実行者が作業するタスクシーケンスをどのように定義するかという明白な問題です。タスクシーケンスは、単一の「ジョブ」または作業単位の一部としてまとめて実行する必要のあるタスクに固有のシーケンスです。タスクは、タスクシーケンスの一部として実行される単一の命令またはアクションです。個別のタスクが関連付けられたタスクシーケンスの例を以下に示します。

  1. キューに移動
  2. キューからフローアイテムをロード
  3. プロセッサに移動
  4. アイテムをプロセッサにアンロード

タスクシーケンスの詳細については、「タスクシーケンスの概念」を参照してください。

3Dオブジェクトベースのタスクシーケンス生成

輸送タスクは最も一般的なタスクである傾向があります。そのため、3Dオブジェクトの標準ロジックには、輸送タスクを設定するためのシンプルで簡単な方法がいくつかあります。たとえば、ポート接続を設定した後に、固定リソースの[出力]ペインの[輸送を使用]ボタンをクリックして設定するだけでよい場合があります。3Dオブジェクトは、自動的に、タスクシーケンスを作成して、そのセンターポートに接続されたタスク実行者またはディスパッチャーにディスパッチします。

プロセッサにも、自動タスクシーケンス生成メカニズムが組み込まれています。プロセッサ/セパレータ/コンバイナの[プロセッサ]ペインで[設定時間]の[オペレーターを使用]チェックボックスまたは[処理時間]の[オペレーターを使用]チェックボックスをオンにすることができます。これにより、タスク実行者にアイテムの処理中にプロセッサに移動して「利用する」ように指示する自動タスクシーケンスが生成されます。

処理フローベースのタスクシーケンス生成

処理フローを使用して、タスクシーケンスを生成することもできます。主な違いは、3Dオブジェクトロジックを使用する場合は、タスクシーケンスが自動的に定義されるのに対して、処理フローでは、実行するタスクの順序を完全に制御できることです。たとえば、単純な輸送タスクシーケンスと同等の処理フローは、下の図のようになります。

処理フローベースのタスクシーケンス生成の例

処理フローツールには、よく使用されるタスクシーケンスアクティビティのライブラリが含まれており、それらを組み合わせて任意の数のカスタムタスクシーケンスを作成できます。

処理フローツールに関して留意すべきことの1つは、通常、ほとんどのタスクは、シンプルな移動、遅延、取得アクティビティで表せるということです。たとえば、マシンの変更中にマシンをクリーニングするオペレーターをシミュレーションするとします。これを一連の移動および遅延としてシミュレートすることができます。

  1. クリーニングサプライストレージに移動 - オペレーターは、クリーニングサプライが保管されている場所に移動します
  2. サプライを取得 - オペレーターがサプライを取得します
  3. マシンに移動 - オペレーターはその後マシンへ移動します
  4. クリーニングによる遅延 - オペレーターはマシンを遅延させて、マシンのクリーニングと変更の準備にかかる時間をシミュレーションします
  5. クリーニングサプライストレージに戻る - オペレーターは、クリーニングサプライが保管されている場所に戻ります
  6. サプライをリリース - オペレーターは、サプライクローゼットにサプライを戻します。

下の図は、シミュレーション実行中にこのタスクシーケンスロジックがどのように機能するかを示しています。

処理フローライブラリで利用できるタスクアクティビティは、ロード、アンロード、移動、遅延など、シミュレーションモデリングで使用される一般的なタスクのほとんどを網羅しています。ただし、ライブラリの[カスタムタスク]アクティビティを使用して利用できる、事前にプログラムされたタスクがいくつかあります。

これらのカスタムタスクを使用する場合は、「タスクシーケンスクイックリファレンス」を参照してください。[クイックリファレンス]では、各カスタムタスクタイプのプロパティを入力する方法に関する詳細な情報を提供しています。また、各タスクの詳細なガイドへのリンクもあります。

ジョブディスパッチング

ジョブディスパッチング 誰がまたは何がどんなジョブを実行するか?

タスクシーケンスロジックを設計する場合は、ジョブをどのようにディスパッチするかについても検討する必要があります。以下はいくつかの関連する質問です。

  • ジョブをどのようにタスク実行者に割り当てるか?
  • 複数のタスク実行者がいる場合、どのタスク実行者がジョブを実行するか?
  • ジョブの完了に十分なタスク実行者がいない場合はどうなるか?
  • ジョブに優先度を付けるか?より重要なジョブに他のジョブのプリエンプト(割り込み)を許可するか?
  • 複数のタスク実行者が協力して1つのジョブを遂行する必要がある場合(協調ジョブとも言う)はどうなるか?

コアディスパッチング決定

FlexSimのディスパッチング問題は、大まかに言って、スケジューリングの領域でよく知られている一連の問題解決テクニックに似ています。シミュレーションの観点では、ディスパッチング問題はシミュレーションで下す必要のある2つの決定に要約できます。それらを以下に示します。

ディスパッチング決定
リソース選択新しいジョブ(タスクシーケンスなど)を実行する必要がある場合に、そのジョブを実行する必要のある使用可能なリソース(タスク実行者など)をシミュレーションでどのように選択するか。
ジョブ選択リソース(タスク実行者など)が作業に使用可能になったときに、次に実行するジョブ(タスクシーケンスなど)をどのように選択するか。

この2つの核心的な質問は、非タスク実行者ベースのシナリオ(固定リソースが送信先ロジックやプルロジックの一部として同様の決定を行う場合など)にも適用されますが、このトピックでは、タスク実行者に関連するディスパッチング問題だけを取り上げます。ここでは、さまざまなオプションを示し、それぞれがこの2つの決定をどのように解決するかについて説明します。

ジョブディスパッチング決定では、タスク実行者がどのようにタスクシーケンスを処理するかを理解することが重要です。この仕組みの詳細な説明については、「タスク実行プログラムがタスクを処理する方法」を参照してください。

直接タスクシーケンスディスパッチング

タスク実行者が1人だけのシミュレーションモデルであれば、通常は設定が非常に簡単です。タスク実行者へのセンターポート接続を作成して、上流の固定リソースに対して[輸送を使用]オプションを使用することができます。

下の表は、このシナリオで主要な2つのディスパッチング決定がどのように下されるかを示します。

単一リソースディスパッチング
リソース選択ジョブを実行可能なタスク実行者が1人しかいないため、すべてのタスクシーケンス(ジョブ)がそのタスク実行者にディスパッチされます。
ジョブ選択タスク実行者が他のタスクシーケンスを実行できるようになると、キュー方法を使用して、そのタスクシーケンスキューから次に実行するタスクシーケンスを選択します。

複数のタスク実行者の使用もそれほど難しくありません。タスク実行者をディスパッチャーオブジェクトに接続してから、[輸送を使用]オプションを通してタスクシーケンスをそのディスパッチャーに送信できます。

.

ディスパッチャーを使用したマルチリソースディスパッチング
リソース選択タスクシーケンスは、ディスパッチャーのタスクシーケンスキューにディスパッチされます。その後で、タスク実行者がディスパッチャーのパス先ロジックを介して選択されます。
ジョブ選択ディスパッチャーの接続先のタスク実行者のいずれかが別のタスクシーケンスを実行できるようになると、自動的にディスパッチャーにその利用可能性が通知されます。その後で、ディスパッチャーが、そのキュー方法を使用して、その(ディスパッチャーの)タスクシーケンスキューから次に実行するタスクシーケンスを選択します。

これらのシナリオは、定義した処理フローに比較的簡単に統合することもできます。処理フローで直接定義したい追加のジョブがある場合は、タスクシーケンスを作成アクティビティを使用して、タスクシーケンスを作成し、それらをディスパッチャーまたはタスク実行者のタスクシーケンスキューにディスパッチできます。

これらのシナリオを使用するメリットは、設定が非常に簡単なことです。ほとんどが3Dオブジェクトプロパティを通して直接実行されます。考えられるデメリットは、視覚的確認が難しいことです。ジョブキューイングはオブジェクト内部で行われるため、進捗状況を確認することができません(ただし、処理フローでタスクシーケンスを定義した場合はタスクシーケンスを定義しているトークンを表示できるため、視覚的確認が容易です)。加えて、ジョブ選択とリソース選択のロジックの複雑なカスタマイズが困難な場合があります。これは、キュー方法パス先ピックオプションの使用に限定されるためです。

直接タスクシーケンスディスパッチング
利点欠点
  • 簡単な設定
  • 3Dオブジェクトプロパティで直接設定
  • 処理フローと簡単に統合
  • ジョブキューの視覚的確認が難しい
  • 複雑な選択カスタマイズが困難

処理フローリソースを使用したディスパッチング

もう1つのオプションは、処理フローリソースを使用して、ディスパッチング問題を解決することです。ここでは、処理フローでリソース共有アセットを定義します。リソースは、タスク実行者のグループに関連付けることができます。その後で、実行するジョブがあるときに、リソースを取得アクティビティを使用して、使用するタスク実行者を選択します。さらに、実行するタスク実行者のタスクシーケンスを定義します。最後に、リソースをリリースアクティビティを使用して、タスク実行者をプールに戻します。

処理フローリソースを使用したディスパッチング
リソース選択使用可能なリソース(タスク実行者)のセットが、処理フローリソースによって管理されます。選択は、リソースを取得アクティビティの[Query / Object / Array]フィールドを使用して行われます。
ジョブ選択ジョブ選択は、他の複数の処理フロートークンがその取得を待機中に、タスク実行者がリソースに戻されたときに、実行されます。デフォルトはFIFOです。ただし、[詳細]ボタンをクリックして、内部のリストの[バックオーダーキューの方法]を定義することによってカスタマイズすることができます。リソースが取得するタスク実行者のゲートキーパーになるため、通常は、個々のタスク実行者のタスクシーケンスキューイングロジックは関係ありません。

このメカニズムを使用するメリットは、FlexSimのSQLエンジンから提供される強力な選択と優先度付けのメカニズムを使用できることです。また、ジョブのキューイングは、処理フローのリソースを取得アクティビティに積み重ねられたトークンによって視覚的に表現されます。デメリットは、モデル内に同じタスク実行者のセットに対して直接ディスパッチングを使用する他のロジックが存在する場合に、そのロジックが直接タスク実行者/ディスパッチャータスクシーケンスキューイングロジックにディスパッチするため、リソースの選択ロジックから見えなくなることです。また、リソースの強力なSQL選択メカニズムを使用しているときは、実際には、目に見えないリストを使用しているだけなので、リストを直接ディスパッチングに使用した方が有益な可能性があります。

処理フローリソースを使用したディスパッチング
利点欠点
  • SQLプルクエリを使用した強力な選択
  • ジョブキューイングが処理フローで確認できない
  • 直接ディスパッチングがリソースから見えない
  • この設定では、リソースが実際には目に見えないリストです。

リストを使用したディスパッチング

FlexSimのディスパッチング用の最も強力なオプションがリストを使用することです。リストを使用すれば、リソース選択とジョブ選択の実行方法をカスタマイズできるため、非常に高い柔軟性と堅牢性が確保されます。リストでは、選択と優先度付けにFlexSimのSQLパーサーが使用されます。リストには、処理フローからだけでなく、3Dオブジェクトプロパティを通して直接アクセスすることもできるため、ロジックのありとあらゆるソースを統合できます。詳細については、「リストについての主要な概念」を参照してください。

リストの使用は非常に強力ですが、リストの仕組みを十分理解しておく必要があります。リストの機能を最大限活用するためには、バックオーダー、プルクエリ、プラー、値、フィールドなどの概念が必要です。したがって、直接ディスパッチングで既知の問題に十分対応できるのであれば、是非、そのソリューションを使用してください。それでもなお、リストは直接ディスパッチングの非常に強力な代替手段を提供します。

リストで何が起きているのか?

ディスパッチングでは、2つの方法のどちらかでリストを位置付けることになります。リストは、リソース(タスク実行者や処理フロートークンなど)のリストを表すことも、ジョブ(タスクシーケンス、処理フロートークン、キュー内のアイテムなど)のリストを表すこともあります。

リソースのリスト

リストがリソースのリストの場合は、リソースがリストにプッシュされ、ジョブがリストからそれらのリソースをプルします。この位置付けは、リソース選択が一次選択優先度の場合に使用されます。ジョブは、リソースをリクエストするときに、プルクエリを使用して、選択するリソースの制約と優先度を定義できます。リストからプルしているときに、ジョブが適切なリソースを見つけられなかった場合は、そのジョブがリストのバックオーダーリストに配置されます。リソースが使用可能になって、リストにプッシュバックされると、ジョブバックオーダーのいずれかを履行します。こうして、ジョブ選択は、主に、リストのバックオーダーキューの方法を使用して行われます。

リソースのリストを使用したディスパッチング
リソース選択使用可能なリソース(タスク実行者)のセットが、リストにそれらのリソースをプッシュすることによって管理されます。リソース選択は、プルクエリによって選択要件と優先度付けが定義されるリストからジョブがプルしたときに実行されます。
ジョブ選択ジョブ選択は、リソースがリストにプッシュバックされたときに実行されます。バックオーダーが存在する場合は、それらのバックオーダーがバックオーダーキューの方法に基づいて履行されます。リストが取得するリソースのゲートキーパーになるため、通常は、個々のタスク実行者のタスクシーケンスキューイングロジックは関係ありません。

このオプションを実装するには、タスク実行者のリソース利用可能時イベントを使用して、タスク実行者をリストにプッシュすることができます。加えて、固定リソースの[輸送を使用]フィールドを使用して、リストからプルすることができます。または、処理フローリストを使用して、処理フロー内のすべてのリストプッシングとリストプリングを管理できます。

ジョブのリスト

リストがジョブのリストの場合は、ジョブがリストにプッシュされ、リソースがリストからそれらのジョブをプルします。この位置付けは、ジョブ選択が一次選択優先度の場合に使用されます。リソースは、ジョブをリクエストするときに、プルクエリを使用して、選択するジョブの制約と優先度を定義できます。リストからプルしているときに、リソースが適切なジョブを見つけられなかった場合は、そのリソースがリストのバックオーダーキューに配置されます。新しいジョブが到着して、リストにプッシュされると、リソースバックオーダーのいずれかを履行します。こうして、リソース選択は、主に、リストのバックオーダーキューの方法を使用して行われます。

ジョブのリストを使用したディスパッチング
リソース選択リソース選択は、ジョブが到着して、リストにプッシュされたときに実行されます。リストのバックオーダーで待機しているリソースが存在する場合は、それらのバックオーダーがバックオーダーキューの方法に基づいて履行されます。
ジョブ選択アクティブなジョブのセットは、それらのジョブをリストにプッシュすることによって管理されます。ジョブ選択は、プルクエリによって選択要件と優先度付けが定義されるリストからリソースがプルしたときに実行されます。リストが取得するリソースのゲートキーパーになるため、通常は、個々のタスク実行者のタスクシーケンスキューイングロジックは関係ありません。

このオプションを実装するには、タスク実行者のリソース利用可能時イベントを使用して、ジョブのリストからプルすることができます。加えて、固定リソースの[輸送を使用]フィールドを使用して、ジョブをリストにプッシュすることができます。または、処理フローリストを使用して、処理フロー内のすべてのリストプッシングとリストプリングを管理できます。このシナリオの例については、「タスクロジックでリストを使用する」を参照してください。

結論として、リストの使用は、FlexSimでディスパッチングを実行するための最も強力なオプションです。

リストを使用したディスパッチング
利点欠点
  • 最も有益なディスパッチングオプション
  • SQLプルクエリを使用した強力な選択
  • ジョブ/リソースキューイングがリストに表示される
  • 3Dオブジェクトプロパティで定義されたタスクシーケンスロジックと処理フローロジックを統合できる
  • リストの仕組みを理解する作業が必要

アイテムフローとルーティング

アイテムフローとルーティング アイテムをどこに移動する必要があるか?

タスク実行者がある固定リソースから別の固定リソースへのアイテムの輸送に関与している場合、アイテムフローとルーティングの問題はタスクシーケンスロジックに関連します。アイテムルーティングのロジックは、タスク実行者自体のロジックではなく、固定リソースを介して処理されることに注意が必要です。つまり、あるオブジェクトから別のオブジェクトへのアイテムフローを決定するロジックは、主に固定リソース上のロジック、または固定リソース上のイベントをリッスンしている処理フローを介して決定されます。

シンプルなアイテムルーティングの例

最もシンプルな種類のアイテムルーティングは、1つの固定リソースがフローアイテムを隣接する固定リソースに直接渡す場合です。ポート接続はこのロジックをとても簡単に処理できます。ポートは、それほど多くの困難を伴わずに一対多のアイテムルーティングを処理することもできます。

複雑なアイテムルーティングの例

多対多アイテムルーティングシステムは、設計がもう少し複雑になる可能性があります。複雑なシステムの一例として、上流オブジェクトが複数の下流オブジェクトにアイテムを送るための特別な基準や条件付きロジックが必要なものがあります。

シミュレーションモデルのニーズに応じて、FlexSimには、リスト、コンベヤ、処理フローなど、固定リソースから別のリソースへのアイテムのルーティングに使用できるさまざまなシステムがあります。これらの異なるシステムを使用してアイテムルーティングロジックを構築する方法の詳細については、「3Dオブジェクトフローを接続する」に関する章を読むことをお勧めします。

輸送または移動ルーティング

輸送または移動 タスク実行者をどのように移動させるか?

タスク実行者がアイテムを輸送したり、長距離を移動したりする必要がある場合は、あるポイントから別のポイントに移動するためにどのパスを使用するかタスク実行者に指示するロジックを作成する必要がある場合があります。

シンプルな移動ルーティングの例

デフォルトでは、タスク実行者は、そのパスに他のオブジェクトがある場合でも、2つの場所の間の最短パスを移動します。タスク実行者がオブジェクト間を短い距離で移動するだけで良い場合は、デフォルトの移動メカニズムがシステムのすべてのニーズに対応する可能性があります。

複雑な移動ルーティングの例

タスク実行者が単純な直線ではない経路を移動する必要がある場合は、タスク実行者がより正確なパスをたどるのを助けるためにFlexSimの移動システムのいずれかを使用することをお勧めします。もっとも、これらの異なる移動システムのそれぞれは同じ基本原則に基づいて運用されています。1つの移動システムの使い方を学んでしまえば、同じ基本原則の多くが適用されるので、他のシステムの使い方を学ぶのはそれほど難しくありません。各種の移動システムのさまざまな利点と欠点の詳細な説明については、「移動に関する主要な概念」を参照してください。

FlexSimには3つの異なる移動システムがあります。1つは移動ネットワークシステムです。

もう1つはA*ナビゲーションシステムです。

そして最後のシステムは、無人搬送車(AGV)ネットワーク用です。

チュートリアルと詳細な情報

タスクの詳細については、以下の関連チュートリアルを実行して、この章で説明している概念を実際に体験することをお勧めします。

タスク実行者の仕組みに関する詳細な説明については、「参照 - タスク実行者の概念」も参照してください。

この章の残りの部分では、タスク一般と特定の種類のタスク実行者に関するトピックについて説明します。