チュートリアルタスク1.3 - リストを使用したタスク
タスクの概要
このタスクでは、処理フローでリストを使用してタスクを構築する方法について学習します。リストには、独自のカスタム基準を使用してタスクの並べ替えや優先順位付けを行えるという利点があります。このチュートリアルでは、リストを使用してタスクを構築する際の利点と欠点についても説明します。
作業が終了すると、シミュレーションモデルは次のモデルのような動作をします。
ステップ1 3Dモデルをコピーして変更する
このステップでは、ベーシックな処理フローロジックの作成に使用したシステムをコピーします。作業が完了すると、3Dモデルは次の画像のようになります。
[BasicProcessFlowLogic ]平面をクリックして選択します。(オレンジ色のものです)。
[Ctrl + C]キーを押して、平面とその上にあるすべてのオブジェクトをコピーします。モデルの空白部分をクリックして、元の平面の選択を解除します。[Ctrl + V]を押して平面をコピーします。
コピーした平面を選択した状態で、[クイックプロパティ]で、平面の名前を「ListLogic 」に変更します。
[色]ボックスの横にある矢印をクリックして、色選択ツールメニューを開きます。赤の最も淡い色合いを選択します。
コピーされた平面上の各3Dオブジェクトの名前を、[Queue3 ]、[Operator3A ]、[Processor3A ]など、2 から3 に置き換えて変更します。
ここで、Queue3からProcessor3AとProcessor3Bまでのポート接続を削除します(この接続を削除するには、Qキー を押したまま、接続された2つのオブジェクトをクリックします)。
[Processor3A ]を右クリックしてメニューを開きます。[オブジェクトグループ ]をポイントし、[新しいグループに追加 ]を選択します。
グループプロパティウィンドウで、グループの名前を「ListProcessors 」に変更します(このプロパティウィンドウに戻るには、[ライブラリ]タブの横にある[ツールボックス ]タブに移動して、[グループ]セクションの下で[グループ]を探し、そのグループをダブルクリックします)。
[サンプラー ]ボタン をクリックして、サンプリングモードに入ります。
3Dモデルで[Processor3B ]をクリックしてサンプリングし、グループに追加します。
グループプロパティウィンドウを閉じます。
3Dモデルがこのステップの冒頭に表示した画像のようになっていることを確認します。
ステップ2 リストを使用してタスクを作成する
このステップでは、アクティビティを一般的な処理フローに追加して、リストを使用して輸送タスクロジックを作成するタスクフローを構築します。
作業が完了すると、処理フローは次の画像のようになります。
現時点では、これらのアクティビティの追加と処理フローへの接続のみを行います。後のステップで、プロパティを編集して機能を追加します。
これらのアクティビティを追加して接続するには:
メインツールバーで[処理フロー ]ボタンをクリックして、メニューを開きます。[Add a General Process Flow ]を選択します。
処理フローの空白をクリックして、何も選択されていない状態にします。[クイックプロパティ]で、処理フローの名前を「ListLogic 」に変更します。
処理フローを開き、有効にした状態で、ライブラリから2つの[処理 ]形状([フローチャート ]の下)をドラッグします。
[クイックプロパティ]で、最初の形状の名前を[キューがリストにアイテムをプッシュ ]に変更します。
[色 ]ボックスの横にある矢印をクリックして赤に変更します。ListLogic平面の色と一致するように、赤を使用します。
2つ目の形状の名前を[プロセッサがリストからアイテムをプル ]に変更します。前のステップを繰り返して、2つ目の形状の色も赤に変更します。
[キューがリストにアイテムをプッシュ ]形状で、次のアクティビティを追加してスタックブロックを作成します。
1つの[イベントトリガーソース ]([トークンの作成 ]の下)
1つの[リストにプッシュ ]([共有アセット ]の下)
1つの[シンク ]([ベーシック ]の下)
スタックブロックの右側に[リスト ]共有アセットを追加します。
アクティビティと共有アセットの名前を次のように変更します。
アクティビティ
新しい名前
リスト
リスト:輸送するアイテム
ソース(イベントトリガー)
ソース:アイテムがキューに入る
リストにプッシュ
リストにプッシュ:輸送するアイテム
シンク
シンク:アイテムがプッシュ済み
[プロセッサがリストからアイテムをプル ]形状で、[スケジュールソース ]([トークンの作成 ]の下)を作成します。
新しく作成されたスタックブロックの下に、次のアクティビティを含む2つ目のスタックブロックを作成します。
1つの[リストからのプル ]([共有アセット ]の下)
1つの[TSを作成 ]([タスクシーケンス ]の下)
1つの[ロード ]([タスクシーケンス ]の下)
1つの[移動 ]([タスクシーケンス ]の下)
1つの[遅延 ]([タスクシーケンス ]の下)
1つの[アンロード ]([タスクシーケンス ]の下)
1つの[TSを終了 ]([タスクシーケンス ]の下)
アクティビティと共有アセットの名前を次のように変更します。
アクティビティ
新しい名前
ソース(スケジュール)
ソース:プロセッサグループを初期化
リストからプル
リストからプル:輸送するアイテム
TSを作成
タスクシーケンスを作成
ロード
アイテムをキューからロードする
移動
ScanStationに移動する
遅延
遅延:スキャンアイテム
アンロード
プロセッサのアイテムをアンロード
TSを終了
TSを終了
[ソース:プロセッサグループを初期化 ]から[リストからプル:輸送するアイテム ]へのコネクターを作成します。
[タスクシーケンスを終了 ]から[リストからプル:輸送するアイテム ]へのコネクターを作成します。
処理フローがこのステップの冒頭に表示した画像のようになっていることを確認します。
ステップ3 リストにプッシュロジックを作成する
リストを扱うときの注意点として、通常は複数のフローを扱うため、リストはやや複雑であるということがあります。ここでフロー という用語は、処理フローを通過する2つの異なるトークンのストリームを指します。1つのトークンフローで3Dモデル内のアイテムのフローを管理し、輸送の準備ができたら、タスクリストにそれらをプッシュします。トークンのもう1つのフローは、3Dモデル内のオペレーターのフローを管理し、リストからアイテムをプルして一連のタスクを完了するように指示します。
このステップでは、[キューがリストへタスクをプッシュ]処理フローのアクティビティのプロパティを編集します。これらのアクティビティは、輸送する必要があるアイテムのフローを本質的にコントロールします。つまり、フローアイテムがキューに入ると、フローアイテムはリストにプッシュされ、輸送されるまでそこで待機します。
各アクティビティと共有アセットの機能の概要を次に示します。
アクティビティ
説明
リスト:輸送するアイテム
このリストは、Queue3で、プロセッサに輸送する準備ができている、すべてのフローアイテムへの参照を格納します。
ソース:アイテムがキューに入る
[イベントトリガーソース]は、3Dモデルでイベントをリッスンするイベントリスニングアクティビティです。フローアイテムがQueue3に入ると、このアクティビティはトークンを作成し、これを次の下流アクティビティにリリースします。このトークンに、イベントをトリガーする特定のフローアイテムへの参照を含む、[FlowItem ]という名前のラベルを割り当てます。
リストにプッシュ:輸送するアイテム
このアクティビティは、キューにあるすべてのフローアイテムを[輸送するアイテム]リストにプッシュします。アイテムがリストにプッシュされると、[FlowItem ]ラベルを使用して特定のフローアイテムへの参照が保持されます。
シンク:アイテムがプッシュ済み
このアクティビティは、処理フローからトークンを削除します。デフォルト設定を使用します。
この機能を作成するには:
[ソース:アイテムがキューに入る ]アクティビティをクリックして選択します。[感嘆符 ]ボタン をクリックして、サンプリングモードに入ります。
3Dモデルで[Queue3 ]をクリックして、メニューを開きます。メニューから[Queue3:エントリ時 ]を選択します。
[クイックプロパティ]の[ラベルの割り当て ]テーブルで、[ラベル名または値 ]列の下の[入るアイテム ]行にあるセルをクリックします。「FlowItem 」と入力します。
[オペレーション ]の[入るアイテム ]行にあるセルをクリックしてメニューを開きます。[割り当てる ]を選択します。
このラベルの役割
標準のオブジェクトベースのイベントには、特定のパラメータが関連付けられています。この場合、[入るアイテム]パラメータには、イベントをトリガーしたフローアイテムへの参照が含まれています。通常、この情報の一部は、他の処理フローアクティビティが参照できるラベルに入れて保持します。
このチュートリアルでは、[FlowItem ]というラベル名を使用して、この処理フローでこのラベルを参照する他の場所がより明確にわかるようにしています。
[リストにプッシュ:輸送するアイテム ]アクティビティをクリックして選択します。[感嘆符 ]ボタン をクリックして、サンプリングモードに入ります。
[リスト:輸送するアイテム ]共有アセットをクリックして選択します。このアクティビティと共有アセットが青い線でリンクされます。
[クイックプロパティ]で[プッシュ値 ]ボックスの横にある矢印をクリックして、メニューを開きます。[Token Label ]をポイントし、次に[FlowItem ]を選択します。
次のステップでは、オペレーターがリストからアイテムをプルし、輸送タスクを開始させるロジックを設定します。
ステップ4 リストからプルロジックを作成する
このステップでは、[プロセッサがリストからタスクをプル]処理フロー内のアクティビティのプロパティを編集します。前のステップでは、リストを使用する処理フローに通常複数のトークンフローがあることを学びました。この処理フローでは、1つのトークンフローがフローアイテムをコントロールし、もう1つがプロセッサとオペレーターをコントロールします。
このステップでは、プロセッサとオペレーターをコントロールするロジックを設計します。このアクティビティのセットは、リストからアイテムをプルして、オペレーターにそのアイテムを輸送するように指示します。前の処理フローでトークンがフローアイテムをどのように表していたかを確認してください。この処理フローでは、トークンがアイテムに対してリクエストを発行するプロセッサを表します。
各アクティビティと共有アセットの機能の概要を次に示します。
アクティビティ
説明
ソース:プロセッサグループを初期化
シミュレーションが開始すると、このアクティビティは[ListOperators ]グループ内の各プロセッサ用のトークンを作成します。また、プロセッサグループのメンバーの1つをそのトークンのラベルに割り当てます。
リストからプル:輸送するアイテム
このアクティビティは、[輸送するアイテム]リストからフローアイテムをプルします。リストからプルされたフローアイテムへの参照を含む[TransportedItem ]というラベルをトークンに割り当てます。
タスクシーケンスを作成
これは、ディスパッチャーに割り当ててからオペレーターに割り当てるタスクのシーケンスを初期化します。
アイテムをキューからロードする
このアクティビティは、選択する必要があるフローアイテムと、そのフローアイテムの場所をオペレーターに指示します。
ScanStationに移動する
このアクティビティは、ScanStation3オブジェクトに移動するようオペレーターに指示します。
遅延:スキャンアイテム
このアクティビティは、コンピュータでフローアイテムをスキャンするのにかかる時間をシミュレーションします。遅延を1秒に設定します。
プロセッサのアイテムをアンロード
このアクティビティは、フローアイテムをアンロードする場所をオペレーターに指示します。このタスクが終了すると、トークンは[リストからプル]アクティビティにループバックし、同じ処理を繰り返します。
タスクシーケンスを終了
このアクティビティは一連のタスクを完了として指定するため、新しいタスクシーケンスをオペレーターに割り当てることができます。
このロジックを作成するには:
[ソース:プロセッサグループを初期化 ]アクティビティをクリックして選択します。[クイックプロパティ]の[到着 ]テーブルで、[量 ]列の下のセルをクリックします。そのセルを選択した状態で、[到着1:量 ]ボックスの横にある矢印をクリックし、「Group(“ListProcessors”).length 」と入力します。
このプロパティウィンドウで、プラス記号をクリックして、作成したトークンに新しいラベルを追加します。[名前 ]ボックスに、「Processor 」と書き込みます。ここで、[値 ]ボックスに、「Group(“ListProcessors”)[tokenIndex] 」と入力します。
コードのこれらのビットの意味
このコードは、現在[ListOperators ]グループに属するメンバー数を処理フローに伝えます。コード.lengthは、グループ内のメンバーの数を意味します。その後ろに角括弧を追加する2つ目のスクリプトでは、それが特定のインデックスに配置されたグループ内のエントリを探していることを意味します(グループ内のすべてのオブジェクトに、グループ内のその位置を定義するインデックスが割り当てられます)。その後で、用語のtokenIndexを入力します。スケジュールソースでトークンを作成すると、その作成順を示すインデックス番号が割り当てられます。「長さ」つまりグループ内で列挙される番号と一致する番号を作成しているため、このスクリプトは、トークンのインデックスに従って、グループの各メンバーをトークン上のラベルに割り当てます。これは複雑そうに見えますが、スケジュールソース内のこれらの手順に従えば、グループ内のメンバーの数と一致する数のトークンが作成され、ラベル上のトークンのそれぞれにメンバーが1つずつ割り当てられます。
[リストからプル:輸送するアイテム ]アクティビティをクリックして選択します。アクティビティの横にある[感嘆符 ]ボタン をクリックして、サンプリングモードに入ります。
[リスト:輸送するアイテム ]共有アセットをクリックして選択します。このアクティビティと共有アセットが青い線でリンクされます。
[クイックプロパティ]で、[割り当て先 ]ボタンの下の現在のテキストを削除し、「token.TransportedItem
」と入力します。
[ロードアンロードを作成 ]アクティビティをクリックして選択します。[クイックプロパティ]で、[タスク実行者/ディスパッチャー ]ボックスの横にある[サンプラー ]ボタン をクリックして、サンプリングモードに入ります。
3Dモデルで[Dispatcher3 ]をクリックして、メニューを開きます。[ListLogic/Dispatcher3 ]を選択します。[ロードアンロードタスクを作成 ]アクティビティ内の残りのオプションをデフォルトのままにします。
[アイテムをキューからロード ]アクティビティをクリックして選択します。[クイックプロパティ]で、[実行者/タスクシーケンス ]のデフォルトが「token.taskSequence 」になっていることを確認します。
[アイテム ]ボックスの横にある矢印をクリックして、メニューを開きます。[トークンラベル ]をポイントし、[TransportedItem ]を選択します。
[ScanStationに移動 ]アクティビティをクリックして選択します。[クイックプロパティ]で、[実行者/タスクシーケンス ]のデフォルトが「token.taskSequence 」になっていることを確認します。
[目的地 ]ボックスの横にある[サンプラー ]ボタン をクリックしてサンプリングモードに入ります。
3Dモデルで[ScanStation3 ]をクリックして、メニューを開きます。[ListLogic/ScanStation3 ]を選択します。
[遅延 ]アクティビティをクリックして選択します。[クイックプロパティ]で、[実行者/タスクシーケンス ]のデフォルトが「token.taskSequence 」になっていることを確認します。
[プロセッサのアイテムをアンロード ]アクティビティをクリックして選択します。[クイックプロパティ]で、[実行者/タスクシーケンス ]のデフォルトが「token.taskSequence 」になっていることを確認します。
[アイテム ]ボックスの横にある矢印をクリックして、メニューを開きます。[トークンラベル ]をポイントし、[TransportedItem ]を選択します。
[ステーション ]ボックスの横にある矢印をクリックして、メニューを開きます。[トークンラベル ]をポイントし、[Processor ]を選択します。
[タスクシーケンスを終了 ]はデフォルト設定のままにすることができます。
モデルをリセットして実行します。
ご覧のように、リストを使用する処理フローは、リソースのみを使用する処理フローが実行できるすべてを実行できます。2つのモデルは同じように動作します。リストロジックを使用する唯一の欠点は、最初の設定が少し複雑なことです。リストを使用する場合は、ロジックをより綿密に検討する必要があります。
リストを使用する利点とは?リストを使用する主な利点の1つは、かなり複雑なロジックを組み込むことができるということです。リストを使用して、特定のタスクへの優先順位付け、リストフィールドに基づいたオペレーターへのタスクの割り当て、タスクの並べ替えなどを行うことができます。次のステップでは、リストを使用して輸送タスクを優先度で並べ替える方法を示します。
ステップ5 ラベルを使用してタスクに優先順位を付ける
このステップでは、リストを使用して、フローアイテムに優先度を追加します。オペレーターは、優先度の低いフローアイテムの前に優先度の高いフローアイテムを輸送します。このロジックを作成するには、すべてのフローアイテムに[RushOrder ]というラベルを追加します。このラベルは、フローアイテムが急ぎ注文かを示す真または偽の値(1が真、0が偽)のいずれかになります。アイテムの30%が急ぎ注文になるように設定します。また、ロジックを見やすくするため、急ぎ注文のアイテムの色を赤に変更します。
最後に、[リストからプル:輸送するアイテム ]アクティビティのプロパティを編集して、オペレーターが最初に急ぎ注文アイテムを輸送するようにします。このアクティビティに、[RushOrder]値が高いアイテムから先にリストからプルされるようにするクエリを追加することで、このロジックを作成します。
このロジックを作成するには:
3Dモデルで[Source3 ]をダブルクリックして、[プロパティ]ウィンドウを開きます。
[トリガー]タブで[追加 ]ボタン をクリックして、メニューを開きます。[作成時 ]オプションを選択してこのトリガーを追加します。
[OnCreation ]ボックスの横にある[追加 ]ボタン をクリックして、メニューを開きます。[データ ]をポイントし、[ラベルを設定 ]を選択します。ピックリストオプションウィンドウが表示されます。
[ラベル ]ボックスで、現在のテキストを削除し、「"RushOrder"
」と入力します。
[値 ]ボックスで、現在のテキストを削除し、「bernoulli(30, 1, 0)
」と入力します。
このコードの意味
bernoulli統計分布は、ラベルに特定の値を特定の時間の割合で割り当てます。この場合、分布は、時間の30%で1の値を返します(これは、「真」であり、急ぎ注文であることを意味します)。残りの時間は0の値を返します(これは、「偽」であることを意味します)。つまり、フローアイテムの30%は急ぎ注文であることを示します。
[トリガー]タブで[追加 ]ボタン をクリックして、メニューを開きます。[終了時 ]オプションを選択してこのトリガーを追加します。
[OnExit ]ボックスの横にある[追加 ]ボタン をクリックして、メニューを開きます。[ビジュアル ]をポイントしてから、[ケース別に色を設定 ]を選択します。ピックリストオプションウィンドウが表示されます。
[値]ボックスに「item.RushOrder 」と入力します。[オブジェクト]ボックスに[アイテム ]と表示されていることを確認します。
[追加]ボタンを2回クリックして、2つの新しいエントリを作成します。
[デフォルト ]と表示されたボックス直下のボックスで、数字の0
を書き込みます。さらにその直下のボックスで###を書き込みます。 1
ここで、数字の0
の横にあるボックスで、黒色の矢印をクリックし、オプション[Color.brown ]を選択します。
一番下のボックスで、黒色の矢印をクリックし、オプション[Color.red ]を選択します。ウィンドウは次のようになります。
[OK ]ボタンを押して変更を保存し、プロパティウィンドウを閉じます。
リスト共有アセットの[クイックプロパティ]に戻り、[詳細 ]ボタンをクリックしてリストのプロパティを開きます。
[フィールド ]タブで[追加 ]ボタン をクリックして、メニューを開きます。[ラベル ]を選択し、ラベルフィールドをリストに追加します。
[ラベルフィールド ]ボックスで、現在のテキストを削除し、「RushOrder
」と入力します。
[バックオーダー ]タブで[プッシュですべての値を再評価 ]チェックボックスをオンにします。
[OK ]ボタンをクリックして変更を保存し、ウィンドウを閉じます。
ListLogic プロセスフローで[リストからプル:輸送するアイテム ]アクティビティをクリックして選択します。[クイックプロパティ]で[クエリ/オブジェクト ]ボックスの横にある矢印をクリックして、メニューを開きます。[ORDER BY (Sort) ]をポイントし、[RushOrder ]を選択します。このボックスに表示されているクエリで、[ASC
]を[DESC
]に変更します。
モデルを実行する前にリストエントリを開くと、シミュレーションの実行中に表示できて便利です。[リスト:輸送するアイテム ]共有アセットをクリックして選択します。[クイックプロパティ]で[エントリの表示 ]ボタンをクリックします。
モデルをリセットして実行します。3Dモデルだけでなく、リストのエントリの動きにも注目してください。
オペレーターは常に赤色の急ぎ注文アイテムを他のアイテムより前に優先して輸送していることを確認してください。オペレーターが急ぎ注文アイテムをすぐに取らない場合、それは通常、その急ぎ注文アイテムが、オペレーターのトークンが[リストからプル]アクティビティが到着した後にキューに到着したためです。
リストを使用すると、この種の複雑なタスクロジックを構築できます。タスク実行者がタスクの並べ替え、フィルタリング、または優先順位付けを行う必要があるシステムに最適です。
ステップ6 その他のタスクを追加する
前のタスクでわかったように、タスク実行者がキュー内の急ぎ注文フローアイテムの1つをピックアップしないことが時々あります。この問題は、タスク実行者が既にロードタスクを開始した後に急ぎ注文アイテムがキューに到着するという、微妙なタイミングの問題によって生じます。この問題は、[リストからプル]アクティビティの前に[移動]アクティビティを追加するだけで解決できます。このようにして、タスク実行者はリストからアイテムをプルする前にキューに戻ります。これにより、優先度の高いアイテムが常に最初に選択されるようになります。
作業が終了すると、処理フローは次の画像のようになります。
これらの変更を行うには:
処理フローが開いてアクティブな状態で、[移動 ]アクティビティを[アンロード ]アクティビティと[タスクシーケンスを終了 ]アクティビティの間にドラッグします。
このアクティビティの名称を[キューに移動する ]に変更します。
[クイックプロパティ]で、[実行者/タスクシーケンス ]ボックスに「token.taskSequence」と表示されていることを確認します。
[目的地 ]ボックスの横にある[サンプラー ]ボタン をクリックしてサンプリングモードに入ります。
3Dモデルで[Queue3 ]をクリックして、メニューを開きます。サンプリングするには[ListLogic/Queue3 ]を選択します。
モデルをリセットして実行します。
これでオペレーターは、急ぎ注文したアイテムがキューに入っているときはいつでもそのアイテムを受け取ります。このステップの主な注意点として、タスクの順序とシーケンス確立が重要であることを覚えておいてください。これはオペレーターの動作に、わずかながら重大な影響を与える可能性があります。
結論
これで、処理フローでリストを使用して輸送タスクが構築されました。これには留意すべきいくつかの重要な点が含まれていることを確認できます。
タスクの並べ替えや優先順位付けが可能である - リストを使用すると、先に完了するタスクを決定するなど、より複雑なタスクロジックを作成できます。
複雑 - リストは、より深いレベルでロジックがどのように機能するかを考える必要があるため、設定が少し複雑になることがあります。リストロジックを設定する際には、より多くの要素を考慮する必要があります。たとえば、シミュレーションモデルのどのイベントがリストへのアイテムのプッシュを引き起こすか、また、どのイベントがそのリストからアイテムのプルを引き起こすかなどのロジックを、細かく考える必要があります。また、処理フロー内のトークンが3Dモデルにおいてどのようにリンクされるのかについても、より慎重に検討する必要があります(それらがフローアイテムやタスク実行者を表しているか、など)。
必ずしも予想どおりに動作するとは限りません - イベントのタイミングやタスクのシーケンスが、予期しない形でオペレーターの動作に影響を与えることがあります。ただし、予期しない動作が発生した場合でも、処理フローのトラブルシューティングや修正は非常に簡単です。
ここまでで、ローカル リストを使用してタスクロジックを作成する方法を学びました。次のチュートリアルでは、グローバル リストを使用する方法を学習し、さまざまなタイプのタスクロジックを構築するためのさらに多くの可能性を探ります。「チュートリアルタスク1.4 - グローバルリストを使用したタスク 」に進みます。