サブ処理フロー

サブ処理フローの概要

サブ処理フロー(略してサブフロー)は、異なる処理フローで別のアクティビティやイベントによってトリガーされたときに実行される別個の処理フローです。サブフローは、シミュレーションモデルまたは一般的な処理フローの特定のイベントによってトリガーされたときに実行される、自己完結型ロジックをまとめたものです。プログラミング用語に精通している場合は、サブフローを関数またはサブルーチンと同様に考えることができます。

サブフローは必要に応じて細分化し、処理フローの複数の場所に処理フローアクティビティの特定のブロックを作成できます。サブフローを使用すると、メイン処理フローの特定のアクティビティやイベントによってトリガーされる、より複雑なプロシージャを計算したり、シミュレーションを実行したりできます。サブフローで簡単な計算を実行して、プロセッサの処理時間を動的に決定できます。または、サブフローにタスクシーケンスを含めて、シミュレーションの実行中に特定のポイントで複数の異なるタスク実行者がこれを使用できます。

たとえば、ある種の組立ラインをシミュレーションするとします。アイテムが組立ラインから出てくると、アイテムの合格または不合格を決める一連の品質保証手順を経る必要があります。トークンが処理フローの特定のアクティビティに到達するとトリガーされるサブフローを使用して、これをシミュレーションできます。

サブフローの仕組み

以下のリストは、サブフローの仕組みを最初から最後まで説明したものです。

  1. シミュレーションの実行中に、サブフローをトリガーできる方法がいくつかあります。通常、サブフローは、トークンが[サブフローを実行]または[トークンを作成]アクティビティに入ったときにトリガーされます(詳細については、「サブフローを実行」または「トークンを作成」を参照してください)。
  2. 次に、[サブフローを実行]または[トークンを作成]アクティビティは、サブフローの[開始]アクティビティに1つ以上の子トークンを作成します(詳細については、「開始」アクティビティを参照してください)。子トークンは親トークンにリンクされています。親トークンは、サブフローをトリガーしたアクティビティに最初に入った元のトークンです。サブフロー内で子トークンが最初に作成されると、それは親トークンのコピーになります。つまり、親トークンからすべてのラベルとデータを引き継ぎます(詳細については、「親子ラベルのアクセスについての主要な概念」を参照してください)。
  3. 子トークンが、サブフローのアクティビティで実行を開始します。子トークンが[サブフローを実行]アクティビティによって作成された場合、子トークンがサブフローで実行されている間、親トークンは[サブフローを実行]アクティビティを待機します。注:モデルに子トークンがある場合、親トークンは破棄できません。
  4. 子トークンがサブフローの[終了]アクティビティに達すると、子トークンは破棄され、必要な情報は親トークンで更新されます(詳細については、[終了]アクティビティを参照してください)。
  5. 親トークンはリリースされ、メイン処理フローの次の下流アクティビティに移動します。注:[トークンを作成]アクティビティは、サブフローで子トークンを作成した直後にリリースされます。親トークンは、必ずしもサブフロー内の子トークンに生じる事柄に依存する必要はありません。

[トークンを作成]アクティビティと[サブフローを実行]アクティビティの比較

前のアクティビティで説明したように、サブフローは通常、トークンがメイン処理フローで[サブフローを実行]アクティビティまたは[トークンを作成]アクティビティに入るとトリガーされます。使用すべきアクティビティは、サブフローを使用する目的によって異なります。次のテーブルに示すように、これらの2つのアクティビティには2つの大きな違いがあります。

親トークンは待機する必要がありますか? 子トークンを[開始]アクティビティなどに送信しますか?
サブフローを実行 子トークンがメイン処理フローの次のアクティビティにリリースされる前にサブフローを完了するまで、親トークンを待機させる場合は、[サブフローを実行]アクティビティを使用します。 [サブフローを実行]アクティビティは、子トークンを[開始]アクティビティにのみ送信できます。
トークンを作成 親トークンで子トークンを作成し、メイン処理フロー内の次のアクティビティにただちにリリースする場合は、[トークンを作成]アクティビティを使用します。 [トークンを作成]アクティビティは、サブフロー内の任意のアクティビティにトークンを送信できます。

内部サブフローを作成する

次の画像は、シミュレーションの実行中の簡単な内部サブフローの例です。

内部サブフローは、既存の処理フロー内のサブフローです。内部サブフローは、基本的に[開始]アクティビティで始まり[終了]アクティビティで終了する、アクティビティの独立したブロックです。したがって、[開始]アクティビティで始まるアクティビティのブロックを作成すれば、内部サブフローを作成できます。アクティビティのブロックを作成したら、メイン処理フローにリンクします。詳細については、「サブフローにリンクする」を参照してください。

外部サブフローを作成する

次の画像は、シミュレーション実行中の外部サブフローの例を示しています。

外部サブフローは、最初に作成されたときにサブフロータイプを割り当てられた、別個の処理フローです。独自の別ウィンドウがあり、[ツールボックス]に別個の処理フローとして表示されます。

外部サブフローを作成するには:

  1. ツールボックスで[追加]ボタン をクリックして、メニューを開きます。
  2. 処理フロー]、[サブフロー]の順に選択します。
  3. 新しいサブフローウィンドウが表示され、アクティビティを追加できるようになります。注:サブフローは、[開始]アクティビティで始まり、[終了]アクティビティで終了するときに最もスムーズに機能します。
  4. アクティビティのブロックを作成したら、メイン処理フローにリンクします。詳細については、「サブフローにリンクする」を参照してください。

サブフローにリンクする

トークンを作成]アクティビティからサブフローにリンクする場合は、[目的地]プロパティの隣にあるサンプラーボタン を使用して、子トークンを作成するアクティビティ(サブフロー内)を選択できます。

サブフローを実行]アクティビティからサブフローにリンクするには:

  1. 最初に[サブフローを実行]アクティビティをメイン処理フローに追加すると、アクティビティの右側に感嘆符 が表示されます。このマークは、まだ[サブフローを実行]アクティビティをサブフローにリンク(必須)していないことを示します。
  2. サブフローを実行]アクティビティの右側にある感嘆符 をクリックして、サンプリングモードに入ります。マウスカーソルがサンプラーアイコン に変わるため、サンプリングモードであることを確認できます。
  3. 次に、ターゲットサブフローの開始時に[開始]アクティビティをクリックします。外部処理フローにリンクしている場合は、サブフローウィンドウ内の任意の場所をクリックしてそのサブフローにリンクできます。
  4. 目的地]プロパティが更新され、現在リンクされているサブフローが表示されます。必要に応じてこのプロパティを編集できます。

サブフローにリンクするピックリスト

固定リソースの一部のプロパティには、サブフローを開始できるメニューオプション(ピックリスト)があります。たとえば、[ポートに送信]プロパティには、サブフローを参照できるメニューオプションがあります。このサブフローを使用して、どの出力ポートがフローアイテムを受け取るべきかを決定するロジックを実装できます。

ピックリストを使用して、タスクシーケンスのサブフローを参照することもできます。たとえば、設定時間中または処理時間中にタスク実行者を使用するようプロセッサの設定を変更できます。設定、処理、または輸送中に複雑な一連のタスクを完了するためにタスク実行者が必要な場合は、処理フロー上にタスクシーケンスを作成できます。次に、プロセッサの設定、処理中、または輸送のプロパティで選択した[ProcessFlow:タスクシーケンスのサブフローを使用]を使用して、そのタスクシーケンスを開始します。

複数の開始または終了アクティビティ

[開始]アクティビティは、次の画像のサブフロー例に示すように、複数の[終了]アクティビティに接続できます。

同様に、複数の[開始]アクティビティが同一の[終了]アクティビティを共有することがあります。技術的には、各[開始]アクティビティは異なるサブフローの始まりになります。次の画像は、この種のサブフローの例を示しています。

親子ラベルについての主要な概念

このセクションを読む前に、「サブフローの仕組み」のセクションで説明した親トークン子トークンの定義を理解していることを確認してください。

サブフローを使用する利点の1つは、親トークンと子トークンのラベル間にリンクを作成できることです。シミュレーションの実行中に親トークンのラベルを更新するよう、子トークンを設定することもできます(逆も同様)。最終的に、親トークンと子トークンのラベルの間に構築する関係は、処理フローのロジックに大きな影響を与えます。そのため、メイン処理フロー上の親トークンとサブフロー上の子トークンとの論理的関係について注意深く考える必要があります。

  • 子トークンは親トークンから独立している必要がありますか、それとも依存関係を持ちますか?親トークンは、いつでもサブフローの子トークンからのデータ(ラベル)にアクセスする必要がありますか?それとも、メイン処理フローとは別に実行されるイベントの連鎖反応を開始するだけでしょうか?
  • 子トークンは親トークン上のラベルにアクセスする必要がありますか?そうであれば、どのようなアクセスですか?子トークンにアクセス権を与える、親ラベルの一意のコピーを作成する必要性が減り、データの重複を避けることができます。また、子トークンのロジックが親ラベルによって管理されている場合は、1つのラベルを変更してすべての子トークンの動作を変更できます。これにより、ロジックをより集中化させることができます。

ラベルアクセスのルールと戦略

ラベルアクセスのルールと戦略については、[トークンを作成]アクティビティの参照ページで詳しく説明しています。[次の形式で作成]および[ラベルアクセス]プロパティと、そこにリストされている後続のプロパティに特に注意してください。

トークンでの親子関係を表示する

親子関係が作成されると、親トークンはデフォルトで処理フロービューにある子の数を表示します。これらの設定は、必要に応じて[処理フローのプロパティ]ページで変更できます。詳細については、「処理フローのビジュアルを変更する」を参照してください。

ラベルを表示する

子トークンをクリックすると、クイックプロパティには、次の画像の例に示すように、子トークンが所有するすべてのラベルと、その子トークンがアクセスできる親トークンのラベルがすべて表示されます。

子ラベルにアクセスできないラベルは、このリストに表示されません。

次のテーブルで、ラベルの記号の意味を説明します。

記号 意味
(P) ラベルは親が所有しています
(PP) ラベルは親の親(祖父母)、またその先々の親が所有しています。
+ これがPの隣にあるとき、子トークンがラベルを書き込める(設定できる)ことを意味します。

たとえば、上の画像の例では、次のようになります。

  • 子のtypeラベルを設定すると、親トークンにtypeラベルが設定されます。
  • 子にweightラベルを設定すると、子にweightラベルが追加されます。子は祖父母のweightラベルにアクセスできなくなります。それを読み取ろうとしても、子が読み取られるためです。

子トークンまたは親トークンにアクセスする

親トークンにアクセスするには、プロパティフィールドに次のように入力します。

token.parent

子トークンには、親を介して、次のコマンドを使用してランクごとにアクセスできます。

token.children[1]

親が持つ子の数を得るには、次のコマンドを使用します。

token.children.length