タスク2.2 - タスクシーケンスをカスタマイズする

タスクの概要

これまでのチュートリアルでは基本的に、タスク実行者がモデルで3Dオブジェクトをロード/アンロードするために使用する標準的な輸送ロジックを再作成しました。3Dオブジェクトだけで利用可能なロジックを使用すれば済むため、このロジックを作成するための処理フローを作成する必要はありませんでした。

処理フローの真の威力は、タスク実行者用のカスタムタスクシーケンスを作成する場合に発揮されます。処理フローを使用すると、シミュレーションモデル用のカスタムタスクシーケンスが簡単に作成できます。このチュートリアルタスクでは、前のチュートリアルタスクで作成したベーシックなタスクシーケンスをカスタマイズして、カスタムロジックを追加します。すべてのアイテムが処理され、輸送された後に、オペレーターがサプライクローゼットからクリーニングサプライを取り出し、プロセッサをクリーニングするカスタムタスクシーケンスを作成します。

作業が完了すると、シミュレーションモデルは次のような画像になり、機能します。

ステップ1 タスクシーケンスに別のタスクを追加する

このステップでは、タスクシーケンスを編集して少し複雑にします。フローアイテムを次の目的地に輸送し終わった後、オペレーターがプロセッサをクリーニングするタスクアクティビティを追加します。

ライブラリで利用可能な処理フローアクティビティを確認すると、ロジック関数の選択肢が数多くあることがわかりますが、これらのアクティビティは、FlexSimで利用可能な最も一般的なロジック関数のタイプに過ぎません。[カスタムコード]アクティビティを使用して、FlexSimですでに利用可能な、他の事前プログラム済みロジックを実装できます。また、必要に応じてカスタムFlexScriptコードも作成できます。このステップでは、[カスタムコード]アクティビティを使用して、クリーニングの前後にプロセッサの電源をオン/オフします。

ここでは、新しいタスクアクティビティの追加と名前の変更だけを行います。後のステップでプロパティを編集します。作業が完了すると、処理フローは次の画像のようになります。

アクティビティを追加するには:

  1. 現在のシミュレーションの実行を停止するには、シミュレーションコントロールバーの[リセット]ボタンを押します。
  2. 混乱を避けるために、処理フローの2つのインスタンスを閉じて、TransportItems処理フローだけが開いているようにします。
  3. 処理フローで、アクティビティのスタックブロックをクリックして選択します。
  4. サブフローを開始]アクティビティと[アイテムをロード]アクティビティの間にある[はさみ]ボタン をクリックして、アクティビティを分離します。[アイテムをアンロード]と[サブフローを終了]アクティビティも分離します。
  5. ライブラリの[ベーシック]グループで、[カスタムコード]アクティビティを[サブフローを開始]アクティビティの後へドラッグして、スタックブロックを作成します。
  6. アイテムをロード]アクティビティと[アイテムをアンロード]アクティビティが含まれるスタックブロックをドラッグして、[カスタムコード]アクティビティの最後に追加します。
  7. [アンロード]アクティビティの後に、次のアクティビティをこの順序でスタックブロックに追加します。
    • 移動]アクティビティ([タスクシーケンス]グループの下)
    • リソースを取得]アクティビティ([共有アセット]グループの下)
    • 移動]アクティビティ([タスクシーケンス]グループの下)
    • 遅延]アクティビティ([ベーシック]グループの下)
    • カスタムコード]アクティビティ([ベーシック]グループの下)
    • 移動]アクティビティ([タスクシーケンス]グループの下)
    • リソースをリリース]アクティビティ([共有アセット]グループの下)
  8. サブフローを終了]アクティビティをスタックブロックの最後までドラッグします。
  9. リソース]アクティビティをスタックブロックの横に追加します。接続はしません。
  10. 分かりやすくするために、新しいアクティビティの名前を次のように変更します。
  11. アクティビティ 新しい名前
    最初のカスタムコード カスタムコード:ポートを閉じる
    最初の移動 サプライクローゼットに移動
    取得 クリーニングサプライを取得
    2回目の移動 プロセッサに移動
    遅延 遅延:プロセッサを消去
    2つ目のカスタムコード カスタムコード:オープンポート
    3回目の移動 サプライクローゼットに移動
    リリース リリース:サプライを戻す
    リソース リソース:クリーニングサプライ

終了後、処理フローがこのステップの冒頭に表示した画像のようになることを確認してください。

ステップ2 アクティビティのプロパティを編集する

このステップでは、タスクシーケンスに追加したすべての新しいアクティビティのプロパティを編集します。この処理フローのアクティビティが機能する方法の概要を、次のテーブルに示します。

アクティビティ 説明
サブフローを開始 プロセッサで生成されるすべての新しいタスクはトークンを作成し、処理フローのここから開始されます。
カスタムコード:ポートを閉じる このアクティビティでは、プロセッサのポートを閉じて、クリーニングが完了するまでフローアイテムの受取を停止します。
アイテムをロード プロセッサのセンターポートに接続されたオペレーターは、フローアイテムをロードします。
アイテムをアンロード オペレーターは、フローアイテムをプロセッサの出力ポートに接続された下流の固定リソースに移動します。
サプライクローゼットに移動 オペレーターはサプライクローゼットに移動します。
クリーニングサプライを取得 オペレーターは、サプライクローゼットからクリーニング用品を取り出します。
プロセッサに移動 オペレーターはプロセッサに戻ります。
遅延:プロセッサを消去 このアクティビティは、プロセッサのクリーニングに要する時間を表します。
サプライクローゼットに移動 オペレーターはサプライクローゼットに戻ります。
リリース:サプライを戻す オペレーターは、サプライクローゼットにサプライを戻します。
終了 サブフローが完了すると、トークンはこのアクティビティに入って破棄され、タスクが完了したことを示します。
リソース:クリーニングサプライ このリソースは、プロセッサのクリーニングに使用されるクリーニングサプライを表します。このリソースをグローバルにアクセスできるように設定します。つまり、両方のオペレーター(両方のインスタンス)が同じリソースを使用します。一度に利用できるサプライは1セットのみです。

このステップは、タスクシーケンスに表示される順序ではなく、アクティビティタイプによって論理的に整理されます。

  1. アクティビティブロックをクリックして選択します。
  2. 2つの[カスタムコード]アクティビティを編集し、タスクシーケンスでプロセッサのポートを適時に閉じて開くようにします。[クイックプロパティ]の[カスタムコード:ポートを閉じる]グループの下で、[カスタムコード]ボックスの横にある[追加]ボタン をクリックし、利用可能なピックリストのメニューを開きます。[コントロール]、[ポートを開閉]をポイントして、ピックリストオプションを開きます。
  3. 現在のプロセッサの着信ポートを閉じるように[アクション]メニューを[closeinput]に設定したままにしておきます。
  4. オブジェクト]ボックスの横にある矢印をクリックして、メニューを開きます。[token.labelName]を選択します。このボックスで、[labelName]を[fromObject]に変更します。この設定では、トークンのfromObjectラベルにリストされているオブジェクトへの動的参照を作成します(このラベルでは、現在のプロセッサをこのプロパティに割り当てます。参考として、「チュートリアル1.1のステップ4」を参照してください)。つまり、現在のプロセッサからの着信ポートが閉じられます。
  5. ステップ2〜4を繰り返し[カスタムコード:ポートを開く]アクティビティに適用します。ただし今回は手順に1つ細かい変更を加え、ピックリストのオプションで[アクティビティ]メニューの[openinput]を選択します。これにより、オペレーターがクリーニングを終了した後に、現在のプロセッサの着信ポートが開きます。
  6. これですべての[移動]アクティビティのプロパティが編集され、正しいオペレーターに割り当てられます。[サプライクローゼットに移動]アクティビティの[クイックプロパティ]で[実行者/タスクシーケンス]ボックスの横にある矢印をクリックして、メニューを開きます。[current(インスタンス オブジェクト)]を選択します。
  7. プロセッサに移動]と2つ目の[サプライクローゼットに移動]のアクティビティについても前のステップを繰り返します。
  8. 次にすべての[移動]アクティビティのプロパティを編集し、正しい目的地に割り当てます。最初の[サプライクローゼットに移動]グループの[クイックプロパティ]で、[目的地]の横にある[サンプラー]ボタン をクリックして、サンプリングモードに入ります。
  9. 3Dモデルの[Supply Closet]オブジェクトを選択して、メニューを開きます。メニューから[サプライクローゼット]を選択します。
  10. 2つ目の[サプライクローゼットに移動]アクティビティでステップ8~9を繰り返します。
  11. プロセッサに移動]アクティビティの[クイックプロパティ]で、[目的地]ボックスをクリックし、「token.fromObject」と入力して、トークンのfromObjectラベルにリストされているオブジェクトへの動的参照を作成します(このラベルでは、目的地として現在のプロセッサを割り当てます。参考として、「チュートリアル1.1のステップ4」を参照してください)。
  12. 次に、[リソース:クリーニングサプライ]共有アセットを処理フローにリンクします。スタックブロックが選択された状態で、[クリーニングサプライを取得]アクティビティの横にある[感嘆符]アイコン をクリックしてサンプリングモードに入り、[リソース:クリーニングサプライ]共有アセットをクリックします。
  13. リソース:クリーニングサプライ]共有アセットをクリックして選択します。[タイプ]メニューをクリックし、[グローバル]を選択します。

モデルを保存することをおすすめします。

ステップ4 シミュレーションモデルを実行する

次に、シミュレーションモデルを実行して、カスタムタスクシーケンスを実際に確認します。シミュレーションモデルをリセットして実行します。

モデルを実行すると、フローアイテムのロードとアンロードに加えて、サプライクローゼットに移動してプロセッサをクリーニングする2名のオペレーターが表示されます。処理フローのトークンでは、各オペレーターが現在どの作業を行っているかを示します。

この時点で、システムの全体的なスループットを向上させるかどうかを確認するために、2組のクリーニングサプライを用意して試してみることもできます。あるいは、アイテムが5つ処理されるごとにオペレーターがプロセッサをクリーニングするだけのロジックを設計することもできます。

結論

これで、タスクシーケンスの処理フローチュートリアルは完了です。他のチュートリアルを完了して、処理フローインスタンス、サブフロー、その他の重要なトピックについてさらに理解を深めてください。