ラベルについての主要な概念
ラベルとは
ラベルは、モデルのロジックを構築するための重要な要素です。まず最も基本的なこととして、ラベルとはフローアイテム、トークン、または3Dオブジェクトに関する情報を格納する手段です。ラベルはFlexSimの機能全体にとって非常に重要です。ラベルを使用することで、重要な情報を追跡したり、シミュレーションモデルのさまざまな条件に基づき、シミュレーション中に発生するものを動的に変更したりできるからです。
すべてのラベルに次の3つの要素があります。
- 所有者 - ラベルはすべて、ある特定のフローアイテム、トークン、または3Dオブジェクトに属します。シミュレーション実行中にラベルを参照するには、そのラベルを所有するアイテム、トークン、またはオブジェクトがどれなのか確認しておく必要があります。
- 名前 - すべてのラベルに、そこに含まれる情報の種類を表す名前が付けられます。このラベル名を使用してラベルを参照し、ラベルから情報を取得します。ラベル名は、ラベルが最初に作成されたときに割り当てられ、シミュレーションの実行中に変更されることはありません。FlexSimが特定のラベルに対してデフォルトのラベル名を提案することがありますが、最終的にラベル名を決めるのはユーザーです。
- 値 - すべてのラベルに、ラベルの所有者に関する情報が含まれます。ラベルはアイテムやトークンごとにさまざまなものがあります。値のデータタイプは、テキスト、数値、他のオブジェクトへの参照、配列など、あらゆるものがあります。ラベルの値は、シミュレーション実行中に変更されることがあります。
たとえば、フローアイテムがシミュレーションモデルを移動する際に、そのフローアイテムの重量を追跡するとします。ラベルを使用すれば、シミュレーション実行中にこの情報を追跡できます。シミュレーションモデルで最初にフローアイテムが作成されたときに、すべてのフローアイテムに「Weight」という名前のラベルを割り当てるとします。このラベルを最初に作成する際、ラベルに10から30までの乱数を割り当てます。この場合、ラベルの所有者はフローアイテムです。ラベルの名前は「Weight」で、ラベルの値は10から30の間の数値になります。
このフローアイテムがシミュレーションモデル内のさまざまな処理を通過する際、このラベルの値は変更される可能性があります。たとえば、ある特定の処理を通過後に、そのアイテムの重量が5だけ減少するとします。アイテムがその処理を終了すると、プロセスはアイテムのWeightラベルの値を更新します。その場合、新しい重量を表すように、元の値から5を引いた値が新たにつけられます。
シミュレーションモデルにおけるラベルの基本的な6つの使用法
ラベルはさまざまな用途で使用されますが、よく使われる用途について以下のセクションで説明します。
並べ替えと条件付きルーティング
フローアイテムが3Dモデル内を移動する際、ラベルの値に基づいてフローアイテムを異なる下流オブジェクトにルーティングできます。たとえば、1から5までの値を持つ「ProductType」という名前のラベルが付いたフローアイテムがあるとします。キューは、ラベルの値に基づいてアイテムを5つの別個のプロセッサにプッシュします。同様に、プロセッサは、フローアイテムでアイテムの重量を追跡するラベルの数値が特定の範囲内かどうかに基づいて、アイテムをリストから引き出すことができます。
処理フローでのラベルの仕組みについても同じことが当てはまります。例:
- トークンが処理フローのアクティビティを移動する際、[決定]アクティビティがラベルを使用して、トークンを受け取る下流アクティビティを判別できます。
- バッチアクティビティと調整アクティビティは、ラベルに基づいてトークンをグループ化してパーティションにできます。
- ゾーンはトークンを評価して、ラベル値がその基準に一致するかどうかに基づいてトークンがゾーンに入ることができるかを判断できます。
オブジェクトまたはトークンの変更を表す
ラベルは、シミュレーションの実行中に追跡するオブジェクトの現在のステータス、物理的プロパティ、またはその他の特性を表すことができます。たとえば、フローアイテムが作業ステーションで処理された後、処理後にフローアイテムで発生した変更を反映させるため、そのラベルの値を1つ以上更新できます。たとえば、ビン詰めステーションをシミュレートしているとします。「Status」という名前のラベルが付いたフローアイテムの値は、さまざまに処理されて、「空」から「充填」、「蓋閉め」に変更されます。
ラベルは、必要に応じて、3Dモデル内の固定リソースまたはタスク実行者に割り当てることもできます。たとえば、オペレーターが休憩中かどうか(その結果、タスクでの作業ができないか)を追跡するラベルをオペレーターに割り当てられるのです。
トークンを3Dオブジェクトまたは他のトークンにリンクする
ラベルの最も重要な目的の1つは、処理フロー内のトークンを3Dモデル内のオブジェクト(フローアイテム、タスク実行者、固定リソースなど)にリンクすることです。処理フローは、モデルの3Dオブジェクトへの参照を含むラベルを使用して、3Dモデルのロジックをコントロールできます。トークンが処理フローのアクティビティを移動すると、アクティビティのロジックを3Dモデルのオブジェクトに適用できます。
たとえば、トークンを、フローアイテムへの参照を含む「MyItem」という名前のラベルを通して3Dモデル内のフローアイテムにリンクするとします。トークンが処理フローを移動するときに、フローアイテムのサイズまたは色を変更する[ビジュアルを変更]アクティビティに入るとします。[ビジュアルを変更]を設定してMyItemラベルの値を読み取り、そのラベルで参照されるフローアイテムにビジュアルの変更を適用します。詳細については、「オブジェクト参照を格納する」を参照してください。
フィルタリングと制限
並べ替えと同様に、ラベルを使用してフローアイテムやトークンをフィルタリングして制限をかけることができます。たとえば、最大積載量5トンのダンプトラックのシミュレーションを行うとします。処理フローの3Dモデルまたはトークン内の各フローアイテムは、ダンプトラックに積載されるさまざまな量の廃棄物を表します。この種のシステムのシミュレーションを行うには、処理フローでダンプトラックを表すゾーンを作成し、「Weight」というカスタムラベルを各トークンに割り当てます。各トークンがダンプトラック(ゾーン)に入ろうとすると、ゾーンはそのトークンのWeightラベルの値を評価して、ダンプトラックが重量制限を超えるかどうか判断します。重量が制限を超えることになる場合は、そのトークンはゾーンに入ることを許可されません。
条件付き意思決定
ラベルを使用すると、条件の変更によりシミュレーションシステムがどのように影響を受けるかをシミュレーションモデルで調べることができます。たとえば、食品雑貨店でレジ待ちの列のシミュレーションを行うとし、各トークンがそのレジを通る顧客を表しているとします。各顧客は任意の数のアイテムを持っています。店員が各アイテムをスキャンしてレジ袋に入れるのに約5秒かかります。したがって、レジ待ちの列で顧客が費やす合計時間は、顧客が持つアイテムの数掛ける5秒になります。処理フローでこの種のシステムのシミュレーションを行うには、[遅延]アクティビティを作成し、「NumberOfItems」というカスタムラベルを各トークンに割り当てます。[遅延]アクティビティがトークンを受け取ると、トークンの「NumberOfItems」ラベルを評価し、その値に5を掛けてそのトークンの遅延時間を判断します。
モデルからデータを取得する
モデルで統計を追跡するために、ラベルは特に重要です。たとえば、フローアイテムに「Cost」というラベルを付けて、特定のフローアイテムがシミュレーションモデル内を移動するときにかかるコストを計算できます。あるいは、品質保証テストに合格しなかったアイテムの数を、「QualityAssurance」というラベルに「合格」または「不合格」の値を持たせて追跡するとします。FlexSimは、「不合格」値に対して「合格」値を持つアイテムの数を追跡できます。
ラベルの仕組み
FlexSimではさまざまな状況でラベルへの参照が見られます。通常、ラベルへの参照は、処理フローツールなど、FlexSimのロジックをコントロールするさまざまなツールのプロパティで使用します。ラベル参照が表示されたときにその意味が理解できると便利です。
次にラベル参照の例をいくつか示します。
item.ProductType
item.Destination
token.Weight
token.puller
current.MyOperator
これらのラベル参照の構文を解釈するときは、前のセクションで学んだように、すべてのラベルが所有者、名前、値の3つのコンポーネントを持つことを思い出してください。ラベル参照は、このうち2つのコンポーネントを使用します。ラベル参照の最初の部分(ドットの前)はラベルの所有者です。ラベル参照の2つ目の部分は、次のラベルの名前です。owner.labelName
論理的な観点から、FlexSimはシミュレーション実行中にそのラベルを読み取ると、ラベル参照の場所をラベルの値で置き換えます。たとえば、「Weight」というトークンのラベルがあり、10から30までのランダムな値を持つとします。そのトークンの処理に要する時間は、オブジェクトの重量で決まり、重量単位ごとに処理が5秒かかるとします。token.Weight * 5
という式を使用してこのトークンを表現できます。
これで、処理フローの[遅延]アクティビティの遅延時間プロパティでこの式を使用して、処理時間のシミュレーションを行うことができます。
たとえば、ある特定のトークンのWeightラベルの値が19だった場合、その遅延時間は95(19に5を掛けた値)になります。
ここでラベルとは、アイテム、トークン、オブジェクトごとで変わる可能性のある値のプレースホルダーであることを思い出してください。ラベルへの参照が表示されると、FlexSimはシミュレーション実行中にその場所をそのラベルの値に置き換えます。
データタイプ
次の表に、FlexSimで使用できるさまざまなデータタイプを示します。
データタイプ | 説明 |
---|---|
数字 | 整数または浮動小数点などの数値。 |
文字列 | あらゆる種類のテキスト。文字列の値は必ず引用符(" ")で囲みます。 |
ポインター | 他のノードまたはオブジェクトへの参照。値はノードまたはオブジェクトへのパスで、紫色で表示されます。 |
配列 | リストやテーブルの値と同様に、複数の値を格納します。配列の値には、数値、文字列、ポインター、配列など、どのデータタイプでも使用できます。配列の値のデータタイプは必ずしもすべて同じである必要はありません。 |
FlexScript式 | 評価可能なFlexScriptコード。 |
バンドル | 数字と文字列を格納するデータテーブル。 |
追跡変数 | 統計収集に使用されます。 |
テーブル | FlexScriptの上級ユーザーであれば、データの行と列があるテーブルをラベル内に作成できます。 |
NULL | NULL値にはデータタイプがなく、データもありません。 |
ラベル操作のベストプラクティス
以下のセクションでは、FlexSimでラベルを操作する際の一般的なガイドラインを示します。
ラベルの方針を計画する
複雑なシミュレーションモデルでは、さまざまなラベルが使用される可能性が高く、シミュレーションでラベルがどのように機能するか熟慮することが重要です。アイテム、トークン、または3Dオブジェクトにラベルを使用する場合は、次のような質問について考えてみてください。
- このラベルが表すものは何ですか?
- アイテム、トークン、またはオブジェクトにラベルをどのように追加しますか?
- 最初にラベルを追加するときのラベルの初期値は何にしますか?
- 下流のオブジェクトやアクティビティはこのラベルをどのように使用しますか?
- 下流のオブジェクトやアクティビティは、このラベルの値を変更する必要がありますか?必要がある場合は、その理由は何で、変更方法はどうしますか?
ラベルの方針をワープロ文書に書き留めておくと良いでしょう。その文書に、使用しているラベルの名前、ラベルの目的、シミュレーションモデルでの一般的な使用を記載します。
直観的で説明的なラベル名を使用する
ラベル名を決めるのはユーザーに任されますが、そのラベルが表すものやシミュレーションモデルでの機能を説明する名前を付ける方が良いでしょう。ラベル名を簡潔にしすぎると直感的に理解しにくくなります。あまり簡潔にしないようにしてください。
ラベル名にスペースの代わりにキャメルケースを使用する
FlexSimでは、ラベルの名付けに関する制限は正式には設けていません。技術的には必要に応じてラベル名にスペースを使用できます。しかし、FlexScriptを使用する際、スペースが含まれる名前のラベルは参照が非常に難しくなるため、この方法はお勧めしません。
たとえば、「myLabel」というラベルの付いたトークンがあるとします。FlexScriptでその値を設定するには、次の式を使用します。
token.myLabel = 3;
ところが、「My Label」というラベルを使用した場合は、次のように式に角括弧や引用符などの要素をさらに加えなければなりません。
token.label["My Label"].value = 3;
明らかに、スペースの使用を避ける方が簡単です。ベストプラクティスとして、スペースの代わりにキャメルケースを使用すると良いでしょう。キャメルケースとは、一般に複数の単語が結合されていることを示すために、先頭でない単語に大文字を使用することです。たとえば、これらのラベルはキャメルケース、MyLabelとlabelNameを使用しています。
提案されたデフォルトのラベル名の使用を避ける
FlexSimには、トークンまたはアイテムにラベルを自動で生成する処理フローアクティビティや3Dオブジェクトのピックリストがいくつかあります。これらのアクティビティまたはピックリストを使用すると、FlexSimは通常、デフォルトのラベル名を提案します。たとえば、処理フローアクティビティがリストから何かを引き出すと、リストから引き出されたオブジェクトやトークンへの参照を格納する、デフォルト名の「pulled」が付けられたラベルを作成します。デフォルト名ではなく、より直感的で覚えやすい名前をラベルに付ける方が良いでしょう。
デフォルトのラベル名を使用しても問題はありませんが、FlexSimの上級ユーザーは、デフォルトのラベル名をユーザー独自の名前に置き換えることを推奨しています。作成したラベルの方がより直感的にわかりやすくなるだけでなく、シミュレーションモデルでのラベルの割り当てや使用方法に対して、より慎重かつ戦略的になることができます。FlexSim全般において、ラベルがどのように論理的に機能するのか理解を深めることができます。
ラベル名の先頭を大文字にする
デフォルト名はほとんどが小文字で始まるため、カスタムラベルとデフォルトのラベルを区別する方法の1つとして、大文字で始めることがあります。また、FlexSimがラベル名の検索をする場合(オートコンプリートを使用するなどして)、大文字はアルファベット順で先になるように扱われます。
ラベルのテストと検証を行う
ラベルの管理を誤ると、シミュレーションモデルのロジックに多くの問題を引き起こすことがあります。そのため、期待どおりにラベルが機能するように、ラベルをテストして検証することをお勧めします。ラベルを使用する基本的な処理フローを作成したら、1つのトークンが処理フローを移動するのを追跡し、適切なタイミングで適切な値がラベルに割り当てられていることを確認してください。また、ラベルに依存する条件が正しく機能しているかチェックすることもお勧めします。
オブジェクト参照を格納する
ラベルは、他のオブジェクトへの参照を格納するために使用できます。そうすることで、トークンをフローアイテムまたは他のトークンと接続できるのです。たとえば、処理フローを使用してキューのフローアイテムの色を変更するとします。次のようなモデルを作ります。
フローアイテムがキューに入るたびに、ソースアクティビティ(イベントでトリガーされたソース)がトークンを作成します。しかし、新しいトークンをフローアイテムにどのように結び付ければ良いでしょうか。これはラベルを用いると簡単に行うことができます。ソースのクイックプロパティは次のとおりです。
イベントの入るアイテムが「アイテム」という名前の新しいトークンのラベルに割り当てられていることに注目してください。つまり、token.item
はフローアイテムを返すことになります。
オブジェクト参照はtreenode
なので、ノードをとる関数はどれでも呼び出すことができます。以下に例をいくつか示します。
// get the name of the item
string name = token.item.name
// determine if the object still exists
int exists = objectexists(token.item);
// get the containing object
Object container = token.item.up;
// ...
// ...
モデル例に戻って、[ビジュアルを変更]アクティビティの[オブジェクトの色を設定]ポップアップに次の値を入力します。
モデルを実行すると、その効果を確認できます。次の画像では、適切なフローアイテムを参照する両方のトークンのアイテムラベルを黒い矢印で示しています。
複数のラベルの呼び出し
場合によっては、あるトークンに別のトークンを参照するラベルがあり、その別のトークンに別のオブジェクトを参照するラベルがある、といった場合があります。例:
token.item.operator
フィールドにこれを手動で入力できます。あるいは、これらのネストされたオブジェクト参照を参照しやすくするサンプラー ボタンが各プロパティフィールドにあります。次の画像では、トークンがアクティビティ内にあるポイントまでモデルが実行されています。その後モデルが停止し、アクティビティのプロパティウィンドウが開きます。サンプラーボタンのどれか1つをクリックし、トークンをクリックすると、そのトークンに格納されている有効なラベルがすべて表示されます。
このような方法でのサンプリングは、モデルを構築する際に非常に役立ちます。このような参照が必要な場合は、適切なラベルが付いたトークンが表示されるまでモデルを実行するだけです。その後モデルを停止し、トークンをサンプリングします。