一、关于事件
在智能体面板中,点击并拖拽到编辑窗口中,即可创建事件(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计划触发前剩余的时间(单位秒) |