一、關于事件
在智能體面板中,點擊并拖拽到編輯窗口中,即可創建事件(Event)。
?
創建事件后,即可在右側屬性面板中,設置事件的屬性。
?
在“行動”中,編寫代碼,當事件觸發,執行事件,就是執行這段代碼。
觸發類型和模式,是事件主要關注的地方,Anylogic提供了三種觸發類型和相應的模式:
觸發類型 |
模式 |
說明 |
? 到時(默認) |
用戶控制 |
需要手動在代碼中調用restart()(或有參數的restart)方法,來控制事件開始。 |
發生一次(默認) |
經過設置的時間,或到了設置的日期時,事件觸發一次。 |
|
循環 |
事件循環多次發生。比如每5秒發生一次等。 |
|
速率 |
—— |
每秒/分鐘/小時/... ??發生n次(n由用戶設定)。 |
條件 |
—— |
當設置的條件為true,觸發事件。 |
?
?
1.到時觸發類型,即當經過了設置的時間后,事件觸發。
?到時觸發類型——用戶控制模式
需要手動在代碼中通過調用restart()方法,來控制事件開始運行。
操作示例: a.新建項目,使用默認的模型時間單位 秒。 ? ? |
b.添加一個按鈕,一個事件。 ? |
c.如下設置event-事件的屬性: ? ? |
到時,設置為5秒, “行動”中的代碼會在控制臺打印輸出“-----澆水-----” ? |
d.在button的“行動”中,書寫代碼 ? |
運行模型, 發現event并沒有執行,控制臺也沒有輸出信息。 ? |
此時,點擊button,則會發現,event會倒計時5s后,在控制臺打印輸出“----澆水----” ? ? |
點擊button,則會調用event.restart(),在倒計時5s后,打印輸出信息。 如果在倒計時的時候,再次點擊button,會發現事件會重新從5s開始倒計時, 因為restart()會取消上一個事件,重新開始一個事件。 ? |
?擴展一:restart(double ?timeout) |
修改button的代碼 ? |
運行模型,點擊button,會發現event會從10s開始倒計時。 ? ? |
?擴展二:restart(double ?timeout , TimeUnits ?units) |
? 修改button代碼: ? |
運行模型,點擊button,event則會從1分鐘(60秒)開始倒計時 ? |
?
?到時觸發類型——發生一次模式(默認)
當過了設置的時間后(或到了設定的日期時)事件發生一次。
?
沿用上面的例子,修改event-事件的模式, ? 使用模型時間 ?發生時間(絕對)設為20 秒, 則從模型運行開始,計時20s,事件會發生 使用日歷日期 ?則事件會在指定的日期,發生一次。 ? |
如上圖設置,運行模型,不用點擊button,event會自動從20s開始倒計時。 這就是“發生時間(絕對)”的含義,從模型運行開始進行計時。 ? |
同樣,依然沿用button的代碼: event.restart(1,MINUTE); |
運行模型,點擊button,event會從60s開始倒計時。 |
? |
?擴展:使用日歷日期 ? |
則event會在指定的時間日期(2022年5月26日 8:00:00)觸發。 |
?
?到時觸發類型——循環模式
循環多次發生(每隔一定的時間,或是按照設定的日期,觸發事件)。
? 刪除button。下面的event-事件的,都會自動觸發,故不再需要button。 ? 修改event-事件的屬性 ? |
首次發生時間(絕對):從模型運行開始計時,一定時間后,第一次發生。 復發時間:兩次事件之間的時間間隔(每隔一定時間,發生一次)。 ? 以上設置,event會在模型開始運行后,計時20s第一次發生,之后每隔5秒,發生一次。 |
如圖設置,運行模型,觀察event倒計時情況。 ? 控制臺輸出: ? |
2.速率觸發類型,即每秒/分鐘/小時/天... ?觸發n次( n由用戶設定)
操作示例: 修改event-事件的屬性:速率選擇輸入5,單位選擇每秒 ? |
則會每秒觸發5次事件 |
? |
? |
3.條件觸發類型,即當設置的條件為真(true)時,觸發事件
操作示例: 添加一個button,一個變量variable, ? |
屬性分別設置如下 ? ? ? ? ? |
變量variable初始值為false, 當點擊button時,其值變為true,此時事件觸發,打印輸出。 |
運行模型,發現沒有輸出,點擊button,發現控制臺有輸出。 |
?
此外,還可以判斷事件是否正在計劃運行,取消事件,讓事件停止運行,恢復停止的事件等等。詳見第四部分API 操控事件的方法。
注意:以下的時間,均為模型時間(而不是真實的時間)
到時觸發類型的事件方法 |
|
boolean ?isActive() |
如果當前事件正在計劃運行,返回true, 否則返回false; |
void ?reset() |
取消當前計劃的事件(如果有的話)。 如果事件模式是“循環”,則周期不會繼續下去,直到調用restart()或restart( double t ) |
void ?restart() |
取消當前計劃的事件(如果有的話)。 并根據參數指定的時間,觸發個事件。 restart() ? (經過事件屬性中設置的時間后)觸發事件 restart(double ?timeout) ? timeout時間后,觸發事件,時間單位默認為模型時間單位 restart(double ?timeout, ?TimeUnits ?units) timeout時間后,觸發事件,時間單位units。 ? 例:假設模型時間單位為秒(s) event.restart() ?(經過事件屬性中設置的時間后)觸發事件 event.restart(10) ?10秒后,觸發事件 event.restart(10, SECOND) 10秒后,觸發事件 event.restart(20, MINUTE) ?20分鐘后,觸發事件 ? |
void ?restart( double ?timeout) |
|
void ?restart( double ?timeout, TimeUnits ?units) |
|
void ?restartTo( double ?time) |
從模型運行開始的time時間后(默認模型時間單位),觸發事件 |
void ?restartTo( double ?time, TimeUnits ?units) |
從模型運行開始的time時間后(時間單位units),觸發事件 例: event.restartTo(10, MINUTE) 從模型運行開始的10分鐘后,觸發事件 |
void ?restartTo( Date ?date) |
在指定日期date,觸發事件 |
void ?suspend( ) |
取消當前事件(如果有的話),并且會記住距離事件觸發還剩余的時間,便于通過調用resume()恢復事件 |
void ?resume( ) |
恢復之前被掛起(suspend)的事件 |
double ?getReset( TimeUnits ?units) |
以給定的時間單位units返回事件計劃發生之前的剩余時間。如果未調度事件,則函數返回??infinity。 例如: event.getReset(SECOND) 返回事件event計劃觸發前剩余的時間(單位秒) |
?
條件觸發類型的事件方法 |
|
void ?reset() |
取消當前計劃的事件(如果有的話)。停止等待條件(等待事件的條件成立) (可以稍后通過調用restart()來恢復?) |
void ?restart() |
恢復等待條件。 |
?
速率觸發類型的事件方法 |
|
boolean ?isActive() |
如果當前事件正在計劃運行,返回true, 否則返回false |
void ?reset() |
取消當前計劃的事件(如果有的話)。 如果事件模式是“循環”,則周期不會繼續下去,直到調用restart() |
void ?restart() |
取消當前計劃的事件(如果有的話),并且根據速率,計劃下一次事件。 |
double ?getReset() |
以模型時間單位,返回事件計劃發生之前的剩余時間。如果未調度事件,則函數返回??infinity。 |
double ?getReset(TimeUnits ?units) |
以給定的時間單位units,返回事件計劃發生之前的剩余時間。如果未調度事件,則函數返回??infinity。 例如: event.getReset(SECOND) 返回事件event計劃觸發前剩余的時間(單位秒) |