ストレージシステム

概要と主要な概念

[ストレージシステム]ツールは、モデル内のすべてのStorage.Objectのグローバルな設定と機能を提供します。

このツールは、すべてのストレージオブジェクト全体ですべてのスロットを照合することができます。この機能を使用すれば、インバウンド在庫用のストレージで適切な場所を見つけることができます。また、このツールは、すべてのストレージオブジェクト全体ですべてのStorage.Itemを照合することもできます。この機能を使用すれば、アウトバウンド在庫用のストレージからプルする適切なアイテムを見つけることができます。このツールは、このような照合を最適化するように構成できます。

また、このツールを使用すれば、モデルのアドレス方式を1つ以上指定することもできます。ほとんどの倉庫管理システム(WMS)がアドレスを使用してアイテムの場所を記録します。このアドレスは、スロットを一意に識別する数字、英字、およびセパレータの組み合わせです。ストレージシステム上のアドレス方式を使用して、シミュレーションモデルで使用する外部WMSからスロットアドレスを読み取ることができます。

このツールは、ストレージオブジェクトのタイプごとの外観も指定します。オブジェクトの外観は、サーフェスを追加または削除したり、サーフェスごとにテクスチャと色を設定したりすることによってカスタマイズすることができます。また、各スロットに関する情報を視覚的に表示することもできます。たとえば、スロットのラベル値によって色が異なる正方形を表示することができます。

このツールにはイベントも含まれています。アイテムがスロットに入ったとき、スロットから出たとき、またはスロットに割り当てられたときのスロットのイベントをリッスンすることができます。

FlexScriptでは、Storage.systemを使用してこのツールにアクセスできます。

Storage.ItemとStorage.Slot.Item

ストレージシステム内のフローアイテムと連動する2つのクラスがあります。そのうちの1つがStorage.Itemです。このクラスは、Storage.Itemコンストラクターで使用できます。

Object item; // a flowitem reference
Storage.Item storageItem = Storage.Item(item);

上のコードは、特定のフローアイテムのStorage.Itemデータをアサートします。Storage.Itemオブジェクトは、フローアイテムのストレージシステムのレコードです。アイテムをスロットに割り当てるには、assignedSlotプロパティを必要なスロットに設定します。

Slot slot; // a slot reference;
storageItem.assignedSlot = slot;

フローアイテムあたり複数のStorage.Itemが存在することはありません。フローアイテムが破棄または仮想化された場合は、Storage.Itemオブジェクトも破棄されます。

スロットを割り当ててから、そのスロットを含むストレージオブジェクトにフローアイテムを移動すると、フローアイテムが正しいスロットに配置されます。

2つ目のフローアイテムベースのクラスがStorage.Slot.Itemです。このクラスは、特定のスロットからアクセスされます。

Slot slot; // a slot reference
Storage.Slot.Item slotItem = slot.slotItems[1];

Storage.Itemをスロットに割り当てると、そのスロットでStorage.Slot.Itemオブジェクトが作成されます。スロットごとに、そのスロットに割り当てられたまたは現在スロット内に存在するアイテム(slotItemsを介してアクセス)のリストが維持されます。ストレージシステムのメソッドであるfindItem()queryItems()は、各スロットのStorage.Slot.Itemオブジェクトのリストを検索します。フローアイテムを仮想化すると、Storage.Slot.Itemオブジェクトが残ります。

スロットの検索

スロットにラベルを付けることができます。たとえば、各スロットにSKUラベルを付加して、そのスロットに保存可能なSKUを示すことができます。そうすれば、次のようなコードを作成して、アイテムのSKUラベルに基づいてアイテムのスロットを探すことができます。

Storage.Slot slot = Storage.system.findSlot(
	"WHERE SKU = $1.SKU AND slot.hasSpace($1)", 0, item
);

その後で、ifステートメントを使用してクエリが成功したかどうかをチェックすることができます。

if (slot) { 
	// Assign the item to the slot, so that slot.hasSpace() will
	// account for this item in future searches.
	storageItem.assignedSlot = slot; 
}

このようなケースでは、スロット上のSKUラベルにインデックスを付けることができます。ラベル(SKUラベルなど)にインデックスを付ける場合は、findSlot()メソッドで実行するクエリでシステム内のすべてのスロットを検索する必要がなく、検索をラベルが一致するスロットに限定できます。インデックスが付けられたスロットラベルを変更すると、インデックスが自動的に更新されます。

アイテムの検索

ストレージからアイテムを取得したいときに、特定のアイテムを取得するのではなく、特定の属性を持つアイテムを取得する方が望ましい場合があります。たとえば、在庫内のアイテムにSKUラベルが付けられている場合は、そのSKUに基づいてアイテムを検索できます。

Storage.Slot.Item slotItem = Storage.system.findItem(
	"WHERE Type = $1", 0, 2
);

その後で、ifステートメントを使用してクエリが成功したかどうかをチェックすることができます。

if (slotItem) {
	// Unassign the assignedSlot to make it "outbound".
	// Outbound items are excluded by default when using findItem().
	slotItem.storageItem.assignedSlot = 0;
}

このようなケースでは、アイテム上のSKUラベルにインデックスを付けることができます。アイテムラベルにインデックスを付ける場合は、findItem()メソッドで実行するクエリでシステム内のすべてのアイテムを検索する必要がなく、検索をラベルが一致するアイテムに限定できます。

仮想アイテム

在庫内のフローアイテムの数が多い(10,000アイテム以上)モデルの場合は、メモリ使用率と描画速度の両方が問題になる可能性があります。このような場合は、アイテムの仮想化を選択できます。これは、アイテムがストレージオブジェクトに入ると、そのアイテム自体が破棄されることを意味します。ストレージシステムは、アイテムに関する必須のラベル値とビジュアルプロパティを保持します。この情報は、そのアイテムのStorage.Slot.Itemオブジェクト上で保持されます。仮想アイテムにアクセスしようとすると、すぐにそのアイテムが仮想化解除されます。これは、フローアイテムが保存されているラベル値とビジュアルプロパティで作り直されることを意味します。

最低限の情報しか保持されないため、アイテムの仮想化は大幅なメモリ節約につながる可能性があります。加えて、仮想アイテムの描画速度が大幅に向上する可能性もあります。欠点はフローアイテムが破棄されることで、これにより、一部のモデルの作成が困難になります。

アドレス方式

ウェアハウジングでは、アドレスはスロットを一意的に識別するテキストです。一般的な例として、次のアドレスを考えてみましょう。

"3-5-07052", "1-1-05061"

アドレス方式を使用すると、ストレージシステムにこれらの文字列の解釈方法を伝え、正しいスロットを取得できます。この例では、次のコンポーネントを指定します。

  • 数字。これはスロットのゾーンです。
  • ハイフン。これは残りのアドレスからゾーンを分離します。
  • 数字。これはスロットの通路です。
  • ハイフン。これは残りのアドレスから通路番号を分離します。
  • 2桁の数字。これはベイ番号です。
  • 2桁の数字。これはレベル番号です。
  • 1桁の数字。これはスロット番号です。
最初のアドレスは、ゾーン1、通路5、ベイ7、レベル5、スロット2のスロットを示しています。

アドレス方式を定義したら、getSlot()メソッドを使用してアドレスに基づいてモデル内のスロットを検索できます。

Storage.Slot slot = Storage.system.getSlot("3-5-07052");

特定のスロットのアドレスにアクセスすることもできます。

string addr = slot.address;

複数のアドレス方式を定義できます。ストレージシステムは、入力値と一致する最初の方式を使用してアドレスを解決します。

イベント

イベントの詳細については、「イベントリスニング」ページを参照してください。

ストレージシステムオブジェクトには、次のイベントがあります。

スロットエントリ時

このイベントは、アイテムがストレージオブジェクト内のスロットに入ったときに発生します。このイベントが発生すると、スロットエントリ時トリガーが実行されます。ここでは、FlexScriptまたは事前に設定されたピックオプションを使用してカスタムロジックを実行できます。

次のパラメータがあります。

イベントパラメータ タイプ 説明
スロット Storage.Slot フローアイテムが入ったスロット。
アイテム オブジェクト スロットに入ったフローアイテム。

スロット終了時

このイベントは、アイテムがストレージオブジェクト内のスロットから出たときに発生します。このイベントが発生すると、スロット終了時トリガーが実行されます。ここでは、FlexScriptまたは事前に設定されたピックオプションを使用してカスタムロジックを実行できます。

次のパラメータがあります。

イベントパラメータ タイプ 説明
スロット Storage.Slot フローアイテムが出たスロット。
アイテム オブジェクト スロットから出たフローアイテム。

スロット割り当て時

このイベントは、アイテムがストレージオブジェクト内のスロットに割り当てられたときに発生します。このイベントが発生すると、スロット終了時トリガーが実行されます。ここでは、FlexScriptまたは事前に設定されたピックオプションを使用してカスタムロジックを実行できます。

次のパラメータがあります。

イベントパラメータ タイプ 説明
スロット Storage.Slot フローアイテムが割り当てられたスロット。
アイテム オブジェクト スロットに割り当てられたフローアイテム。

[スロットラベル]タブ

[スロットラベル]タブには、次のプロパティがあります。

[ラベル]リスト

ラベルを[スロットラベル]リストに追加できます。このリストは、FlexScriptとクエリのどちらかでスロットラベルを読み書きするときに参照されます。

スロットのラベルを読み取ると、スロットはまずそれ自体のタイプラベルをチェックします。タイプラベルが存在する場合は、そのラベルの値を返します。タイプラベルが存在しない場合は、ストレージオブジェクト上の[スロットラベル]リストをチェックします。タイプラベルがそこに含まれていた場合は、そのラベルのデフォルト値が返されます。そうでない場合は、存在しないラベルを読み取ろうとしたことで例外が発生します。これは、クエリを含むスロット上のラベルアクセスに該当します。

スロットラベル値の書き込みは、動的ラベルを使用した他のオブジェクトとほぼ同じ振る舞いをします。ラベルが存在しない場合は、それがスロットに追加されます。その後、ラベルに新しい値が設定されます。ただし、スロットは[スロットラベル]リストをチェックして、ラベルにインデックスが付けられているかどうかも確認します。付けられていた場合は、ストレージシステムがすぐにそのラベルのインデックスを更新します。

ラベルにインデックスを付けるということは、すべてのスロットを検索しなくてもそのラベルを使用してクエリで絞り込むことができることを意味します。この場合は、パフォーマンスが大幅に向上する可能性があります。たとえば、SKUラベルを使用してスロットを絞り込む場合は、そのラベルをリストに追加し、それをインデックス付きとしてマークします。そうすれば、次のクエリのパフォーマンスが向上します。

Storage.system.findSlot("WHERE SKU = $1.SKU", 0, item);

インデックスの恩恵を受けるクエリの詳細については、「SQLクエリ」のトピックを参照してください。

[ラベル]リスト内の各エントリには、次のプロパティがあります。

  • ラベル名 - [ラベル]リストに追加するラベルの名前を指定します。
  • カラーパレット - スロットペインターとラベル色ベースのビジュアル化で使用するカラーパレットを指定します。
  • インデックス付き - このボックスは順序なしインデックスでラベルにインデックスを付ける場合にオンにします。
  • デフォルト値 - スロットにこのラベルが付けられていない場合のデフォルト値を指定します。

[ビジュアル化]タブ

[ビジュアル化]タブには、次のプロパティがあります。

[ビジュアル化]エリア

[ビジュアル化]エリアを使用して、ビジュアル化の名前変更、追加、複製、削除、または並べ替えを行うことができます。今すぐ編集したいビジュアル化を選択することもできます。ビジュアル化は、特定のストレージオブジェクトの描画方法のすべての側面を定義します。ストレージオブジェクトごとに1つずつのビジュアル化を使用すると正しく表示されます。

[描画要素]エリア

[描画要素]エリアを使用すれば、特定のビジュアル化で使用される描画要素のそれぞれに関する詳細を編集することができます。次のプロパティがあります。

  • [描画要素]リスト - このリストには、現在のビジュアル化のすべての要素が表示されます。このリストを使用して、リスト内のビジュアル化要素の追加、複製、削除、および並べ替えを行うことができます。
  • 要素名 - このフィールドを使用して、選択された描画要素の名前を指定します。
  • 描画先 - この2つのフィールドを使用して、要素の座標系の範囲と要素が属している面を指定します。
  • アラインメント - この2つのフィールドを使用して、描画要素の座標系の原点を指定します。
  • X位置/幅 - 特定のアラインメントに対して、要素の開始X位置と要素の幅を指定できます。
  • Y位置/高さ - 特定のアラインメントに対して、要素の開始Y位置と要素の高さを指定できます。
  • 左/右 - 特定のアラインメントに対して、左側と右側の位置を指定できます。
  • 上/下 - 特定のアラインメントに対して、要素の上側と下側の位置を指定できます。
  • Z - 要素の座標系に対する描画要素のZ位置を指定します。
  • ラベル参照 - この描画要素を参照するスロットラベルを指定します。
  • - 要素に色を付ける方法を指定します。
  • スロットフィルタ - スロットで特定の要素を描画するかどうかを決定します。要素が複数のスロットからなる何かに描画される場合は、この関数が要素内のすべてのスロットに対して評価されます。関数がすべてのスロットに対して真を返した場合に、要素が描画されます。
  • 形状の繰り返し - 要素の繰り返しを指定します。[タイプ]が[拡大して表示]の場合は、この値によって表示される画像のインスタンスの数が指定されます。[タイプ]が[タイル]の場合は、この値によってモデル単位内のインスタンス間の距離が指定されます。[タイプ]が[タイル]で、[全体表示]がオンになっている場合は、この値がインスタンス間の最短距離になります。
  • タイプ - テクスチャの繰り返しに使用するメソッドを指定します。使用可能なオプションは[拡大して表示]または[タイル]です。
  • - 繰り返す軸を指定します。
  • 全体表示 - ページに合わせて拡大する場合にこのボックスをオンにします。これにより、インスタンス間の最短距離を維持しながら、できるだけ多くのインスタンスが面に沿って均等に配置されます。

画像や色を扱う描画要素の場合は、xとyの両方向に関する次のプロパティも存在します。

  • 画像タイプ - 画像が静的か動的かを指定します。[静止画像]を選択した場合は、画像へのパスも指定する必要があります。[動画像]を選択した場合は、スロットに基づいて画像を返すコードを指定する必要があります。
  • コーナー位置 - 画像に使用する矩形の座標を指定できます。このように、1つの画像を複数の描画要素に使用できます。これらの座標内に表示された画像の一部だけが描画要素に表示されます。
  • 繰り返しタイプ - 繰り返しのタイプを選択します。使用可能なオプションは[拡大して表示]または[タイル]です。
  • 繰り返し - [繰り返しタイプ]が[拡大して表示]の場合は、この値によって画像に適用される倍率が指定されます。[繰り返しタイプ]が[タイル]の場合は、この値によって、繰り返す前にテクスチャを表示する距離(モデル単位)が指定されます。
  • 繰り返しオフセット - 繰り返しのオフセットを選択します。
  • リセット - 画像全体を含めるためにテクスチャ座標をリセットする場合にこのボタンをクリックします。
  • 回転 - 指定された角度だけ画像のキャプチャーエリアを回転させる場合にこのボタンをクリックします。

テキストを扱う描画要素の場合は、次のプロパティも存在します。

  • 描画テキスト - 描画するテキストを指定します。
  • 両端揃え - テキストを左に揃えるか、中央に揃えるか、右に揃えるかを指定します。
  • アラインメント - テキストを上に揃えるか、中央に揃えるか、下に揃えるかを指定します。
  • ワードラップ - テキストを折り返すかどうかを指定します。
  • テキストスケール - 要素の高さに対するテキストの高さを指定します。
  • ファイルにスケール - テキストが水平方向にいっぱいになるまでテキストを垂直にスケールする場合にこのボックスをオンにします。

ワイヤフレームを扱う描画要素の場合は、次のプロパティも存在します。

  • 線幅 - ワイヤフレームの線を描画する幅(ピクセル単位)を指定します。

他のビジュアル化を参照する描画要素の場合は、次のプロパティも存在します。

    • ビジュアル化 - 現在のビジュアル化の一部として含める別のビジュアル化を指定します。

[アイテム]タブ

[アイテム]タブには、次のプロパティがあります。

アイテムを自動的に仮想化

このボックスをオンにすると、アイテムを仮想化できます。これは、アイテムがスロット内に配置されている場合は、破棄されることを意味します。ストレージシステムは、空間や色などのそのアイテムに関する最低限の情報を保持します。こうして、アイテムが描画されます。加えて、[アイテムラベル]リストに表示されたラベルも保持されます。後でアイテムにアクセスする必要が生じた(ストレージから取得するためなど)場合は、アクセス直後にアイテムが作り直されます。

アイテムラベル

このリストを使用すると、アイテムに付けることが可能な主要なラベルを列挙できます。ここでラベルを列挙する理由は2つあります。

  • ビジュアル化中にこのリストでラベルを保持したい場合。
  • アイテムラベルにインデックスを付けたい場合。
アイテムラベルにインデックスを付けると、特定のラベル値を使用したアイテムの検索が大幅に高速化します。たとえば、タイプラベルを使用しており、そのラベルにインデックスが付いている場合は、次のコードが非常に速く動作します。

Storage.Slot.Item slotItem = Storage.system.findItem(
	"WHERE Type = $1", 0, 2
);

[アドレス方式]タブ

このタブを使用して、1つの以上のアドレス方式を定義できます。アドレス方式は、スロット単位の識別子を使用する入力データがある場合に最も有益です。たとえば、各スロット内のアイテムが記述された、倉庫内の在庫のスナップショットを表すテーブルがあるとします。または、ピッカーが注文を履行するために選択したスロットが記述されたテーブルがあるとします。どちらのケースも、通常は、スロットがアドレスによって識別されます。アドレスは、スロットを一意的に識別する数字、英字、およびセパレータの組み合わせです。アドレス方式をセットアップすると、ストレージシステムが、getSlot()メソッドを使用して、アドレスを解釈し、正しいスロットを返すことができます。

アドレスでスロットを検索しようとすると、ストレージシステムが方式のリストから一度に1つずつ方式を選択し、指定されたアドレスがその方式と一致するかどうかを確認します。一致する方式が見つかると、ストレージシステムがその方式の各コンポーネントを構文解析します。まず、ストレージシステムは、アドレスからゾーンIDと通路IDを抽出します。次に、ゾーンIDと通路IDが一致するすべてのストレージオブジェクトを探します。さらに、ストレージシステムは、アドレスからベイID、レベルID、およびスロットIDを抽出し、そのスロットの一致するゾーンと通路でそれぞれのストレージオブジェクトをチェックします。

検索が正しく機能するためには、それぞれのラックオブジェクトを正しく構成する必要があります。アドレス方式にゾーンIDと通路IDが含まれている場合は、それらの値をラックオブジェクトごとに設定する必要があります。各ラックのアドレスマッピングの値が正しく構成されていることを確認する必要もあります。詳細については、「ストレージオブジェクト」のトピックを参照してください。

[アドレス方式]タブには、次のプロパティがあります。

[方式リスト]エリア

このエリアを使用して、アドレス方式の名前変更、追加、複製、削除、および並べ替えを行うことができます。

[方式コンポーネント]エリア

タブのこのエリアを使用して、アドレス方式のコンポーネントの追加、削除、および並べ替えを行うことができます。各コンポーネントには、次のプロパティがあります。

  • コンポーネントタイプ - コンポーネントのタイプ(ゾーンIDや通路IDなど)が表示されます。コンポーネントがセパレータの場合は、セパレータのテキストを含めるようにこのフィールドを編集できます。
  • 番号付けタイプ - コンポーネントに数字と英字のどちらで番号を付けるかを指定します。ゾーンIDと通路IDは、英字または数字に加えて、任意のテキストにすることもできます。ベイID、レベルID、およびスロットIDは、アドレスマッピングの設定を参照します。たとえば、アドレスにベイ用の値「D」が含まれており、ストレージオブジェクトの開始ベイが2で、ベイ幅が2の場合、ベイ「D」はそのオブジェクトの2つ目のベイを表します。1つ目のベイはベイ「B」になります。
  • 固定長 - アドレスコンポーネントの文字数が固定であることを示す場合にこのボックスをオンにします。その場合は、コンポーネント値が文字数で抽出されます。そうでない場合は、コンポーネント値に、次のセパレータまでのすべての文字が含まれます。
  • 長さ - [固定長]がオンになっている場合に、このフィールドを使用して、コンポーネントの文字数を指定できます。
  • 充填文字 - [固定長]がオンになっている場合に、無視できる先行文字列を指定できます。たとえば、ベイIDが「007」の場合です。このIDは、長さが3で充填文字が「0」の固定長コンポーネントです。

[方式コンポーネント]エリアに、方式別のアドレス例を示すフィードが表示されます。この例を実際のアドレスと比較して、パターンが正確に一致することを確認できます。

[オブジェクト]タブ

このタブには、モデル内のすべてのストレージオブジェクトを含むテーブルが表示されます。このテーブルは、整理、絞り込み、および編集を行うことができます。ストレージオブジェクトを個別に編集するための便利な代替手段だと言えます。

[オブジェクト]タブには、次のプロパティがあります。

  • 上/下矢印 - これらのボタンを使用して、リスト内の選択した行の順序を変更できます。
  • 列を選択 - 使用可能な列の完全なリストを表示する場合にこのボタンをクリックします。このリスト内の任意の列を表示または非表示にすることができます。
  • フィルタ - 絞り込むことが可能な列のリストを表示する場合にこのボタンをクリックします。絞り込むには、列名の横にあるボックスをオンにして、テキストを入力します。一致するテキストが値に含まれている行が表示されます。
  • オブジェクトテーブル - 絞り込まれていないストレージオブジェクトごとに指定された列が表示されます。このビューでは、複数の列値を編集できます。

[トリガー]タブ

ストレージシステムでは、次の3つのトリガーを使用できます。

  • スロットエントリ時
  • スロット終了時
  • スロット割り当て時
[トリガー]タブの機能の詳細については、「トリガー」のトピックを参照してください。