処理フローインスタンス

処理フローインスタンスの概要

処理フローツールでは、インスタンスとはサブフロー、固定リソース処理フロー、またはタスク実行者サブフローが1つ発生することをいいます。通常、こうした種類の処理フローの1つを作成して基本テンプレートとして機能させます。オブジェクト(固定リソースやタスク実行者など)がシミュレーション実行中に処理フローを使用すると、その処理フローの別のインスタンスになります。そのため、シミュレーション実行中に同じ処理フローで複数のインスタンスが同時に実行される可能性があります。

処理フローインスタンスについて

インスタンスの概念は抽象的です。そのため何か具体的なものと比較すると効果的です。たとえば、レシピを使って調理する場合を考えます。一般処理フロー以外の処理フローの構築は、特定の食事の基本レシピを作成しているようなものです。個々のシェフが自分でレシピを作ることができます。誰かがレシピを作成するたびに、そのレシピのインスタンスが作成されることになります。同時に複数の人がレシピを使って調理している可能性もあります。しかし、彼らは皆、出発点として同じ基本レシピを使用しています。また、レシピを変更すると、そのレシピを使用するすべてのインスタンスがその時点から変更されます。

同じように、処理フローを構築するときは、シミュレーションモデル内のオブジェクトをコントロールする基本ロジックの「レシピ」を作成しています。シミュレーションの実行中、多くの異なるオブジェクトが同じ処理フローロジック(レシピ)を使用できますが、それぞれは別々のインスタンスになります。メインの処理フロー(レシピ)を変更すると、その処理フローのすべてのインスタンスも変更されます。

「タスクシーケンスチュートリアル」には、処理フローインスタンスの有用な例が含まれています。このチュートリアルでは、プロセッサからフローアイテムをロードおよびアンロードするための単純なタスクシーケンスを含むサブフローを作成します。このモデルには2つのプロセッサがあり、それぞれに独自のオペレーターがあります。両方のオペレーターは、メインの処理フローのタスクシーケンスを使用して、フローアイテムをロードおよびアンロードします。次の画像は、シミュレーションの実行中に発生する現象を示しています。

この場合、メインの処理フローがレシピとなります。両方のオペレーターによって使用される基本タスクシーケンスを含んでいるためです。一般的なプロパティがメインの処理フローで定義された方法を根拠として、サブフローでタスクシーケンスを実行する各オペレーターは、その処理フローの個別のインスタンスと見なされます。シミュレーションの実行中、メインの処理フローの各トークンは、次の画像に示すように、オペレーターの1つを表します。

次の画像は、メインの処理フローと個々のインスタンスを同時に表示している場合どのように見えるかを示しています。

メインの処理フローでタスクシーケンスを変更すると、その処理フローのすべてのインスタンスもただちに更新されます。

インスタンスを使用する理由

処理フローインスタンスの使用には2つの利点があります。

  1. インスタンス間で共有アセットを管理できる
  2. インスタンスへの動的参照を作成する

これらの各概念について、このセクションでより詳しく説明します。

インスタンス間で共有アセットを管理する

処理フローインスタンスを理解して使用する最大の理由は、インスタンス間で共有アセットを管理することにあります。共有アセットとは、処理フロー内の他のアクティビティとは異なる機能を持つ、特別なタイプの処理フローオブジェクトです。共有アセットには次の3タイプがあります。

共有アセット 説明
リソース 取得やリリースが可能な、供給に制限があるアセットを指します。商品、サービス、時間、材料、従業員などの供給をシミュレーションするために使用できます。
リスト トークン、フローアイテム、タスク実行者、数値、文字列などをリストにプッシュまたはプルできます。これは、処理フロー内で、またはより動的なリソースとして、複数のトークンを同期するのに便利です。処理フローは処理フロー自体にローカルなリストを使用できます。または、シミュレーションモデルのグローバルリストに紐付けすることもできます。
ゾーン 標準的なアクティビティでは利用できない統計情報を収集できます。また、特定の統計や他の基準に基づいて、処理フローのセクションへのアクセスを制限することもできます。

処理フローに複数のインスタンスを含めることができる場合は、その処理フローのインスタンス間で共有アセットをどのように分散させるかを決定できます。たとえば、カウントが3のリソースを使用するサブフローを作成するとします。リソースは、次の2つの方法のいずれかで管理できます。

  • グローバル - 共有アセットはすべてのインスタンスからグローバルにアクセスできます。たとえば、カウントが3のリソースがある場合、そのリソースを使用するインスタンスによって、合計カウントが消費されます。1つのインスタンスが3つのリソースをすべて使用すると、別のインスタンスはリソースを使用できなくなります。
  • ローカル - 共有アセットはローカルでのみインスタンスからアクセスできます。たとえば、カウントが3のリソースがある場合、各インスタンスがカウント3のそのリソースのローカルコピーを持つことになります。インスタンスがリソースを使用する場合、ローカルカウントのみが消費されます。1つのインスタンスが3つのリソースをすべて使用しても、別のインスタンスは3つのリソースにアクセスできます。

これらの設定は、処理フローに追加する各共有アセットで変更できます。各共有アセットの[クイックプロパティ]に[タイプ]メニューがあります。このメニューを使用して、共有アセットがインスタンスに対してグローバルであるか、ローカルであるかをコントロールできます。この設定は、処理フロータイプが一般でない場合にのみ使用可能であることに注意してください。一般処理フローでは常にインスタンスが1つしかないため、共有アセットへのアクセスは常にグローバルです。

インスタンスを参照する

処理フローインスタンスを使用するもう1つの利点は、インスタンスに関連付けられたオブジェクトを簡単に参照できることです。処理フローインスタンスを使用する場合、currentキーワードを使用することでトークンのインスタンスオブジェクトを参照できます。技術的には、これは重要な機能ではありません。インスタンスオブジェクトとして使用できるオブジェクトを指し示すラベルを、トークンに常時格納できるためです。とはいえ、currentを使用した方がより直感的です。

インスタンスのクラスタイプ

ピックリストおよびコードエディタ内のcurrentを参照する場合、インスタンス化された処理フローはデフォルトでオブジェクトクラスタイプとなります。これによって、オブジェクトクラスのメソッドやプロパティへ簡単にアクセスできます。インスタンス化された処理フローのオブジェクトクラスは、クイックプロパティで変更します。オブジェクトクラスを、ディスパッチャーやTaskExecuterなど異なるクラスタイプに変更すると、処理フロー全体のコードヘッダーがすべて更新されて、新しいオブジェクトクラスのメソッドとプロパティにアクセスできるようになります。利用可能なクラスの一覧については、「FlexScriptクラスリファレンス」を参照してください。

インスタンスに関連するプロパティ

インスタンスに影響を与えるプロパティは、処理フローのタイプによって異なります。

  • 一般]処理フロータイプは、複数のインスタンスを持つことはできません。
  • 固定リソース]処理フロータイプを実行する各固定リソースは、その処理フローの別のインスタンスになります。
  • タスク実行者]処理フロータイプにアタッチされている各タスク実行者は、その処理フローの別のインスタンスになります。
  • サブフロー]処理フロータイプには[インスタンス作成]と呼ばれる特別なプロパティがあり、FlexSimシステムがサブフローのインスタンスを作成する時期を定義できます。これは、ローカル共有アセットの使用方法に影響する可能性があります。

詳細については、「処理フローのタイプ」を参照してください。

さらに、共有アセットオブジェクト(リソース、リスト、ゾーン)の[タイプ]メニューを使用して、これらのアセットがインスタンスに対してグローバルかローカルかを決定できます。

インスタンスを表示する

処理フローのインスタンスを表示するには、次のようにします。

  1. 処理フローの空白部分をクリックして、何も選択されていないことを確認します。
  2. [クイックプロパティ]で、[添付オブジェクト(インスタンス)]グループを検索します。ここには、次の画像に示すように、処理フローにアタッチされているオブジェクトが一覧表示されます。
  3. リスト内のいずれかのオブジェクトをクリックして選択します。次に[処理フロービューを開く]ボタンをクリックして、その特定のインスタンスの処理フロービューを開きます。このビューには、そのインスタンスに関連付けられたトークンのみが表示されます。