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