タスク1.4 - グローバルリストを使用したタスク
タスクの概要
このチュートリアルタスクでは、グローバルリストとタスクシーケンスを使用するタスクを構築するためのシステムを学習します。タスクシーケンスは、タスク実行者に最終的に送付されるタスクの全系列です。タスク実行者がタスクシーケンスで作業する際は、タスクシーケンス中のすべてのタスクを中断することなく(それがプリエンプトされていない限り)1つずつ終了します。タスクシーケンスをグローバルリストにプッシュすることで、タスク実行者は別のタスクの作業ができるようになった時点でリストからタスクをプルできるようになります。(グローバルリストとローカルリストとの違いについては、次のセクションを参照してください)。
タスクシーケンスは、オペレーターがジョブボードからプルする「やること」のアイテムの完全なリストと考えることができます。オペレーターは、タスクシーケンス内のすべてのタスクをリストされている順序で完了します。タスクシーケンスが完了すると、オペレーターはジョブボードに戻り、作業を行うための新しい「やること」リスト(タスクシーケンス)を取得します。
作業が終了すると、シミュレーションモデルは次のモデルのような動作をします。
グローバルリストとは?
このチュートリアルでのグローバルリストとローカルリストと違いは?一般的に、ローカルリストとグローバルリストとの違いは、リストがシミュレーションモデルのさまざまな要素にどの程度アクセス可能であるかにあります。前のチュートリアルで作成したリストは、ローカルリストであり、一般的な処理フローを通した内部的なアクセスに限定されていました。これは、そのローカル処理フロー内のトークンのみが、リストからアイテムをプッシュまたはプルできることを意味します。また、リストを設定はリスト共有アセットを処理フローにドラッグするだけででき、デフォルト設定を変更したり、処理フロー外からアクセスできるような設定もしなかったりしたりことにも着目してください。
このチュートリアルでは、[ツールボックス]にグローバルリストを作成し、それを処理フローのリスト共有アセットにリンクします。リストをグローバルにアクセス可能にすると、処理フローと3Dモデル内のオブジェクトの両方で同時に使用できます。処理フローはタスクシーケンスをリストにプッシュでき、3Dモデルのオペレーターは新しいタスクの作業ができるようになるとタスクシーケンスをリストから直接プルできます。オペレーターは処理フローとは完全に独立してグローバルリストと作用します。
ステップ1 3Dモデルをコピーして変更する
このステップでは、リストロジックの作成に使用したシステムをコピーします。作業が完了すると、3Dモデルは次の画像のようになります。
平面をコピーするには:
- [ListLogic]平面をクリックして選択します。(赤色のものです)。
- [Ctrl + C]キーを押して、平面とその上にあるすべてのオブジェクトをコピーします。モデルの空白部分をクリックして、元の平面の選択を解除します。[Ctrl + V]を押して平面をコピーします。
- 新しくコピーした平面が[StandardLogic]平面(黄色のもの)の上になるように移動します。
- コピーした平面を選択した状態で、[プロパティ]で、平面の名前を「GlobalListLogic」に変更します。
- [色]ボックスの横にある矢印をクリックして、色選択ツールメニューを開きます。緑の最も淡い色合いを選択します。
- コピーされた平面上の各3Dオブジェクトの名前を、[Queue4]、[Operator4A]、[Processor4A]など、3から4に置き換えて変更します。
- [Operator4A]を右クリックしてメニューを開きます。[オブジェクトグループ]をポイントし、[ListOperators]をクリックして、このオペレーターをそのグループから削除します。
- 前のステップを繰り返して、次のオブジェクトを次のグループから削除します。
- [ListOperators]グループから[Operator4B]を削除する
- [ListProcessors]グループから[Processor4A]を削除する
- [ListProcessors]グループから[Processor4B]を削除する
- [Operator4A]を右クリックしてメニューを開きます。[オブジェクトグループ]をポイントし、[新しいグループに追加]を選択します。
- グループプロパティウィンドウで、グループの名前を「GlobalListOperators」に変更します。
- [サンプラー]ボタン をクリックして、サンプリングモードに入ります。
- 3Dモデルで[Operator4B]をクリックしてサンプリングし、グループに追加します。
- グループプロパティウィンドウを閉じます。
- [Processor4A]を右クリックしてメニューを開きます。[オブジェクトグループ]をポイントし、[新しいグループに追加]を選択します。
- グループプロパティウィンドウで、グループの名前を「GlobalListProcessors」に変更します。
- グループプロパティウィンドウを閉じます。
3Dモデルがこのステップの冒頭に表示した画像のようになっていることを確認します。
ステップ2 グローバルリストを作成する
このステップでは、タスクシーケンスを格納するグローバルリストを設定し、処理フローのリストにリンクします。また、[リソース利用可能時]のトリガーが起動するたびに、オペレーターがこのリストからタスクシーケンスをプルするように設定します。このトリガーは、オペレーターがタスクを完了し、別のタスクを処理できるようなる度に起動します。
このロジックを作成するには:
- 左のペインで[ツールボックス]タブをクリックして、[ツールボックス]を開きます。
- [追加]ボタン をクリックして、メニューを開きます。[グローバルリスト]をポイントし、[タスクシーケンスリスト]を選択します。
- リストのプロパティで、リストの名前を「利用可能なタスク」に変更します。現時点では、フィールドはデフォルト設定のままにします。
- [バックオーダー]タブをクリックし、[プッシュですべての値を再評価]チェックボックスをオンにします。
- [OK]ボタンを押して変更を保存し、ウィンドウを閉じます。
- 3Dモデルで、[Operator4A]をクリックして、右側でそのプロパティを表示します。
- [トリガー]セクションで、[追加]ボタンをクリックして、メニューを開きます。[リソース利用可能時]を選択します。
- [リソース利用可能時]ボックスの横にある[追加]ボタン をクリックして、メニューを開きます。[リストを使用]をポイントし、[タスクシーケンスリストからプル]を選択します。
- ピックリストのプロパティウィンドウで、[利用可能なタスク]がオペレーターが使用するグローバルリストとしてリストされていることを確認します。
- [Operator4B]に対して前のステップを繰り返します。
この時点でモデルを保存することをおすすめします。
ステップ3 グローバルリストを使用してタスクを作成する
このステップでは、一般的な処理フローにアクティビティを追加して、グローバルリストを使用して輸送タスクロジックを作成する処理フローを構築します。
作業が完了すると、処理フローは次の画像のようになります。
現時点では、これらのアクティビティの追加と処理フローへの接続のみを行います。後のステップで、プロパティを編集して機能を追加します。
これらのアクティビティを追加して接続するには:
- ツールバーで、[処理フロー]ボタンをクリックして、メニューを開きます。[一般的な処理フローを追加]を選択します。
- 処理フローの空白をクリックして、何も選択されていない状態にします。[クイックプロパティ]で、処理フローの名前を「GlobalListLogic」に変更します。
- 処理フローを開き、有効にした状態で、[コンテナ]形状([表示]の下)を処理フローにドラッグします。
- [プロパティ]で、形状の名前を「グローバルリストを使用したタスク」に変更します。
- [色]ボックスの横にある矢印をクリックし、濃い緑色に変更します。[GlobalListLogic]平面の色と一致するよう、緑色を使用します。
- [グローバルリソースを使用したタスク]形状で、次のアクティビティを追加してスタックブロックを作成します。
- 1つの[イベントトリガーソース]([トークンの作成]の下)
- 1つの[タスクシーケンスを作成]([タスクシーケンス]の下)
- 1つの[ロード]([タスクシーケンス]の下)
- 1つの[移動]([タスクシーケンス]の下)
- 1つの[遅延]([タスクシーケンス]の下)
- 1つの[アンロード]([タスクシーケンス]の下)
- 1つの[タスクシーケンスを終了]([タスクシーケンス]の下)
- 1つの[リストにプッシュ]([共有アセット]の下)
- 1つの[シンク]([ベーシック]の下)
- スタックブロックの右側に[リスト]共有アセットを追加します。
- アクティビティと共有アセットの名前を次のように変更します。
アクティビティ | 新しい名前 |
---|---|
リスト | リスト:利用可能なタスク |
ソース | ソース:アイテムがキューに入る |
TSを作成 | TSを作成:TransportTasks |
ロード | アイテムをキューからロードする |
移動 | ScanStationに移動する |
遅延 | 遅延:スキャンアイテム |
アンロード | プロセッサのアイテムをアンロード |
リストにプッシュ | リストにプッシュ:利用可能なタスク |
シンク | シンク:プル対象のタスクシーケンス |
処理フローがこのステップの冒頭に表示した画像のようになっていることを確認します。
ステップ4 グローバルリストロジックを作成する
このステップでは、これらのタスクを制御する処理フローロジックを設定します。この処理フローは、前のチュートリアルタスクで構築したリストベースの処理フローと非常によく似ていますが、いくつかの重要な違いがあります。主な違いは、タスクシーケンスを構築し、そのタスクシーケンスをリストにプッシュすることです。タスクシーケンスには、タスクシーケンスに関連付けられたフローアイテムの輸送タスクを完了するために必要なすべての異なるタスクが含まれます。次に、オペレーターは、タスクの作業ができるようになると、リストからタスクシーケンスをプルします。
各アクティビティと共有アセットの機能の概要を次に示します。
アクティビティ | 説明 |
---|---|
リスト:利用可能なタスク | このリストには、オペレーターが作業できるすべての輸送タスクシーケンスへの参照が格納されます。次のステップで、この内部リストをグローバルリストにリンクします。 |
ソース:アイテムがキューに入る | [イベントトリガーソース]は、3Dモデルでイベントをリッスンするイベントリスニングアクティビティです。フローアイテムが[Queue4]に入ると、このアクティビティはトークンを作成し、これを次の下流アクティビティにリリースします。このトークンに、イベントをトリガーした特定のフローアイテムへの参照を含む[ItemToTransport]という名前のラベルを割り当てます。 |
TSを作成:TransportTasks | このアクティビティでは、[TransportTasks]という名前のタスクシーケンスを作成します。この時点では、このタスクシーケンスは空ですが、トークンが残りの処理フローを移動すると、それらのタスクがこのタスクシーケンスに追加されます。タスクシーケンスは、完了すべき順序で輸送タスクを格納します。その後、タスクシーケンスはグローバルリストにプッシュされます。 |
アイテムをキューからロードする | このアクティビティは、選択する必要があるフローアイテムと、そのフローアイテムの場所をオペレーターに指示します。 |
ScanStationに移動する | このアクティビティは、ScanStation4オブジェクトに移動するようオペレーターに指示します。 |
遅延:スキャンアイテム | このアクティビティは、コンピュータでフローアイテムをスキャンするのにかかる時間をシミュレーションします。遅延を1秒に設定します。 |
プロセッサのアイテムをアンロード | このアクティビティは、フローアイテムをアンロードする場所をオペレーターに指示します。今のところ、このアクティビティでは、[Processor4A]でフローアイテムをドロップすることのみ設定します。 |
TSを終了 | このアクティビティは、タスクのシーケンスの終わりを宣言します。 |
リストにプッシュ:利用可能なタスク | このアクティビティでは、[TransportTasks]タスクシーケンス内のタスクが[利用可能なタスク]グローバルリストにプッシュされます。 |
シンク:プル対象のタスクシーケンス | このアクティビティは、処理フローからトークンを削除します。デフォルト設定を使用します。 |
この機能を作成するには:
- 処理フローで、[リスト:利用可能なタスク]共有アセットをクリックして選択します。[プロパティ]で、[リスト]ボックスの横にある矢印をクリックして、メニューを開きます。「グローバルリスト」をポイントし、[利用可能なタスク]を選択します。
- [ソース:アイテムがキューに入る]アクティビティをクリックして選択します。アクティビティの横にある[感嘆符]ボタン をクリックして、サンプリングモードに入ります。
- 3Dモデルで[Queue4]をクリックしてメニューを開きます。メニューから[Queue4:エントリ時]を選択します。
- [プロパティ]の[ラベルの割り当て]テーブルで、[ラベル名]列の下の[入るアイテム]行にあるセルをクリックします。「ItemToTransport」と入力します。
- [オペレーター]列の[入るアイテム]行にあるセルをクリックしてメニューを開きます。[割り当てる]を選択します。
- [TSを作成:TransportTasks]アクティビティをクリックして選択します。[プロパティ]で、[タスク実行者/ディスパッチャー]ボックスの横にある[削除]ボタンをクリックします。
- [割り当て先]オプションの下にあるボックスで、現在のテキストを削除し、「
token.TransportTasks
」と入力します。 - [送付と待機]チェックボックスがオフになっていることを確認します。
- [アイテムをキューからロード]アクティビティをクリックして選択します。[プロパティ]で、[タスク実行者/シーケンス]ボックスの横にある矢印をクリックして、メニューを開きます。[トークンラベル]をポイントし、[TransportTasks]を選択します。
- [アイテム]ボックスの横にある矢印をクリックして、メニューを開きます。[トークンラベル]をポイントし、[ItemToTransport]を選択します。
- [ScanStationに移動]アクティビティをクリックして選択します。[プロパティ]で、[タスク実行者/シーケンス]ボックスの横にある矢印をクリックして、メニューを開きます。[トークンラベル]をポイントし、[TransportTasks]を選択します。
- [目的地]ボックスの横にある[サンプラー]ボタン をクリックしてサンプリングモードに入ります。
- 3Dモデルで、[ScanStation4]をクリックして、メニューを開きます。[GlobalListLogic/ScanStation4]を選択します。
- [遅延:スキャンアイテム]アクティビティをクリックして選択します。[プロパティ]で、[タスク実行者/シーケンス]ボックスの横にある矢印をクリックして、メニューを開きます。[トークンラベル]をポイントし、[TransportTasks]を選択します。
- [遅延時間]ボックスで、現在のテキストを削除し、「
1.00
」と入力します。 - [アンロード:プロセッサのアイテム]アクティビティをクリックして選択します。[プロパティ]で、[タスク実行者/シーケンス]ボックスの横にある矢印をクリックして、メニューを開きます。[トークンラベル]をポイントし、[TransportTasks]を選択します。
- [アイテム]ボックスの横にある矢印をクリックして、メニューを開きます。[トークンラベル]をポイントし、[ItemToTransport]を選択します。
- [ステーション]ボックスの横にある[サンプラー]ボタン をクリックして、サンプリングモードに入ります。
- 3Dモデルで[Processor4A]をクリックして、メニューを開きます。[GlobalListLogic/Processor4A]を選択します。
- [リストにプッシュ:利用可能なタスク]アクティビティをクリックして選択します。アクティビティの横にある[感嘆符]ボタン をクリックして、サンプリングモードに入ります。
- [リスト:利用可能なタスク]共有アセットをクリックして選択します。このアクティビティと共有アセットが青い線でリンクされます。
- [プロパティ]で[プッシュ値]ボックスの横にある矢印をクリックして、メニューを開きます。[トークンラベル]をポイントし、[TransportTasks]を選択します。
[TSを終了]アクティビティをクリックして選択します。[クイックプロパティ]で、[タスクシーケンス]の下のボックスをクリックし、そのボックスに「token.TransportTasks」と書き込みます。
モデルをリセットして実行します。
ご覧のとおり、何も起こりません。ボックスはキューの中にスタックされているだけで、オペレーターは動きません。何が悪かったのでしょうか。
処理フローをよく見ると、そこにヒントがあります。トークンが、[アイテムをキューからロードする]アクティビティ内でボトルネックを形成していることがわかります。つまり、このアクティビティで何かが発生しており、トークンが次の下流のアクティビティに移動するのを妨げているということになります。次のステップでは、これが起こる理由と、問題の解決方法を学びます。
ステップ5 ボトルネックのトラブルシューティング
このステップでは、処理フローで発生しているトークンのボトルネックを修正します。この問題を解決するには、この処理フローのロジックが、これまでにこのチュートリアルで作成した他の種類の処理フローで使用されているロジックとどのように異なるかということに注意する必要があります。
これまでに作成した他の処理フローでは、トークンが処理フロー内のさまざまなアクティビティをリアルタイムで移動するときに、オペレーターが各タスクを実行しました。この処理フローでは異なるアプローチを使用しています。タスクをリアルタイムで完了するのではなく、タスクをタスクシーケンスに追加してからグローバルリストにプッシュします。
このチュートリアルの冒頭で説明したように、タスクシーケンスは、集合的なジョブボードに投稿される「やること」アイテムの完全なリスト(グローバルリスト)と見なすことができます。この処理フローで行っているのは、タスク実行者が後で実行するための指示を作成することです。タスクシーケンスは、タスク実行者がリストからプルして作業を開始するまで、グローバルリストで待機します。
グローバルリスト処理フローでボトルネックが発生しているのは、[キューからアイテムをロードする]アクティビティが次の下流のアクティビティにトークンをリリースしないためです。デフォルトでは、アクティビティはタスクが完了するまで待ってから次に進むようになっています。これらのタスクはリアルタイムで完了しないため、プロパティを調整して、このタスクが完了しなくてもトークンが次のアクティビティに進めるようにする必要があります。
これらの変更を行うには:
- [アイテムをキューからロード]アクティビティをクリックして選択します。[プロパティ]で、[完了まで待機]チェックボックスをオフにします。
- [ScanStationに移動]アクティビティをクリックして選択します。[プロパティ]で、[完了まで待機]チェックボックスをオフにします。
- [遅延:スキャンアイテム]アクティビティをクリックして選択します。[プロパティ]で、[完了まで待機]チェックボックスをオフにします。
- [アンロード:プロセッサのアイテム]アクティビティをクリックして選択します。[プロパティ]で、[完了まで待機]チェックボックスをオフにします。
モデルをリセットして実行します。
ご覧のように、ボトルネックが修正され、異なる方法でロジックを設定する他のシミュレーションモデルとほぼ同じように動作します。
もちろんこの時点では、2つ目のプロセッサと作業する機能や、優先度付きのフローアイテムを処理する方法を設定していません。また、オペレーターは現在、[リソースを取得]アクティビティによって制限されていないため、一度に複数のフローアイテムをプロセッサにロードすることがあります。このチュートリアルの残りの部分では、このような問題に対応するロジックを設定します。
ステップ6 タスクシーケンスの優先度を追加する
タスクシーケンスをグローバルリストにプッシュすることで、標準ロジックシステムと組み合わせることができ、標準ロジックシステムの優先度と機能にタスクシーケンスを統合することもできます。このステップでは、そのロジックを設定します。フローアイテムの[RushOrder]ラベルを使用して、優先度をタスクシーケンスに割り当ててからリストにプッシュします。また、これらの優先順位レベルが標準ロジックとどのように相互作用するかを見ることができます。
作業が終了すると、処理フローは次の画像のようになります。
次に、新規または編集済みのアクティビティと共有アセットがどのように機能するかの概要を示します。
アクティビティ | 説明 |
---|---|
ラベルを割り当て:RushOrderをコピーする | このアクティビティは、[RushOrder]ラベルをフローアイテムからトークンにコピーします。 |
TSを作成:TransportTasks | このアクティビティを編集して、[RushOrder]ラベルの優先度に基づいて各タスクシーケンスに優先度レベルを割り当てます。 |
リスト:利用可能なタスク | このリストにフィールドを追加して、タスクシーケンスの優先度レベルを追跡します。 |
このロジックを作成するには:
- 処理フローを開き、有効にした状態で、[ソース:アイテムがキューに入る]アクティビティの後に、[ラベルを割り当てる]アクティビティ([ベーシック]の下)を挿入します。
- このアクティビティの名前を「ラベルを割り当てる:RushOrderをコピーする」に変更します。
- このアクティビティの[プロパティ]で、[追加]ボタンをクリックして新しいラベルを追加します。
- [名前]ボックスに、「
RushOrder
」と入力します。 - [値]ボックスに「
token.ItemToTransport.RushOrder
」と入力します。 - [TSを作成:TransportTasks]アクティビティをクリックして選択します。[プロパティ]の[優先度]ボックスで、現在のテキストを削除し、「
token.RushOrder
」と入力します。 - [リスト:利用可能なタスク]共有アセットをクリックします。[クイックプロパティ]で、[詳細]ボタンをクリックしてリストのプロパティを開きます。
- [フィールド]タブで[追加]ボタン をクリックして、メニューを開きます。[優先度]を選択して、このフィールドを追加します。
- [OK]ボタンを押して変更を保存し、プロパティウィンドウを閉じます。
- 3Dモデルで、[Operator4A]をクリックして、右側でそのプロパティを表示します。
- [リソース利用可能時]トリガーの横にある[トリガー]セクションで、[プロパティを編集]ボタンをクリックしてピックリストオプションを開きます。
- [クエリ]ボックスの横にある[追加]ボタン をクリックして、メニューを開きます。[ORDER BY (Sort)]をポイントし、[優先度]を選択します。
ASC
をDESC
に変更します。 - [Operator4B]に対して前のステップを繰り返します。
モデルをリセットして実行します。
グローバルリストシステムは、ローカルリストを使用したシステムと同様に優先度も処理できます。ただし、標準ロジックよりも優先度レベルをうまく処理できるという利点があります。つまり、標準ロジックの要素と処理フローロジックを組み合わせ、より洗練された優先度とプリエンプトを処理するシステムを開発できます。
ステップ7 2つ目のプロセッサを追加する
この最後のステップでは、2つ目のプロセッサを追加します。残念ながら、2つ目のプロセッサの機能を追加すると、タスクシーケンスを作成してグローバルタスクシーケンスリストにプッシュすることによる欠点がいくつか見え始めます。
作業が終了すると、処理フローは次の画像のようになります。
新しいアクティビティと編集されたアクティビティと共有アセットがどのように機能するかの概要を次に示します。
アクティビティ | 説明 |
---|---|
リソース:プロセッサ | この共有アクティビティを3Dモデルの[GlobalListProcessors]グループにリンクすることで、このグループのプロセッサを取得して、一度に1つのフローアイテムに制限できます。また、リソースのキュー方法を設定して、[RushOrder]値が1のフローアイテムを優先します。 |
プロセッサを取得する | このアクティビティは、タスクシーケンスを構築する前にプロセッサを取得しようとします。プロセッサが使用可能な場合は、トークンがリソースを取得し、そのトークンを次の下流オブジェクトにリリースします。リソースが取得されると、トークンに、取得した3Dモデル内のプロセッサへの参照を含む[Processor]という名前のラベルを割り当てます。 |
プロセッサのアイテムをアンロード | このアクティビティを編集し、[Processor]ラベルを使用して、どのプロセッサがフローアイテムを受け取るかを決定します。 |
イベントを待つ:処理完了 | これはイベントリスニングのアクティビティです。つまり、3Dモデル内のオブジェクトをリッスンし、イベントが発生すると、トークンを次の下流アクティビティにリリースします。このアクティビティは、プロセッサがアイテムの処理を終了するまで待機してから、トークンを次のアクティビティにリリースします。 |
プロセッサをリリースする | このアクティビティは、別のフローアイテムを受け入れることができるようにプロセッサをリリースします。[Processor]ラベルを使用してプロセッサをリリースします。 |
2つ目のプロセッサを追加するには:
- 3Dモデルで[Processor4B]を右クリックしてメニューを開きます。[オブジェクトグループ]をポイントし、[GlobalListProcessors]を選択してこのグループにプロセッサを追加します。
- 処理フローで、[ラベルを割り当てる:RushOrderをコピーする]アクティビティの後に[リソースを取得]アクティビティ([共有アセット]の下)を挿入します。
- [リストにプッシュ:利用可能なタスク]アクティビティの後に、[イベントを待つ]アクティビティ([ベーシック]の下)を挿入します。
- 追加したばかりの[イベントを待つ]アクティビティの後に、[リソースをリリース]アクティビティ([共有アセット]の下)を挿入します。
- [リソース]共有アセット([共有アセット]の下)を追加し、アクティビティのスタックブロックの右側に配置します。
- アクティビティと共有アセットの名前を次のように変更します。
- [リソース:プロセッサ]共有アセットをクリックして選択します。[プロパティ]で、[参照]ボックスの横にある矢印をクリックして、メニューを開きます。[グループ]をポイントし、[GlobalListProcessors]を選択します。
- [キュー方法]ボックスに、「
ORDER BY Puller.RushOrder DESC
」と入力します。 - [プロセッサを取得]アクティビティをクリックして選択します。アクティビティの横にある[感嘆符]ボタン をクリックして、サンプリングモードに入ります。
- [リソース:プロセッサ]共有アセットをクリックしてサンプリングします。このアクティビティと共有アセットが青い線でリンクされます。
- [プロパティ]の[ラベルに割り当てる]ボックスで、現在のテキストを削除して「
token.Processor
」と入力します。 - [アンロード:プロセッサのアイテム]アクティビティをクリックして選択します。[プロパティ]で、[ステーション]ボックスの横にある矢印をクリックして、メニューを開きます。[トークンラベル]をポイントし、[プロセッサ]を選択します。
- [イベントを待つ:処理完了時]アクティビティをクリックして選択します。[オブジェクト]ボックスの横にある矢印をクリックして、メニューを開きます。[トークンラベル]をポイントし、[プロセッサ]を選択します。
- [イベント]ボックスの横にある[サンプラー]ボタン をクリックして、サンプリングモードに入ります。
- 3Dモデルで[Processor4A]をクリックして、メニューを開きます。[処理完了時]を選択します。
- [プロセッサをリリース]アクティビティをクリックして選択します。[割り当て先のリソース]の横にある矢印をクリックして、メニューを開きます。[トークンラベル]をポイントし、[Processor]を選択します。
アクティビティ | 新しい名前 |
---|---|
リソース | リソース:プロセッサ |
取得 | プロセッサを取得する |
イベントを待つ | イベントを待つ:処理完了 |
リリース | プロセッサをリリースする |
シンク:プル対象のタスクシーケンス | シンク:Sinkにリリースされたアイテム |
モデルをリセットして実行します。
グローバルリストシステムは問題なく追加のプロセッサを処理できますが、残念ながらグローバルリストシステムの利点のいくつかを失います。たとえば、処理フローは、作成して一度にリストにプッシュできるタスクシーケンスは2つのみです。一度に2つのプロセッサしか取得できないため、一度にプッシュできるのは2つのタスクシーケンスだけです。これにより、グローバルリストの効率が低下します。オペレーターが多くのタスクの中からタスクを選択し、特定の条件を満たすタスクに基づいてプルタスクの作業に重点を置くことができる場合の方が効率的です。
この問題は、タスクシーケンスがリストにプッシュされる前にプロセッサが割り当てられるのではなく、オペレーターがグローバルリストからタスクシーケンスをプルすると同時に何らかの形でプロセッサを動的に割り当てることができれば回避できます。しかし、現時点でFlexSimでこれを行う簡単な方法はありません。
次のステップでは、この問題の非常に簡単な回避策を実装する方法を学びます。
ステップ8 プロセッサの問題のトラブルシューティング
このステップでは、2つ目のプロセッサを追加しようとしたときに前のステップで発生した問題に対する回避策を学びます。ご存知のとおり、問題は、オペレーターがグローバルリストからタスクシーケンスをプルするときにプロセッサを動的に割り当てられないことです。
回避策として、2つのプロセッサの前にキューを配置し、オペレーターがそれらをアンロードしたときにアイテムを格納できるようにします。次にプロセッサを、別のアイテムに対する準備ができたときはいつでもキューからフローアイテムをプルするよう設定します。新しいキューも、急ぎ注文のアイテムが最初にプロセッサによってプルされるように設定します。最後に、処理フローを変更して不要なアクティビティを削除し、フローアイテムのアンロード先を変更します。
これらの変更を行うには:
- 3Dモデルで、[GlobalListLogic]平面に別の[キュー]を追加し、2つのプロセッサの近くに配置します(スペースを空けるためにScanstation4形状を移動する必要がある場合があります)。
- 新しいキューの名前を「Destination4」に変更します。
- Destination4からProcessor4AとProcessor4Bへのポート接続(A接続)を作成します。
- [Processor4A]をクリックして、右側でそのプロパティを開きます。[入力]セクションで、[プル]ボックスをオンにします。[OK]ボタンをクリックして変更を保存し、ウィンドウを閉じます。
- [Processor4B]に対して前のステップを繰り返します。
- [Destination4]をクリックして、そのプロパティウィンドウを開きます。[トリガー]セクションで、[追加]ボタンをクリックして、メニューを開きます。[エントリ時]を選択します。
- [エントリ時]ボックスの横にある[追加]ボタン をクリックして、メニューを開きます。[コントロール]をポイントし、[式別に並べ替え]を選択してピックリストウィンドウを開きます。
- [式]ボックスで、現在のテキストを削除し、「
item.RushOrder
」と入力します。 - [順序]メニューに[降順]と表示されていることを確認します。
- 処理フローで、次のアクティビティと共有アセットを削除します。
- [リソース:プロセッサ]共有アセット
- [プロセッサを取得]アクティビティ
- [イベントを待つ:処理完了]アクティビティ
- [プロセッサをリリース]アクティビティ
- [アンロード:プロセッサのアイテム]をクリックして選択します。[プロパティ]で、[ステーション]ボックスの横にある[サンプラー]ボタンをクリックして、サンプリングモードに入ります。
- 3Dモデルで[Destination4]キューをクリックして、メニューを開きます。サンプリングするには、GlobalListLogic/Destination4を選択します。
モデルをリセットして実行します。
タスクシーケンスが構築されてリストにプッシュされる前にプロセッサを割り当てなければならないというシステム制限がなくなったため、タスクリストに一度に3つ以上のタスクが保持されるようになりました。アイテムがDestination4のキューに累積し始めると、プロセッサは急ぎ注文アイテムを最初にプルします(必要に応じて、より長い処理時間で実験すると確認できます)。
結論
処理フローでリストを使用して輸送タスクを構築しました。これには次のような利点があります。
- 作業するタスクを探すシステムの設計 - グローバルリストを使用すると、タスクシーケンスをリストにプッシュし、オペレーターに特定の基準に基づいてタスクシーケンスをプルさせることができます。この例では、オペレーターに優先度の高いタスクを先にプルするように指示していましたが、さらに複雑な設定をシステムに追加することもできます。たとえば、特定の専門分野のオペレーターに、その専門分野を必要とするタスクシーケンスをプルさせることができます。
- モデルの拡張性 - 多くのなるシステムの利用可能なタスクシーケンスを、1つのオペレーターグループがアクセスするグローバルリストに配置するようモデルを設定できる可能性があるため、作業するタスクを探すシステムは拡張できる可能性があります。
- 標準ロジックとの組み合わせ - 処理フローと標準ロジックの両方の利点を使用するタスクシステムを設計する必要がある場合は、タスクシーケンス方法を使用すると便利です。
- 優先度とプリエンプト - 他の処理フローシステムには、標準ロジックで正常に機能する優先度やプリエンプト値をタスクに割り当てる方法はありません。優先度やプリエンプト値を割り当てる唯一の方法は、タスクシーケンスを作成し、そのシーケンスに優先度レベルまたはプリエンプト値を割り当ててから、グローバルリストにプッシュすることです。
ただし、リストを使用したタスクロジックの構築には、いくつかの欠点があります。
- 動的な意思決定なし - このシステムの欠点の1つは、タスクシーケンスをグローバルリストにプッシュした後は、タスクシーケンスを動的に変更または更新できないことです。タスクシーケンスがグローバルリストにプッシュされると、変更することはできません。たとえば、タスクシーケンスが構築され、リストにプッシュされたときに、どのプロセッサにフローアイテムをアンロードするかを事前に決定されている必要があるため、オペレーターは、どのプロセッサにフローアイテムをアンロードするかを動的に決定できません。グローバルリストシステムのこのような弱点は、システムの利点を潜在的に排除します。
これでタスクロジックのチュートリアルは終了です。シミュレーションモデルでタスクロジックを構築するさまざまな方法の利点と欠点をよくご理解いただけたでしょうか。シミュレーションプロジェクトでどのシステムを使用するかを検討する際は、システムに固有のニーズと、そのプロジェクトに最適なタスクロジック方法を検討してください。