AnyLogic 8.4のアップデートには、いくつかの重要なアップデートが含まれています。その一つは、マテリアルハンドリングライブラリ関連です。新しいスペースマークアップCraneが追加されました。Craneは工場のジブクレーンだけでなく、建設現場のタワークレーンや、積み下ろし作業を実行するロボットもシミュレートできます。Craneは別の新しい部品MoveByCraneと連携し異なるコンベアネットワーク間でもオブジェクトを移動できます。
ここでは、サンプルモデルのMoveByCraneとJib Cranes at Press Shopを使用して、新しい部品の使用方法を説明します。この投稿は、マテリアルハンドリングライブラリに精通しおり、AnyLogicの使用に自信がある人向けです。マテリアルハンドリングライブラリを使用したことがない場合は、このトピックに関する以前のチュートリアル投稿をご覧ください。
- How to model conveyors
- How to simulate the operation of loaders and AGV’s
- How to simulate the processing of objects on a conveyor
準備はできましたか?では、AnyLogicの最新バージョンがインストールされていることを確認し、モデルを開いて始めましょう。
MoveByCraneモデル
このモデルでは、稼働中の作業場のプロセスを見ることができます。部品は、コンベアでクレーンに運ばれ、液体で満たされたタンクに移動し、加工機に運ばれます。処理された部品は別のコンベアに乗せられ、搬出されます。この事例では以下を確認できます。
- MoveByCraneの機能
- 異なるコンベアネットワークにおいて、エージェントを移動させるクレーン操作
クレーンを使用するには、マテリアルハンドリングライブラリ(Material Handling Library)パレットのスペースマークアップ(Space Markup)項目にあるCraneをキャンバスにドラッグします。次に、クレーンとその構成要素の物理的なプロパティ(トロリー速度、吊り上げ速度、ジブ回転速度)を設定します。さらに、クレーンのモードをステップバイステップ実行(Step-by-step)か同時実行(Concurrent)に設定できます。ステップバイステップ実行は吊り上げ、回転(移動)が順番に処理されます。同時実行は吊り上げと回転(移動)が同時に実行されます。このモデルでは、これらのプロパティの値はデフォルトのままに設定しています。プロパティ(Properties)ビューの外観(Appearance)項目にあるTypeでクレーンの外観を選択できます。外観は工業用ジブクレーン(Industrial jib crane)、キャットヘッドタワークレーン(Cat-head tower crane)、フラットトップのタワークレーン(Flat-top tower crane)から選択できます。
このモデルでは、液体で満たされたタンク(Rectangular Node:tankNode )と加工機(Point Node:machineNode) がクレーンの作業エリア内にあります。machineNodeはリソース(ResourcePool:machineResource)の設置位置(Home location)です。また、2つのコンベアがクレーンで使用されます。クレーンで移動させるにはエージェントとその目的地がクレーンの作業エリア内にある必要があります。
source(source)ブロックはエージェントを生成します。部品(エージェント)を製造するプロセスです。生成された部品はすぐに、convey(convey)ブロックによってクレーンに搬送されます。conveyブロックだけではコンベアの出口に部品が残されたままになることに注意してください。次のブロックをつなぐことでクレーンが部品を動かし始めるとコンベアから自動的に取り除かれます。
toTankByCrane(moveByCrane)ブロックは部品をコンベアからタンクに移動する役割を果たします。 タンク(Rectangular Node:tankNode)はモデルにノードとして配置しました。そこで、toTankByCraneのDestinationプロパティにNodeを選択し、NodeプロパティでtankNodeを選択します。Craneプロパティはスペースマークアップ項目(Space Markup)のCrane(crane)を選択することで部品を移動します。このモデルではクレーンの積み上げと積み下ろしの時間は一瞬で終わると省略化し、Loading timeプロパティとUnloading timeプロパティは0のままにします。クレーンの搬送時間は不明なため、Use operation timeは選択しません。スペースマークアップ(Space Markup)項目のCrane(crane)に設定された速度に基づいて自動的に計算されます。クレーンの搬送時間がわかっている場合はUse operation timeを活用できます。
このモデルでは、ステーション間(2本のコンベアとタンクと加工機)で部品が移動する順序が重要であるため、toTankByCrane(moveByCrane)のAgent selection patternでCustomを選択します。これによりクレーンの作業順序を制御できます。これについては後程詳しく解説します。
クレーンは、動作中にさまざまな物体の上に部品を吊り下げます。何かに接触しないようにSafe heightは3.5metersに設定します。これは移動する前にクレーンが部品を持ち上げる高さです。この値をゼロにすると、クレーンは部品が置いてあった高さで移動します。
移動後、部品はinLiquid(Delay)ブロックを使用してタンク内に保持されます。次に、toMachineByCrane(MoveByCrane)を使用して、クレーンで加工機に移動します。加工機はmachineResource(ResourcePool)ブロックによって定義されます。 machineNodeは加工機の設置位置です。部品を加工機に移動するにはToMachineByCraneブロックのDestination isプロパティにAgentを選択し、AgentプロパティにmachineResource.iterator().next();と入力します。Tこのコードにより、machineResourceブロックから任意のリソースを選択できます。リソースは一つしかないため加工機が選択され、クレーンで部品を移動します。
次に、加工機(Serviceブロック:processing)で部品が加工されます。ただし、クレーンが新しい部品を加工機に移動させる前に、加工済みの部品を移動させる必要があります。さもなければ、加工機が占有され続けクレーンの移動が阻害されます。これを行うために、「加工機へのクレーンでの移動と加工を行えるのは一つの部品のみ」という簡単なルールを使用します。このルールを設定するために、toMachineByCraneとprocessingを制限領域とします。raStart(RestrictedAreaStart)とraEnd(RestrictedAreaEnd)で囲み、Capacityプロパティに1を設定し、部品の数を制限します。これらの設定によりクレーンが新しい部品を移動する前に加工機が空いていることが保証されます。
クレーン作業の最後はtoConveyorByCrane(MoveByCrane)です。加工機から搬出用のコンベアに部品を移動します。
部品は、指定されたオフセット位置(DestinationプロパティをConveyorに設定し、Offsetプロパティを調整する)またはコンベア上の特定ポイント(DestinationプロパティをPosition on conveyorに設定する)に配置できます。このモデルでは2番目の方法を使用しています。クレーンは完成した部品をコンベアに移動し、conveyToExit(Convey)ブロックが部品を搬出します。conveyToExitのConvey fromプロパティをCurrent positionに設定することでクレーンが部品を載せた位置から移動を開始します。
ステーション間(2本のコンベアとタンクと加工機)の部品の移動を詳しく説明します。3つのmoveByCraneブロックでAgent selection patternプロパティをCustomに設定しました。このモデルでは、すべての移動操作が1台のクレーンで実行され、加工エリアが制限されているため、クレーンの処理順序を明確に定義する必要があります。このモデルでは、加工機から搬出コンベアへの移動を最優先とします。次にタンクから加工機への移動、最後に搬入コンベアからタンクへの移動とします。MoveByCraneブロックのCustom patternプロパティを使用して設定します。toConveyorByCraneの値を3(最優先)、toMachineByCraneの値を2、toTankByCraneの値を1に設定します。
Jib Cranes at Press Shopモデル
マテリアルハンドリングライブラリに関するこれまでのチュートリアル記事を読んでいたら、トランスポーターがコンベアから直接エージェントをピックアップできることを知っていると思います。しかし、クレーンが荷下ろしをするプロセスをモデル化するにはどうすればよいでしょうか?プレス工場の省略化されたモデルの例を見てみましょう。モデルでは、金属シートはコンベアで運ばれ2つの処理ステーションを通過し、車体のサイドパネルを形成するように型抜きされます。コンベアの終わりで、クレーンがそれらを1つずつ移動し、パネルを別のワークショップに運ぶAGV(無人搬送車)に積載します。
このモデルでは、最初のクレーン(loadingCrane)がコンベアの先頭にあり、2番目のクレーン(unloadingCrane)が後尾にあります。
まず、最初のクレーンとコンベア間のプロセスについて説明します。エージェント(処理用の金属シート)は、metalSheetSource(Source)ブロックで生成され、コンベア近くのbuffer(Queue)ブロックに追加されます。その後、loadByCrane(MoveByCrane)ブロックを使用してコンベアに1つずつ移動します。そのために、loadByCraneブロックのCraneプロパティにloadingCraneを選択します。Destination isプロパティにはPosition on conveyorを選択し、Position on conveyorプロパティにはloadingPointを選択します。
コンベアに積載後、金属板はconvey(Convey)ブロックに従って移動を始め、2つの加工ステーション(プレス機とカット機)を通過します。処理が完了すると、On process finishedプロパティに記述したagent.receive("processed")が実行されます。この場合、特定のエージェントのアニメーションがそれぞれの状態に見えるように変化させています。これにより2つのステーションを通過したエージェントの見た目を変更できます。
部品がコンベアの後尾に達すると、unloadByCrane(moveByCrane)ブロックに移動します。車体のパネル移動ロジックについては省略します。パネルをクレーンでAGVに積載する方法については、後程説明します。
ここでは、AGVの動作ロジックを説明します。完成したパネルはトロリーに積載し溶接工場に運びます。トロリーとはAGVによって移動されるエージェントです。AGVのグループはagvs(TransporterFreet)ブロックで定義します。このモデルでは、AGVが2台存在するため、agvsブロックのCapacityプロパティは2にします。シミュレーション開始時にはdropoffTrolleyLocation(PointNode)とpickUpTrolleyLocation(PointNode)に配置されます。
モデルでは常に積載可能なカートが存在します。トロリーがパネルの積み込み地点に到着したとき、pickup(Pickup)ブロックでsourceTrolley.inject(1)を実行し新たに積載可能なカートを生成します。1台目のトロリーはシミュレーション開始時に生成されます。MainクラスのOn startupプロパティでsourceTrolley.inject(1)が実行され、sourceTrolley(Source)ブロックが生成し、pickUpTrolleyLocation(PointNode)に配置されます。toLoadPoint(MoveByTransporter)ブロックでトロリーは待機中のAGVを占有し、コンベアに移動します。AGVがコンベアの後尾に移動するように、toLoadPointブロックのOffset fromプロパティにThe end of the conveyorを選択します。Release transpoterプロパティは使用しません。これにより、AGVはトロリーとともにその場にとどまり、積み込みプロセスと次の輸送指令が完了するのを待つことができます。
フローチャートの次の部品はtoAssemble(MoveByTransporter)ブロックです。toAssembleブロックは同じAGVを使用してパネルを積載したトロリーを溶接工場に移動します。AGVはすでにトロリーに占有されているため、Seize transporterプロパティは選択せず、Destination isプロパティはNode、NodeプロパティにはdropoffTrolleyLocation(PointNode)を指定します。指定ポイントにトロリーを移動するとAGVは解放され、次のトロリーの移動を開始します。
モデルをゼロから作成している場合は、トロリーとパネルの輸送を作成します。toLoadPointブロックとtoAssembleブロックの間にpickup(Pickup)ブロックを追加し、トロリーにパネルを積み込みます。積載するパネルの数は、QuantityプロパティでnumberOfBodyPartsToDeliver変数を参照し決定されます。注:PickupプロパティにExact quantity (wait for)を指定します。これにより、指定された数のパネルがトロリーに積み込まれるまで、トロリーが指定の位置(pickupブロック内)に保持されます。
モデルは複数のトロリーを使用しているため、どのトロリーがパネルを受け取っているか知っておく必要があります。そのため、pickupブロックのAction項目On enterプロパティで、到着したトロリーがloadedTrolley変数に記録されます。(コード loadedTrolley = container)
unloadByCraneブロックで、目的のトロリーがクレーンの移動先として指定されます。Destination isプロパティにAgentを選択し、AgentプロパティにlodedTrolleyを指定します。クレーンは、パネルがコンベアから吊り上げられると、すぐに目的地へ移動しようとすることに注意してください。トロリーが到着するまでクレーンの積み込みを停止するには、waitForAGV(Hold)ブロックをunloadByCrane(MoveByCrane)ブロックの前に配置します。1台のトロリーに積み込むパネル枚数を通過させ、その後にパネル(エージェント)の通過を停止します。ModeプロパティにBlock automatically after N agents(use unblock())を指定し、通過させるエージェントの数をN agents for self-blockに指定します。新しいトロリーがpickupブロックに到着するとすぐに、waitForAGV.unblock();(pickupブロックのAction項目On enterプロパティ)が実行され、パネル(エージェント)のブロックを解除します。
ここまで、AnyLogicでクレーンをシミュレートし、生産プロセスに実装する方法を学びました。覚えておくべき項目は以下のとおりです。
- クレーンでの移動をエージェントが待機する可能性のポイント、および目的地は、クレーンの作業エリアに配置する必要があります。
- クレーンを使用してコンベアにエージェントを積み込む必要がある場合は、コンベアがクレーンの作業エリアにあることを確認してください。
- MoveByCraneブロックを設定するときは、クレーンが荷物を持ち上げる最低の高さを指定することを忘れないでください。この値をゼロのままにしておくと、クレーンは荷物をそのままの高さで動かし、途中の障害物に接触(通過)してしまいます。
- クレーンに処理順序を指定する必要がある場合、MoveByCraneブロックのAgent selection patternプロパティを使用します。
ハウツー記事から他に何を学びたいですか?下のコメント欄で教えてください。毎月のニュースレターを購読し、新しい記事が公開されたときに見逃さないでください。