制限エリア:トランスポーターのアクセスを制御する方法(パート6)

制限エリア:トランスポーターのアクセスを制御する方法

AnyLogic 8.6アップデートで追加されたマテリアルハンドリングライブラリに関連する重要な機能は、AGVなどのトランスポーターの移動するエリアを制限でき、アクセスは条件付きで許可することができます:トランスポーター番号、スケジュール、スループット等。製造および倉庫モデルでは、この機能で、ゲートのモデリング、クレーン等の機械の動作制限、積載エリアや交差点での混雑を回避するための制限エリアの設定等、さまざまな箇所に適用できます。

このテクニカルブログでは、これらの制限エリアの使用方法を説明し、実用的なサンプルモデルであるAreas with Limited Access for Transporters(トランスポーターのアクセスが制限されたエリア)使用して学習します。



本ブログは、AnyLogicとマテリアルハンドリングライブラリの使用経験がある人のための技術的な投稿です。これまでにAnyLogicのマテリアルハンドリングライブラリを使用したことがない場合は、次のチュートリアルも参考にしてください。

準備はいいですか? 次に、AnyLogicの最新バージョンがインストールされていることを確認し、モデルを開いて始めましょう!

コンテンツ


制限エリア

AGVやフォークリフトなどのモバイルユニットの移動は、倉庫や工場で床面積をゾーンに分割することで規制されることがよくあります。規則は、ゾーンエリアに同時に入ることができる車両の数を決定する場合もあれば、交差点などへの進入条件を適用する場合もあります。

AnyLogicのバージョン8.6では、マテリアルハンドリングライブラリに新しい制限エリア機能が追加され、AnyLogicシミュレーションモデルがゾーン制約に対応できるようになりました。さらに、新しい機能を使用すると、特定のエリアの交通をブロックし、AGVにそのエリアが開くかルートを変更するのを待つように制御できます。

制限エリアの機能を使用するには、キャンバスにRectangular NodeまたはPolygonal Nodeを追加し、Speed and Access Restrictionsセクションで、Access Restrictionオプションを選択して入場制限を設定するか、Speed Restriction オプションを選択して速度制限を設定します。指定された制限は、Restrictions apply toプロパティで指定されたトランスポータータイプにのみ適用されることに注意してください;他のタイプのトランスポーターエージェントは、指定された制限を無視します。任意のタイプのトランスポーターに制限を適用する必要がある場合は、Restrictions apply toプロパティで、エージェントの一般的な親クラスであるAgentを指定する必要があります。異なる制約を組み合わせるために、複数の重複する制約エリアを設定できます。

以下では、標準AnyLogicのサンプルに含まれているAreas with Limited Access for Transportersサンプルモデルを使用して、Access restricted byプロパティで設定されている、制限エリアの最も一般的な操作モードについて理解します。また、これらの領域を実際にどのように適用できるか、およびそれらがどのように動作するかについても見ていきます。


トランスポーターの数が制限されたエリア

モデルの上部では、いくつかのパスが複雑な交差点に集まっています。Pathsを接続して形成され、単一のPoint Nodeで表される標準の交差点とは異なり、この交差点は、半径がゼロの多数の交差するPaths and Point Nodesで構成されます。いくつかの小さな交差点のグループとしてそれを見ることができます。その結果、TransporterControlブロックとCan enter nodeプロパティを使用して複雑な交差点への入場を管理することは困難です。

交差点を通過する問題を解決するために、Access restrictionオプションが選択された状態で、Polygonal node complexIntersectionがその上に描画されます。一度に1つのトランスポーターのみが交差点を通過できるように、容量が制限として選択され(Access restricted byプロパティとCapacityオプションを使用)、Capacityプロパティで許可されるトランスポーターの数が1に設定されます。これで、エリアに近づくと、トランスポーターは別のトランスポーターがそのエリア内にいるかどうかを確認します。エリアが占有されている場合、トランスポーターは境界で停止し、空きになるまで待機します。

トランスポーターの数が制限されたエリア

トランスポーターの数が制限されたエリア

トランスポーターの数が限られている作業エリアをシミュレートする場合も、同じ設定を使用できます。ただし、このオプションを選択した場合、トランスポーターが最短パス上にある場合、トランスポーターがそのエリアを通るパスを使用することに注意してください。また、パスの始点と終点が制限エリア外にある場合でも、トランスポーターはスペースが利用可能になるまで(つまり、エリア内のトランスポーターの数が設定制限より少なくなるまで)エリアの端で待機する必要があります。

モデルの実行中に領域の容量を変更する必要がある場合は、node.restrictByCapacity()関数を使用します。ここで、nodeは指定されたノードの名前です。このサンプルでは、エリアの上のスライダーを使用するたびに呼び出されます。


close() 関数を呼び出して範囲を制限する

Speed and access restrictionsプロパティで指定されたタイプのエリアへのトランスポーターのアクセスを完全に拒否するために、ユーザーはオプションメニューから制限「close()関数の呼び出し」(プロパティAccess restricted by)を選択できます。このオプションを使用すると、ドアやゲートが閉じているときなど、パスのセクションを一時的にブロックできます。または、 たとえば、機器が動作している場合に、特定のエリアを一時的に閉鎖します。エリアをトランスポーターが再び使用できるようにするには、node.open()関数を呼び出す必要があります。デモモデルでは、このような領域を使用して、隣接するワークショップへの入り口のゲート(長方形ノードdoorNode1およびdoorNode2)をモデル化し、クレーン作業エリア(長方形ノードcraneOperationArea)をモデル化します。

close() 関数を呼び出して範囲を制限する

close() 関数を呼び出して範囲を制限する

最初のケースでは、「gates」の横にあるボタンを押すとゲートが閉じます。これにより、閉鎖エリアにあるトランスポートネットワークのセクションにアクセスできなくなります。この場合、エリアに対してArea is avoided if closedオプションが選択されているため、エリアが閉じられるとすぐに、そのパスが通過するトランスポーターは、ルートを変更しようとします。トランスポーターが指定されたパスに沿って移動していて、エリアを横切るパスのセグメントにすでに入っている場合、トランスポーターは方向転換できず、エリアの境界で待機することに注意してください。その他の場合(エリアの境界が交差点を横切る場合を含む)、トランスポーターは向きを変えてそのエリアを迂回します。もう一度ボタンを押してエリアのブロックを解除すると、トランスポーターはパスを再計算し、アクセス可能になったパスに沿って移動できます。

クレーン操作エリアのアクセス制限ゾーン

クレーン操作エリアのアクセス制限ゾーン

シミュレーションにクレーンの作業エリアが含まれている場合、クレーンが重い荷物を運ぶことができる領域は、craneOperationAreaによって決定されます。クレーンが荷物を受け取ると(bridgeCraneマークアップエレメントのOn loadingアクション)、craneOperationArea.close()関数を呼び出して、トランスポーターに対してエリアを閉じることができます。同様に、クレーンから荷物が解放されたとき(On unloadingアクション)など、craneOperationArea.open()関数を呼び出すと、トランスポーターが関連エリアを通過するための許可が復元されます。この場合、Area is avoided if closedオプションは無効のままであるため、閉鎖エリアに接近するトランスポーターはその境界で停止し、エリアのブロックが解除されるまで待機します。


条件付き制限エリア

エリアにアクセスするための最も柔軟な設定は、(Access restricted byプロパティの)Conditionオプションを使用して設定されます。trueまたはfalseを返す式は、Conditionフィールドに指定できます。 たとえば、この式はトランスポーターの状態である可能性があります。式がtrueを返す場合、トランスポーターは領域に入ることができません。この場合、Area is avoided if closedプロパティは、トランスポーターが最初にルートを作成するとき、またはリルーティングするときに、エリアを回避するルートを作成しようとするかどうかを決定します。オプションが選択されている場合、移動する前に、トランスポーターはその近くのエリアを迂回するルートを見つけます。これが不可能な場合、トランスポーターはそのエリアを通るルートを使用し、境界に到達すると停止します。

より良いアイデアを得るために、まず、コンデション(制約)がトランスポーター自体に関連付けられており、トランスポーターの移動中に変化しない単純なケースを見てみましょう。

私たちが検討しているモデルでは、agvTypeAreaは特定のタイプのトランスポーターの積載エリアへの立ち入りを許可します。これをモデル化するために、Restrictions applyプロパティは、制限エリアで許可されないトランスポーター(AGV)のタイプを指定し、Conditionフィールドはtrueに設定されます。オプションArea is avoided if closedが有効になっているため、AGVトランスポーターは制限エリアを通過しないルートを見つける必要があります。

agvTypeAreaは特定のタイプのトランスポーターの積載エリアへの立ち入りを許可します

agvTypeAreaは特定のタイプのトランスポーターの積載エリアへの立ち入りを許可します

同時に、他のタイプのトランスポーター、ここではHeavyLoadAGVは、制限が適用されないためエリアを自由に通過できます。同様に、特定のグループ(TransporterFleet)に属するもの、特定の種類の貨物の配達に従事するもの、または特定のステータスを持つものなど、他の方法でトランスポーターの移動を制限できます。

たとえば、荷物を積載したランスポーターがエリアに入らないようにする場合、必要なのは、そのエリアに制限を設定し、トランスポーターのステータスを確認することだけです。トランスポーターのステータスを確認するには、agent.getState() == TransporterState.DELIVERING関数でそのConditionフィールドを使用します。

入場制限が時間の経過とともに変化する可能性がある困難なケースでは、次の機能を検討する必要があります。条件は、ルートを見つけるとき、および領域の境界に到達するときに計算されます。したがって、Area is avoided if closedオプションが無効になっているためにエージェントが閉鎖エリアの境界で停止する場合は、node.recalculateAccessibility()関数を呼び出す必要があります。これにより、エージェントが停止する原因となった条件が変化したときに、トランスポーターが進行を継続します。機能がトリガーされると、閉鎖エリアの境界で待機しているトランスポーターの状態が再チェックされ、許可されている場合は進行できます。

この場合のオプションArea is avoided if closedは、ルートの計算時にのみ考慮されます。したがって、トランスポーターがオープンエリアを通るルートを見つけ、その移動の瞬間に条件パラメーターが変更され、エリアがブロックされた場合、トランスポーターは元のルートを進行し、エリアの境界で停止します。ただし、移動するトランスポーターが領域の閉鎖時にルートを再計算する必要がある場合は、トランスポーターのtransporter.recalculateRoute()関数、またはエリアのnode.recalculateAccessibility() 関数を使用します。このようにして、エリアを通過するルート上にあるすべてのトランスポーターのルートが再計算されます。

それでは、サンプル領域loadArea1loadArea2loadArea3を使用して、パラメーターが時間の経過とともに変化する可能性のある条件付き制限エリアがどのように機能するかを考えてみましょう。これらのエリアは、積載ポイントと隣接する交差点でのコンベアの動きを制限します。積載エリアでの衝突を回避するために、以下のルールが採用されています。

エリアアクセスを制限する条件は時間とともに変化します

エリアアクセスを制限する条件は時間とともに変化します
  • AGVがそのエリア内で積載しているか、AGVが積載地へ移動している場合、同じポイントで積載する他のトランスポーターはそのエリアへの進入が許可されません;
  • AGVの積載ポイントがエリア内にない場合、エリアの境界で待機しているトランスポーターがなければ、トランスポーターはエリア内を移動できます(したがって、エリア内に複数のトランスポーターが存在する可能性があります);
  • トランスポーターが領域の境界で停止し、入場許可を待っている場合、残りのAGVは領域を迂回する方法を見つけようとします。

制限エリアを使用してこれらのルールを適用するにはどうすればよいですか? loadArea3エリアの例を使用して解決策を考えてみましょう。Access restricted byプロパティを使用し、クローズが有効になっている場合はエリアが回避されるCondition オプションを使用します。

条件として、ユーザー定義関数accessDenied()が使用されます。この関数は、ゾーン内にAGVがある場合、境界で待機しているトランスポーターの存在を確認し、存在しない場合は、 接近するトランスポーターは、エリア内のトランスポーターの積載ポイントと一致しません。条件の1つが満たされると、関数はtrueを返し、ゾーンへのアクセスは拒否されます。

モデルの開始時には、エリアはフリーであるため、すべてのトランスポーターがそれを通る最短ルートを選択します。最初のトランスポーターが、loadPoint3ノード内にある積載ポイントloadArea3に移動するとします。前方はフリーなので、中では自由に移動できます。

ただし、次のAGVも積載ポイントloadPoint3に移動する場合は、accessDenied()関数で指定された入場条件により、エリアの境界で停止します。この時点で、残りのトランスポーターの領域を通過する条件に影響を与える要因が変化します(領域内およびその境界にAGVが存在するため)。したがって、境界に到達したトランスポーターが入場を拒否されたときにトリガーされるOn enter deniedアクションでは、recalculateAccessibility()関数が呼び出され、可能であれば、残りのトランスポーターは、アクセスできなくなったエリアを迂回するためにパスを再計算します。

アクションOn enter deniedは、境界で停止したAGVに対して1回実行されることに注意してください。境界にいるトランスポーターがその後のアクセシビリティチェック中に再びアクセスを拒否された場合、アクションは繰り返されません。エリア内のトランスポーターが積載され、最終的に終了すると、On exit アクションが自動的にトリガーされます。このアクションは、他のAGVを取り込むエリアの機能に再び影響を与えるため、On exitアクションはrecalcualteAccessibility()関数を再度呼び出します。

積載エリアの上にあるAvoid area if load point is occupiedチェックボックスを使用すると、ユーザーは制限付きのすべてのエリアでAvoid area if closedオプションを無効にし、トランスポーターが境界でAGVを迂回しようとせずに最初のノードでキュー(待ち行列)を開始するようにすることができます。

モデルで使用される動作モードに加えて、スケジュールとスループットによって制限するために使用できる操作モードがさらに2つあります。


スケジュールによる制限エリア

エリアがスケジュールに従って閉鎖されている場合、動作はAccess restricted byプロパティのScheduleモードを使用して設定できます。Scheduleプロパティを使用すると、ユーザーはエリアの動作をモデルに存在するスケジュールにバインドできます。正しく動作するには、スケジュールをType on / offに設定する必要があります。モードをonに切り替えると、ゾーンが閉じていることを示し、offに切り替えると、ゾーンが開いていることを示します。それ以外の場合、ゾーンとゾーン内を移動するトランスポーターの動作は、スケジュールがonモードに切り替えられたときにnode.close()関数が呼び出され、スケジュールがoff状態に切り替えられたときにnode.open()関数が呼び出された場合と同じです。


スループット制限エリア

このモードは、特定の時間単位でエリアを通過できるトランスポーターの最大数を設定することにより、エリアのスループットを制限します(Access restricted byプロパティ、Throughputオプション)。このモードは、エリアに入る次のトランスポーターのグループに時間制限を設定する必要がある場合に使用できます。

上記のモデルでは、制限エリアを使用する手法は、パスガイドトランスポーターの場合にのみ示されています;ただし、フリースペートランスポーター(パスガイドが必要ない)をシミュレートする場合、それらの動作は類似しています。


これで、AnyLogicで制限されたエリアをシミュレートし、マテリアルハンドリングモデルに統合する方法を理解できました。覚えておくべき主なことは:

  • 制限エリアでは、アクセスを制限したり、トランスポーターの速度制限を定義したりできます
  • アクセス制限は5つの方法でセットすることができます:トランスポーターの数、 close()ファンクション、コンデション、スケジュール及びスループット
  • open()close()関数を呼び出してエリアを開いたり閉じたりすると、Area is avoided if closedオプションによってトランスポーターがルートを変更します。
  • エリアのアベイラビリティがコンデションでセットされ、トランスポーターがそのルート(移動の開始時、又はrecalculate()関数が呼び出された時)を再計算し、closed optionが観測される場合、そのエリアの値は無効にされます。
  • 条件付きで制限されたエリアに対してrecalculateAccessibility()関数を呼び出すと、ルートがこのエリアを通過するすべてのトランスポーターは、エリアに入ることができるかどうかを再確認し、入ることが許可されていない場合はルートを更新します。

マテリアルハンドリングシミュレーションの詳細については、マテリアルハンドリングパックをあわせましてご覧ください。


関連記事