MATLAB SimEvents 完整入门教程
什么是 SimEvents?
SimEvents 是 MATLAB Simulink 中的一个事件驱动仿真工具箱,与 Simulink 主要基于时间步长(fixed-step 或 variable-step)的连续或离散时间仿真不同,SimEvents 专注于对异步事件进行建模和仿真。

核心思想:
- 事件驱动: 系统的状态变化是由特定事件(如“一个零件到达”、“一辆公交车进站”)触发的,而不是由时间的流逝触发。
- 离散事件: 系统的状态在离散的时间点上发生改变,状态在事件之间保持不变。
SimEvents 能用来做什么? SimEvents 非常适合对以下系统进行建模和分析:
- 排队系统: 银行窗口、呼叫中心、网络服务器、生产线。
- 物流与运输: 仓库管理、港口装卸、公共交通系统。
- 计算机与网络: 数据包路由、计算机网络协议、计算机系统性能分析。
- 制造系统: 装配线、自动化设备调度。
- 医疗系统: 急诊室病人流动、手术室调度。
核心概念
在开始建模之前,必须理解 SimEvents 的几个核心概念:
-
实体
(图片来源网络,侵删)- 定义: 系统中流动的“对象”或“事物”,顾客、零件、数据包、公交车。
- 特点: 实体可以拥有属性,这些属性是附加在实体上的数据,可以是数值、字符串等,一个零件实体可以有
ID、类型、加工时间等属性,属性在仿真过程中可以被读取、修改和传递。
-
服务器
- 定义: 对实体执行某种操作的“资源”,银行柜员、机器、处理器、路由器。
- 特点: 服务器在同一时间只能处理一个实体(除非配置为多服务器),当服务器忙时,到达的实体需要排队等待。
-
队列
- 定义: 存储等待服务的实体的“缓冲区”或“等候区”。
- 特点: 队列有其容量,即最多能存放多少实体,队列可以有不同的排队规则,最常见的是 FIFO (First-In, First-Out),即先进先出。
-
事件
- 定义: 驱动仿真进程的“瞬间发生的事情”。
- 常见事件类型:
- 实体生成事件: 创建一个新实体。
- 实体到达事件: 实体到达一个队列或服务器。
- 实体服务开始事件: 服务器开始为一个实体服务。
- 实体服务结束事件: 服务器完成对一个实体的服务。
- 仿真时钟: SimEvents 内部维护一个事件列表,并按时间顺序执行这些事件,仿真时钟会直接跳转到下一个事件的发生时间,而不是按固定步长推进。
-
路径
(图片来源网络,侵删)- 定义: 实体在系统中流动的“路线”,实体在离开一个模块后,会通过路径连接到下一个模块。
SimEvents 界面与常用模块
SimEvents 模块库位于 Simulink 库浏览器的 Simulink / Discrete-Event Library 路径下。
最核心、最常用的模块:
| 模块名称 | 功能描述 | 类比 |
|---|---|---|
Signal Generator |
实体生成器,按照设定的间隔(时间或基于概率)生成实体。 | 顾客到达银行门口 |
Entity Storage |
实体存储/队列,存储等待的实体,可以设置容量和排队规则。 | 银行的等候区 |
Server |
服务器,对实体进行“服务”,服务时间可以是固定的、随机的或基于实体属性的。 | 银行的柜员 |
Entity Departure |
实体离开/信宿,作为实体流动路径的终点,表示实体离开系统。 | 顾客办完业务离开银行 |
Scope |
示波器,用于查看信号(如队列长度、服务器利用率)随时间变化的图形。 | 监控银行等候区的人数变化 |
Display |
显示,在仿真运行时直接在模块上显示数值(如当前队列长度)。 | 实时显示等候人数 |
Statistics Collector |
统计收集器,收集实体的属性数据,用于后续分析(如平均等待时间)。 | 记录每位顾客的等待时间 |
动手实践:一个简单的银行排队系统模型
我们将构建一个最经典的模型:单队列单服务器系统。
目标: 模拟顾客到达银行、排队、接受服务并离开的全过程,并统计平均等待时间和服务器的利用率。
步骤 1:创建模型并打开库
- 打开 MATLAB,在命令窗口输入
simulink并回车,新建一个模型。 - 在 Simulink 库浏览器中,找到
Simulink / Discrete-Event Library。
步骤 2:拖入核心模块 从库中将以下模块拖拽到模型中:
Signal Generator(实体生成器)Entity Storage(队列)Server(服务器)Entity Departure(实体离开)Scope(示波器)Display(显示)
步骤 3:连接模块
按照实体流动的顺序,用信号线连接这些模块:
Signal Generator -> Entity Storage -> Server -> Entity Departure
步骤 4:配置模块参数
-
配置
Signal Generator(实体生成器)- 双击
Signal Generator模块。 - Time source: 选择
Interarrival time(到达间隔时间),表示实体生成的时间间隔。 - Interarrival time data: 设置为
3(表示每3秒生成一个顾客),也可以设置为exprnd(3)来模拟泊松到达过程(指数分布间隔)。 - Entity name: 可以设置为
'Customer'。 - Entity type: 保持默认或设置为
1。
- 双击
-
配置
Entity Storage(队列)- 双击
Entity Storage。 - Capacity: 设置为
10(表示最多等候10人)。 - Queue discipline: 选择
FIFO(先进先出)。 - Output signal: 勾选
Queue length(队列长度),这样我们就可以用示波器观察队列变化。
- 双击
-
配置
Server(服务器)- 双击
Server。 - Service time data: 设置为
2(表示每个顾客需要2秒的服务时间),也可以设置为exprnd(2)来模拟随机服务时间。 - Number of servers: 保持
1(单服务器)。 - Output signal: 勾选
Utilization(服务器利用率) 和Number of entities in service(正在服务的实体数)。
- 双击
-
配置
Entity Departure(实体离开)- 双击
Entity Departure。 - Record data: 勾选
Time in system(在系统中的总时间),这个数据对我们分析至关重要。
- 双击
步骤 5:连接信号到示波器和显示
- 从
Entity Storage的q端口(Queue length)拖出一条线,连接到Scope的一个输入端口。 - 从
Server的u端口(Utilization)拖出一条线,连接到Scope的另一个输入端口。 - 从
Server的n端口(Number of entities in service)拖出一条线,连接到Display模块。 - 从
Entity Departure的t端口(Time in system)拖出一条线,连接到另一个Display模块,用于显示平均在系统时间。
步骤 6:运行仿真
- 设置仿真时间,在模型窗口顶部,将 Stop time 设置为
100(仿真运行100秒)。 - 点击工具栏的 Run 按钮。
步骤 7:查看结果
- 双击
Scope:你会看到两条曲线,一条是队列长度随时间的变化,另一条是服务器利用率(0或1)随时间的变化。 - 查看
Display:一个显示器会显示Number of entities in service(0或1),另一个显示器会显示Average time in system(顾客在系统中的平均时间)。
模型截图示例:
高级主题
-
实体属性
- 在
Signal Generator中,可以创建实体属性,添加一个priority属性。 - 在
Entity Storage的 Queue discipline 中,可以选择Highest attribute value first或Lowest attribute value first,实现优先级队列。
- 在
-
基于条件的事件
- 使用
Decision模块,当一个实体到达时,可以根据其属性或系统状态(如队列长度)来决定其下一步路径,VIP顾客直接进入服务,普通顾客进入排队。
- 使用
-
资源
Resource和Resource Acquirer/Resource Releaser模块用于管理更复杂的共享资源,一个系统有3名医生,病人需要“获取”一个医生资源才能看病,看完后“释放”该资源。
-
数据导出与分析
Statistics Collector模块可以收集实体属性(如等待时间、服务时间)到 MATLAB 工作区。- 仿真结束后,可以使用 MATLAB 命令进行更深入的分析,如计算标准差、绘制直方图等。
simout模块可以将整个仿真数据导出到工作区。
学习资源推荐
-
官方文档(最重要!)
- MathWorks 官网有最权威、最全面的文档和示例。
- 入口: 在 MATLAB 命令窗口输入
doc simevents或访问 SimEvents Documentation。 - 推荐查看:
Getting Started(入门指南) 和Examples(示例库)。
-
视频教程
- 在 MathWorks 官方 YouTube 频道 搜索 "SimEvents Tutorial",有很多入门和进阶的视频。
- 在 Bilibili 等视频网站搜索 "MATLAB SimEvents",也有许多国内用户分享的教程。
-
书籍
《Discrete-Event System Simulation》 by Jerry Banks, John S. Carson II 等,这是离散事件仿真的经典教材,理论扎实,虽然不专门讲 SimEvents,但其所有理论都适用于 SimEvents 建模。
希望这份教程能帮助你顺利入门 SimEvents!多动手实践,从简单模型开始,逐步尝试更复杂的系统,你会很快掌握它的强大功能。
