このブログ投稿では、無人搬送車 (AGV) のバッテリー充電のシミュレーションモデルについて詳しく説明します。
サンプルモデルをダウンロードし、AnyLogic で実行し、本モデルの機能をお試しください。
このモデルは AnyLogic 8.7.12 で開発されており、新しいStoreおよび StorageSystem等、マテリアルハンドリングライブラリ機能を使用しています。これらの新機能は倉庫運用モデル作成を強力にサポートします。
このモデルは、トラックの荷降ろしプロセスと、倉庫内の利用可能な保管スロットに応じた SKU の配置をモデル化しています。本モデルは離散イベントおよびエージェントベースを利用して作成されています。
本モデルでは、流体ライブラリを使用し、バッテリーのライフサイクルをシミュレートします。その他に、マテリアルハンドリングライブラリ内のAGV (トランスポーター) とラック等を使用しています。
AGV充電モデルの概要
モデルのレイアウトは非常にシンプルですが、エージェントの性質と流体ライブラリでモデル化された離散イベント動作との間の相互接続の良い例として役立ちます。
左下隅には、AGV ベースと充電ステーションがあります。倉庫の右側には荷降ろしゲートがあり、ここに運送業者のタスクが表示されます。モデルのロジックで最も重要な部分は、AGV エージェント内の充電関連のプロセスです。
タスク割り当て

図のように、上側のフローチャートでは SKU のインスタンスを生成します。次に、AGVがSKUラックに格納し、“Sink”で終了します。下側のフローチャートは、AGVの充電が必要になったら、Enter blockから処理が始まります。”СhargeTask”で、AGVを充電ステーションに移動させ、充電を開始します。“delay”は充電中を模しています。“delay”の次の部品は、満充電後AGVをベースに移動させます。

このクエリは、chargetaskブロックのプロパティで“task may preempt”ポリシーが選択されているため、トラックの荷降ろしプロセスを中断することになっています。“task priority”パラメーター値は 1000 に等しく、荷降ろしタスクよりも重要になります。フローチャートで説明されているロジックに従って、充電タスクが完了すると、AGV はルーチンに戻ります。
モデルを正しく動作させるためのもう 1 つのステップは、Delayブロックのモード (タイプ) を“Until stopDelay() is called”に変更することです。後で、Java コードを使用して AGV のステートチャートからこのstopDelay()関数を呼び出すことができます。
AGV エージェントタイプ内のバッテリーフローチャート
別の簡単なフローチャートを使用して、バッテリーの寿命サイクルを説明します。流体ライブラリは、液体、穀物、エネルギーなど、大量のアイテムの保管と転送をシミュレートするのに役立ちます。
このモデルでは、Tankブロックが AGV のバッテリー レベル (%) と Valveブロック =バッテリーの充放電シミュレーションに役立ちました。バッテリーの特性を詳しく見てみましょう。

バッテリーの容量は1000リットルに設定されています。流体ライブラリのリストから、最も適切な単位としてリットルを選択しました。トランスポーターが初めて起動されたときの初期バッテリーレベルは確率的であり、 三角確率分布とパラメーター (最小、最大、モード) に従って割り当てられます。
さらに興味深いのは、Battery’sプロパティの“Actions”セクションで、Mainのエージェントのステートチャートと SKU のフローチャートが結合されていることです。バッテリーが満タンになると、“GoOperate”というメッセージが AGV エージェントに送信されるため、AGV エージェントは充電を完了し、荷降ろしタスクに進むことができます。
バッテリーレベルが 350 (35%) を下回ると、それぞれのアクションが ChargeTaskオブジェクトインスタンスの作成をトリガーし、それを Mainの SKU のフローチャートの Enterブロックに送信します。AGV エージェントは荷降ろしタスクの実行を停止し、充電ステーションに移動します。
しかし、Enterフローチャートに入るブロックは、充電タスクが作成された AGV をどのように認識するのでしょうか? 言い換えると、どの AGV が充電ステーションに行くべきなのでしょうか?
Batteryブロック (AGV エージェント内) で実行されるコード:
currentChargeTask = new ChargeTask(this);
main.enter.take(currentChargeTask);
Line 1は、特定の AGV に関連するエージェントタイプ ChargeTaskを作成します。
Line 2は、このChargeTaskエージェント タイプをMainの SKU のフローチャートに追加します。
ChargeTaskエージェントには、“AGV”タイプの“transporter”パラメーターがあります。コードを (AGV エージェント内で) 実行すると、“this”は、ChargeTaskエージェントが親オブジェクトに属していることを識別します。
これが、フローチャートで新しい ChargeTaskエージェントを取得する方法です。エージェントは、どのトランスポーターが充電ステーションに行く必要があるかを覚えています。


2 番目のフローチャートに従って、ChargeTaskエージェントは正しい AGV を捕捉する必要があります。また、chargetaskブロックの MoveByTransporter では、“transporter choice condition”により、必要な AGV がラックへの SKU 配送のルーチンタスクの実行を停止することが保証されます。

エージェントのステートチャートとバッテリーレベルとの関係
バッテリーロジックと AGV 移動ロジック (AGV の充電が必要な場合) について説明しました。ただし、モデルには AGV の動作を制御する高レベルの管理コンポーネントが欠けており、これがStatechartです。
ご想像のとおり、エージェント間の最も一般的な通信手段はメッセージングであり、エージェントの状態の変更をトリガーする可能性があります。状態の変化はトランジションと呼ばれ、トランジション中に、エネルギーフローバルブの開閉などのアクションを実行できます。

AGV の状態のセットは、複合状態と呼ばれます (黒枠内)。AGV の動作を定義する小さなステートで構成されます。
たとえば、各 AGV エージェントは“Operate“、“Charging”などの状態を持つことができます。状態の変化は、エージェントが受信したメッセージによって異なります。そのため、AGV が“start“メッセージを受信したために発生するある状態から別の状態への移行では、AGV エージェントが流出バルブを閉じ、流入バルブを開いてバッテリーにエネルギーを充填します。
これは逆にも機能します -”GoOperate”メッセージが流入バルブを閉じ、充電が終了したことを意味します。
全体的なアルゴリズム:
- トランスポーターには、開始時に特定の初期バッテリーレベルがあります。
- レベルが 35% を下回ると、Batteryブロックは充電タスクの作成 (新しいChargeTaskエージェント) を初期化します。
- chargeTaskブロックは、AGV のルーチンタスクよりも充電タスクを優先し、AGV を確保します。
- ChargeTaskが MoveByTransporter で AGV を確保すると、メッセージ”GoCharging”が AGV に送信されます。
- このメッセージは、AGV のステートチャートの状態を”Operate”から”MovingToChargingStation”に変更します。
- MoveByTransporterの [Actions] タブには、[on loading finished] フィールドがあります。このフィールドには、”start”メッセージを送信する関数が含まれています。AGV が充電ステーションに到着すると、コードはこの関数を呼び出します。
- このメッセージは、状態”Charging”への移行をトリガーし、それぞれのBatteryバルブを開閉します。
- Batteryはエネルギーの蓄積を開始し、満タンになると”GoOperate”というメッセージを AGV に送信します。
- このメッセージは、それぞれのバルブを開閉します。Battery の放電プロセスが開始され、AGV の状態が”ReadyToWork”に変わります。
- 指定されたタイムアウト (1 秒) で、自動遷移が発生し、AGV の状態は再び”Operate”になります。
- “ReadyToWork”から”Operate”への移行により、AGV はDelayブロックから解放されるため、次の充電セッションまでメインタスクに戻ることができます。
この AGV 充電モデルの説明は、モデルが AnyLogic でどのように構築されたかを理解するのに役立ちます。ただし、ただ読むだけではなく、練習を始めましょう。AnyLogic Cloud のソースファイルで AGV 充電モデルを自由にチェックして、独自のプロジェクトに実装してください。