タスク実行プログラムがタスクを処理する方法
タスク実行者がタスクを処理する方法の概要
このトピックでは、タスク実行者がタスクを受け取ったときにエンジンレベルで何が起こるかを説明します。シミュレーションモデルで複雑なタスクロジックを使用している場合は、FlexSimが背後でタスクロジックを処理する方法を理解するために、このトピックの概念を理解する必要があります。この知識は、潜在的なタスクロジックの問題を理解し、解決するのに役立ちます。特に、タスクディスパッチロジックとそれに関連する問題(タスクの優先度やプリエンプトなど)に関連します。
主な用語
このマニュアルやその他のFlexSimリソースで、タスクとタスクシーケンスという用語が同じ意味で使用されていることがあります。より複雑なタスクロジックを設計するのであれば、これら2つの用語の違いを理解しておくことをおすすめします。
タスクは、タスク実行者によって実行される単一の指示またはアクションです。タスクシーケンスは、1つ以上のタスクの集まりです。通常、タスク実行者は最初から最後まで、タスクシーケンス全体の中のすべてのタスクを処理します。唯一の例外は、タスク実行者が別のタスクシーケンスを処理するためにプリエンプトされる場合です。プリエンプトタスクシーケンスは、タスク実行者が割り込まれたタスクシーケンスで作業を再開しようとしたときに起こることを決定します。詳細については、「タスクの優先度とプリエンプトについて」を参照してください。
技術的には、タスク実行者はタスクシーケンスに対してのみ動作します。次の画像は、タスク実行者のツリービューで4つのタスクを含むアクティブなタスクシーケンスがどのように表示されるかについての例を示しています。
処理フローを使用してタスクをタスク実行者に割り当てる方法では、予期しない方法でタスクが中断される可能性があるため、タスクとタスクシーケンスの違いに注意する必要があります。詳細については、「処理フロータスクはタスクシーケンスを作成するか?」を参照してください。
タスク実行プログラムがタスクを処理する方法
タスク実行者は2つのものを追跡します。
- アクティブなタスクシーケンス - タスク実行者が現在作業しているタスクシーケンス。
- タスクシーケンスキュー - タスク実行者が割り当てられているタスクシーケンスのキュー。
シミュレーション実行中に、タスク実行者がタスクシーケンスを受け取ると:
- 新しいタスクシーケンスが、タスク実行者のタスクシーケンスキューに追加されます。
- タスク実行者が現在アクティブなタスクシーケンスを持っていない場合、キューからタスクシーケンスを選択します。通常、タスク実行者は受け取った順序でタスクシーケンスを完了します。つまり、FIFOロジック(先入れ先出し)を使用してタスクを実行します。ただし、優先度の異なるタスクシーケンスを使用すると、タスク実行者は代わりに優先度の順序に従ってタスクシーケンスを完了します。
- 選択したタスクシーケンスがアクティブなタスクシーケンスになります。
- タスク実行者は、タスクシーケンスに追加された順序でタスクシーケンス内のタスクを完了します。
- アクティブなタスクシーケンスの完了後、タスク実行者はキューから別のタスクシーケンスを選択し、プロセスはそれ自体を繰り返します。
タスク実行者イベントとトリガー
タスク実行者には、タスクの作業中に実行する特定の一連のイベントとトリガーがあります(イベントとトリガーの情報については、「イベントについての主要な概念」を参照してください)。重要なイベントのいくつかは次のとおりです。
トリガー | 説明 |
---|---|
タスク開始時 | タスク実行者がタスクの処理を開始したときに起動。 |
タスク終了時 | タスク実行者がタスクの処理を終了したときに起動。タスクシーケンスキューに他のタスクシーケンスがある場合でも起動されます。実際に、次に実行するタスクシーケンスを決定するために使用できます。 |
リソース利用可能時 | タスク実行者がタスクを完了したときに起動。 |
ロード時 | タスク実行者がロードタスクの一部としてアイテムをロードしたときに起動。 |
アンロード時 | タスク実行者がアンロードタスクの一部としてアイテムをアンロードしたときに起動。 |
これらのトリガーのいずれかが起動したときに開始するように、カスタムアニメーションまたは処理フローアクティビティを設定できる場合があります。また、トリガーを使用して、タスク実行者が[リソース利用可能時]トリガーの起動時にグローバルリストからタスクシーケンスをプルするような作業検索システムを設計することもできます。利用可能なイベントとタスク実行者のためのトリガーのより詳細な説明については、「タスク実行者の概念 - イベント」を参照してください。
処理フロータスクはタスクシーケンスを作成するか?
処理フローは、完全なタスクセットを含む完全なタスクシーケンスを作成することも、タスクを1度に1つずつタスク実行者に割り当てることもできます。予想していなかった状況によりタスク実行の途中でタスク実行者が割り込まれる可能性があるので、使用する方法は重要です。
完全なタスクシーケンスの作成と送付
次の画像は、処理フローがグローバルタスクリストへの送付前に完全なタスクシーケンスを構築する処理フローの例を示しています。
この処理フローのタスクは、特定のタスク実行者に割り当てない[タスクシーケンスを作成]アクティビティで始まります。次に、新しく作成されたタスクシーケンス内にタスクが配置されます。タスクが追加された後、タスクシーケンスはグローバルタスクリストにプッシュされます。オペレーターが空いて新しいタスクに取り組むことができるようになると、その[リソース利用可能時]トリガーが起動します。このシステムでは、オペレーターは、[リソース利用可能時]トリガーが起動したときにグローバルタスクリストからタスクシーケンスをプルするように指示されています。
グローバルリストからタスクシーケンスをプルした後で、現在作業中のタスクを確認するためにオペレーターのツリービューを開くと、次のようになります。
タスクを1度に1つずつ送付する
ここで、この処理フローを、タスク実行者が1度に1つずつタスクを割り当てられている別の処理フローの例と比較します。
この処理フローでは、各タスクは取得したオペレーターに1つずつ割り当てられます。オペレーターのツリービューを開いて、現在作業中のタスクを確認すると、タスクシーケンス内には1度に2つのタスクしかないタスクシーケンスで動作していることがわかります。
最初のタスクは、処理フロータスクの1つによって割り当てられたタスクです。2番目のタスクは管理専用です。トークンが次の下流アクティビティにリリースされるように、タスクが完了したことを処理フローに通知します。
処理フローが1度に1つのメインタスクだけを持つ一連のタスクシーケンスを作成しているということに注意が必要です。その後、トークンは処理フロー内を進み、タスク実行者が実行するための別のタスクシーケンスなどを作成します。
つまり、タスク実行者がこれらのタスクを実行する順序は、処理フローによって明示的に定義されていません。むしろ、処理フローを通るトークンの動きは、タスク実行者に特定の順序でタスクを実行させます。タスクをタスク実行者に送付するこの方法は、トークンが取得したタスク実行者を完全にコントロールできることを前提としています。
これらのプロセスを理解することが、なぜ役立つのでしょうか。場合によっては、トークンが取得したタスク実行者を完全にコントロールするという仮定は正しくありません。タスク実行者は、モデル内の3Dオブジェクトの標準ロジックなど、処理フロー以外の他のソースからタスクを受け取ることができます。つまり、タスク実行者が処理フローとは別の個別ソースからタスクシーケンスを割り当てられると、タスク実行者がこの処理フローのタスクの実行を中断する可能性があります。たとえば、次の図では、Operator2Aが処理フローとProcessor1Bの両方からタスクを受け取っています。
Processor1Bを5秒間実行するために、フローアイテムの輸送とスキャンの途中でOperator2Aが中断し続けることを確認してください。Operator2Aは、輸送の途中にあるフローアイテムを保持したまま、Processor1Bを実行するために何度も移動します。
これらの中断は、Operator2AがFIFO(先入れ先出し)ロジックを使用してタスクシーケンスを実行するために発生します。タスクシーケンスが割り込まれることはありませんが(プリエンプトされない限り)、各タスクはそれ自身のタスクシーケンスであるため、処理フローからのタスクは割り込まれる可能性があります。
目標は、これらの潜在的な問題を認識し、シミュレーションモデルにこのような問題がある場合に、処理フローでさまざまなタスクロジックの設計を検討することです。タスク実行者がタスクを受け取る方法と、それが他のタスクディスパッチシステム(標準の3Dロジックなど)との間で潜在的な競合を引き起こすかどうかについて考えます。[タスクシーケンスを作成]アクティビティやグローバルリストを使用するなど、別の種類の処理フロー設計を使用してタスクロジック設計に取り組むことが必要になる場合があります。
これらのさまざまなロジックシステムがどのように相互作用するかを理解していれば、特定のモデルのニーズに基づいてFlexSimのさまざまなロジックツールを使用できます。簡潔化するために、純粋に処理フロータスク方法を使用することにします。この場合、すべてのタスクロジックが処理フローを通じて生成されるようにする必要があります。ただし、必要に応じて、処理フロー内の処理フロータスクロジックを標準の3Dタスクロジックと組み合わせて一致させることができます。この場合、処理フローでタスクシーケンスを作成し、そのタスクシーケンスにタスクを追加します。全体的な目標は、タスクが正しい順序で確実に完了するようにすることです。